Я все еще пытаюсь понять жизненный цикл реагирующего компонента и где/когда нужно делать вызовы. У меня есть следующий код, где мне нужно обновить два элемента состояния на основе действия дочернего компонента, связанного с родительским методом. Каков наилучший способ сделать это? Я по существу стараюсь придерживаться всех моих манипуляций с данными и логики в родительском/контейнере как можно больше.Задать данные родительского компонента refetch
Я получаю сообщение об ошибке: Uncaught TypeError: Cannot read property 'state' of undefined(…)
в адресе acios вызова. Я хочу знать, как устранить ошибку, а также то, что это лучший способ сделать это. Где я должен позвонить, чтобы обновить данные каждый раз, когда выбранный год изменен?
import React from 'react';
import axios from 'axios';
import MonthView from './MonthView.js';
class MonthViewContainer extends React.Component {
constructor() {
super();
this.state = {
data: [],
selectedYear: 2016
}
this.handleAddYear = this.handleAddYear.bind(this);
this.handleSubtractYear = this.handleSubtractYear.bind(this);
}
componentDidMount() {
var self = this;
var defaultYear = this.state.selectedYear
axios.get('http://localhost:3001/api/transfilter?year=' + defaultYear + '&grouping=2')
.then(function (response) {
console.log(response);
self.setState({data: response.data});
})
.catch(function (error) {
console.log(error);
});
}
render() {
return <MonthView data={this.state.data} selectedYear={this.state.selectedYear} onAddYear={this.handleAddYear} onSubtractYear={this.handleSubtractYear} />;
}
handleAddYear() {
const newyear = this.state.selectedYear + 1;
this.setState({selectedYear: newyear}, function() {
console.log(this.state.selectedYear);
});
getTransactions();
}
handleSubtractYear() {
const newyear = this.state.selectedYear - 1;
this.setState({selectedYear: newyear}, function() {
console.log(this.state.selectedYear);
});
getTransactions();
}
}
function getTransactions(){
var self = this;
axios.get('http://localhost:3001/api/transfilter?year=' + this.state.selectedYear + '&grouping=2')
.then(function (response) {
console.log(response);
self.setState({data: response.data});
})
.catch(function (error) {
console.log(error);
});
}
export default MonthViewContainer;
Спасибо. Это сработало. Раньше я настраивал это, но проблема заключалась в том, что я не предоставлял правильный контекст для вызова getTransactions. Кроме того, я планирую перейти к шаблону Flux, но, поскольку я просто учился, я хочу получить прочную ручку основ и совершить такие ошибки, прежде чем получить более «продвинутый». –
Я не знаю, правильно ли это задать, но каковы отрицательные голоса по этому вопросу? Это из-за плохого форматирования? –