componentWillReceiveProps

componentWillReceiveProps

我正在使用Udemy: The Complete React Native and Redux Course by Stephen Grider学习RN,并且正在使用Firebase创建管理应用程序。

我有来自react-redux库的连接函数,也有mapStateToProps(),因此每次状态更改时,我都会在组件中将它们作为道具接收。

我创建了一个操作来从Firebase数据库中获取数据,我将在componentWillMount()中调用它,但是由于获取数据是异步任务,因此我必须在componentWillReceiveProps()中创建数据源。

但是讲师说我必须在createDataSource()componentWillMount()中都叫我的componentWillReceiveProps()


我不明白为什么!如果我在各州(这是我的员工列表)有任何更改,我将以道具的形式收到它们,因此我认为仅在createDataSource()中调用componentWillReceiveProps()就足够了。

有人可以为我宣布吗?有什么我忘了处理的特殊情况吗?

更新

EmployeeActions.js:

export const employeesFetch = () => {
  const { currentUser } = firebase.auth();

  return dispatch => {
    firebase
      .database()
      .ref(`/users/${currentUser.uid}/employees`)
      .on("value", snapshot => {
        dispatch({ type: EMPLOYEES_FETCH_SUCCESS, payload: snapshot.val() });
      });
  };
};


EmployeeList.js:

  componentWillMount() {
    this.props.employeesFetch();

    this.createDataSource(this.props);
  }

  componentWillReceiveProps(nextProps) {
    this.createDataSource(nextProps);
  }

  createDataSource({ employees }) {
    const ds = new ListView.DataSource({
      rowHasChanged: (r1, r2) => r1 !== r2
    });

    this.dataSource = ds.cloneWithRows(employees);
  }


所以我正在使用ListView来显示我从Firebase获取的员工!如果仅在createDataSource()中使用componentWillReceiveProps()会出现任何问题吗?

最佳答案

我还完成了您提到的Udemy课程,首先我要说的是,不赞成使用componentWillReceiveProps()和componentWillMount()道具,不应再使用它们。在新项目中,建议您使用静态getDerivedStateFromProps()和componentDidUpdate()。官方的React文档将为您提供有关此主题的更多信息。

但是componentWillReceiveProps()仅在初始渲染完成后才被调用,因此,如果您的组件在实例化时未收到支持,则需要在componentWillMount()中进行设置。

编辑
如果您要遵循新的最佳实践,则可以采用以下方法:


在构造函数中进行任何实例化
异步设置需要进入componentDidMount()
静态getDerivedStateFromProps()在每次渲染之前被调用((由于更新,初始渲染并重新渲染))
初始渲染后在道具更新上调用componentDidUpdate()

关于javascript - 与Redux动态数据源 react ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50703571/

10-09 23:26