bar*_*lle 13 reactjs react-props
我试图检测道具何时在已componentDidUpdate安装组件内发生变化。我有一个测试(refreshData在下面的代码中)工作正常。是否有可能以一种未被检测到的方式传递道具componentDidUpdate(prevProps)?
在 component.js 中:
componentDidUpdate(prevProps){
//works fine
if ( this.props.refreshData !== prevProps.refreshData ) {
if ( this.props.refreshData )
this.refreshData();
}
//these two arent calling
if ( this.props.selectedCountries !== prevProps.selectedCountries ) {
if ( this.props.selectedCountries )
console.log('updated selected countries');
}
if ( this.props.selectedLocations !== prevProps.selectedLocations ) {
console.log('updated selected locations');
}
}
Run Code Online (Sandbox Code Playgroud)
并在 App.js 中传递如下道具:
selectLocation = (id, type, lng, lat, polydata, name, clear = false) => {
//console.log(type);
//console.log(lng);
//console.log(lat);
//console.log(polydata);
let selectedType = 'selected' + type;
let previousState = [];
if (clear) {
this.setState({
selectedCountries: [],
selectedLocations: [],
selectedServices: [],
selectedPoints: [],
mapCenter: [lng, lat],
locationGeoCoords: [polydata]
})
previousState.push(id);
} else {
previousState = this.state[selectedType];
if (previousState.indexOf(id) === -1) {
//push id
previousState.push(id);
} else {
//remove id
var index = previousState.indexOf(id)
previousState.splice(index, 1);
}
}
if (type === "Countries") {
this.setState({
selectedCountries: previousState,
refreshData: true,
})
} else if (type === "Locations") {
this.setState({
selectedLocations: previousState,
refreshData: true
})
} else if (type === "Points") {
this.setState({
selectedPoints: previousState,
refreshData: true
})
}
}
render() {
return (
<component
selectedCountries={this.state.selectedCountries}
selectedLocations={this.state.selectedLocations}
refreshData={this.state.refreshData} />
}
}
Run Code Online (Sandbox Code Playgroud)
Ros*_*son 15
您好 :) 正如我在评论中指出的,问题出在您的 App.js 文件中 - 您正在改变一个数组。换句话说,当您认为您正在创建一个新的选定国家/地区数组以进行传递时,您实际上是在更新原始数组,因此当您进行比较时,您总是在比较两个完全相同的数组。
尝试像这样更新你的 App.js -
selectLocation = (id, type, lng, lat, polydata, name, clear = false) => {
//console.log(type);
//console.log(lng);
//console.log(lat);
//console.log(polydata);
let selectedType = 'selected' + type;
let previousState = [];
if (clear) {
this.setState({
selectedCountries: [],
selectedLocations: [],
selectedServices: [],
selectedPoints: [],
mapCenter: [lng, lat],
locationGeoCoords: [polydata]
})
previousState.push(id);
} else {
previousState = [].concat(this.state[selectedType]);
if (previousState.indexOf(id) === -1) {
//push id
previousState.push(id);
} else {
//remove id
var index = previousState.indexOf(id)
previousState.splice(index, 1);
}
}
if (type === "Countries") {
this.setState({
selectedCountries: previousState,
refreshData: true,
})
} else if (type === "Locations") {
this.setState({
selectedLocations: previousState,
refreshData: true
})
} else if (type === "Points") {
this.setState({
selectedPoints: previousState,
refreshData: true
})
}
}
render() {
return (
<component
selectedCountries={this.state.selectedCountries}
selectedLocations={this.state.selectedLocations}
refreshData={this.state.refreshData} />
}
}Run Code Online (Sandbox Code Playgroud)
唯一的区别是您设置的行previousState- 我将其更新为
previousState = [].concat(this.state[selectedType]);
通过添加[].concatI 每次都有效地创建一个新数组,因此当您通过push/splice将更改应用于数组时,您将只修改新数组。然后,一旦您将其作为道具传递,比较就会正常工作:)
为了你的阅读兴趣,我找到了一篇关于这个的帖子:https : //medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c
| 归档时间: |
|
| 查看次数: |
27174 次 |
| 最近记录: |