我正在使用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/