【发布时间】:2016-10-17 06:04:11
【问题描述】:
我在单击按钮时调用了handleSelection 方法,但是,如果我单击按钮,一旦状态未设置为this.setState({selectedFoods: newSelections});。该方法中的其他所有内容都正确执行(正如我的各种 console.logs 告诉我的那样:))。第二次单击该按钮时,方法中的所有内容都会再次执行,setState 可以正常工作。
var Flavor = React.createClass({
getInitialState: function() {
return { foods: {}, selectedFoods: [], affinities: [] };
},
componentDidMount: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({foods: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
componentDidUpdate: function () {
$('#select-food').selectize({
onChange: this.handleSelection
}
);
},
handleSelection: function (e) {
if (e.target) {
var selectedFood = e.target.id;
} else {
var selectedFood = e;
}
console.log(selectedFood);
if (this.state.foods[selectedFood]) {
var selections = this.state.selectedFoods;
var newSelections = selections.concat(selectedFood);
console.log("newSelections: "+newSelections)
var state = Object.assign(this.state, {selectedFoods: newSelections});
this.setState(state);
console.log("state: "+this.state.selectedFoods)
this.handleAffinities();
} else {
console.log("** "+selectedFood+" **");
}
},
handleAffinities: function() {
console.log("selectedFoods: "+this.state.selectedFoods.length)
if (this.state.selectedFoods.length > 0) {
var allAffinities = this.state.selectedFoods.map((food) => {
return this.state.foods[food];
});
console.log(allAffinities.length);
console.log(allAffinities);
var commonAffinities = allAffinities[0];
allAffinities.forEach((affinities) => {
commonAffinities = commonAffinities.filter((n) => {
return affinities.indexOf(n) != -1;
});
})
this.setState({affinities: commonAffinities});
} else {
this.setState({ affinities: [] });
}
},
handleRemove: function(food) {
var selectedFoods = this.state.selectedFoods;
var index = selectedFoods.indexOf(food);
var updatedSelection = selectedFoods.splice(index, 1);
this.setState({selectedFoods: selectedFoods});
this.handleAffinities();
},
为什么除了我的setState 函数之外的所有东西第一次都能正确执行?为什么它在第二次点击时起作用?
【问题讨论】:
-
您的
if (this.state.foods[selectedFood])是否因某种原因无效?也许this.state.foods第一次还是空的还是类似的? -
您的
getInitialState函数中有什么?你可以发布整个组件,也许在 JSFiddle 中? -
谢谢,我把所有东西都加到了 render 方法中
-
我可以通过替换它来让它工作:
var state = Object.assign(this.state, {selectedFoods: newSelections}); this.setState(state);
标签: javascript reactjs setstate