更新道具(对象列表)后不渲染

时间:2018-08-20 07:04:25

标签: javascript reactjs react-redux

我在redux(对象列表)中有状态,并且我有一个动作将空白对象添加到列表中。但是每当我分派动作时,React都不会响应更改后的道具。我尝试在componentDidUpdate中登录控制台,shouldComponentUpdate并没有记录更改的道具。

这是动作

function addNewBlankObject() {
  const newBlankObject= {
    field1: "",
    field2: ""
  }
  return {type:'ADD_BLANK_OBJECT', newBlankObject: newBlankObject}
}

这是减速器

case 'ADD_BLANK_OBJECT':
      var listOfObject = state.listOfObject;
      listOfObject.push(action.newBlankObject);
      return state;

这是redux道具映射器

function mapStateToProps(state) {
  console.log(state.listOfObject); //check if state updated
  const listOfObject = state.listOfObject;
  return {
    listOfObject,
  }
}

export default connect(mapStateToProps)(AComponent);

我尝试用上述方法记录道具,它确实更新了状态,将空白对象添加到列表中,因此道具被更改了吗?为什么React没有回应?是因为状态是数组吗?

3 个答案:

答案 0 :(得分:2)

状态引用未更改。它保持不变。 Redux进行浅层比较以决定是否更新状态。

Reducer中的状态更新应该是这样的。

case 'ADD_BLANK_OBJECT':

      return [
        ...state.listOfObject,action.newBlankObject
      ]

请找到more here

答案 1 :(得分:1)

在化简器中返回新对象,而不对现有对象进行突变。

答案 2 :(得分:0)

您应该使用componentWillReceiveProps,始终将具有更新的redux状态置于组件状态,并与componentWillReceiveProps一起更新状态。

class AComponent extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = {
            listOfObject: props.listOfObject
        };
    }

    componentWillReceiveProps(nextProps) {
        let state = this.state;
        state.listOfObject = nextProps.listOfObject;
        this.setState({ state });
    }

    render() {
        return (
            <div></div>
        );
    }
}

function mapStateToProps(state) {
    console.log(state.listOfObject); //check if state updated
    const listOfObject = state.listOfObject;
    return {
      listOfObject,
    }
  }

  export default connect(mapStateToProps)(AComponent);