我有一个React组件John'
,我这样称呼它:
根据我收到的新AttributeSingleChoice
,我想改变其状态,如下所示:
props
但是,如果我使用componentWillReceiveProps: function() {
var attributeTypes = this.selectAttributes();
this.setState({
singleChoiceAttributes: attributeTypes});
},
selectAttributes: function() {
return this.props.classification.attributes.map(function (elem) {
if(elem.attributeType == "A") {
return {description: elem.description, name: elem.name}
}
}).filter(Boolean);
},
,componentWillReceiveProps
会记住旧的state.props
,而不是新的props
。
我尝试使用componentWillUpdate
,但我无法在componentWillUpdate
内设置状态。
如何根据新道具更改组件的状态?
答案 0 :(得分:3)
componentWillReceiveProps
hook将新道具作为参数传递。
componentWillReceiveProps: function(newProps) {
newProps !== this.props
}
您可以在selectAttributes
功能上接受带参数的备用道具。
selectAttributes: function(props) {
// fallback to regular props if nothing passed
props = props || this.props;
return props.classification.attributes.map(function (elem) {
// ...
}).filter(Boolean);
}
然后在新道具可用时传递它们。
componentWillReceiveProps: function(newProps) {
var attributeTypes = this.selectAttributes(newProps);
this.setState({
singleChoiceAttributes: attributeTypes
});
}
答案 1 :(得分:1)
您的componentwillrecieveprops标头不正确。你应该为nextProps接受一个参数,它将包含传入的props。然后根据nextProps设置你的状态变量。 http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops
答案 2 :(得分:0)
您需要将nextProps
传递给您的函数:
componentWillReceiveProps: function( nextProps ) {
var attributeTypes = this.selectAttributes( nextProps );
this.setState({
singleChoiceAttributes: attributeTypes});
},
selectAttributes: function( nextProps ) {
var props = nextProps || this.props;
return props.classification.attributes.map(function (elem) {
if(elem.attributeType == "A") {
return {description: elem.description, name: elem.name}
}
}).filter(Boolean);
},