带有映射的this.setState自身写入

时间:2017-06-16 01:37:28

标签: reactjs

我在收到数据后尝试在对象数组上使用this.setState,但是,下面的代码只在1个对象上设置状态。我认为这是在写自己。

路径:MongoDB

"careerHistoryPositions": [
    {
      "company": "Company A",
      "title": "Title A",
      "uniqueId": "1497575516964"
    },
    {
      "company": "Company B",
      "title": "Title B",
      "uniqueId": "1497575525034"
    }
  ]

路径:Reactpage

constructor(props) {
    super(props);

    this.state = {
      data: [],
    };
  }

componentWillReceiveProps(nextProps) {
    const profileCandidateCollection = nextProps.profileCandidate;
    const profileCandidateCollectionId = profileCandidateCollection._id;
    const careerHistoryPositions = profileCandidateCollection && profileCandidateCollection.careerHistoryPositions;

    if(careerHistoryPositions) {
      careerHistoryPositions.map((position) =>
      this.setState({
        data: [{
          'position.uniqueId': position.uniqueId || '',
          'position.company': position.company || '',
          'position.title': position.title || ''
        }]
      })
      );
    }
  }

2 个答案:

答案 0 :(得分:1)

请注意,不会立即调用set state,其次,您将使用新状态覆盖数据。其次,设置State多次会重新渲染,这是低效的。

停止覆盖,您可以使用传播运算符。示例:

a = [1,2,3]
b = [...a, 4,5]
//b = [1,2,3,4,5]

所以要将它转换为您的代码,它看起来像这样:

this.setState({
        data: [...this.state.data, {
          'position.uniqueId': position.uniqueId || '',
          'position.company': position.company || '',
          'position.title': position.title || ''
        }]
      })

由于您多次调用状态,因此效率仍然很低。 我会把它改成这样:

if(careerHistoryPositions) {
      const newData = careerHistoryPositions.map((position) =>
      ({
            'position.uniqueId': position.uniqueId || '',
            'position.company': position.company || '',
            'position.title': position.title || ''
      }));
      this.setState({
          data: newData
      })
}

答案 1 :(得分:0)

 if(careerHistoryPositions) { 
    const data = [ ];
    careerHistoryPositions.map((position) =>
    data.push(
{
 'position.uniqueId': position.uniqueId || '',
 'position.company': position.company || '',
 'position.title': position.title || '' 
})
);

     this.setState({ data, }); 
    }

这应该有用..我认为这种方法会更好,而不是在map函数中多次设置状态..