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 次  |  
        
|   最近记录:  |