我想用react UseEffect保存数组数据。 以类为例:
async componentDidMount() {
const users = await AsyncStorage.getItem('users');
if (users) {
this.setState({ users: JSON.parse(users) });
}
}
componentDidUpdate(_, prevState) {
const { users } = this.state;
if (prevState.users !== users) {
AsyncStorage.setItem('users', JSON.stringify(users));
}
}
如何用React钩子实现逻辑?
对于ComponentDidMount
逻辑,可以使用UseEffect
钩子:
useEffect(() => {
const asyncFetch = async () => {
const users = await AsyncStorage.getItem("users");
if (users) {
// setter from useState
setUsers(JSON.parse(users));
}
};
asyncFetch();
}, []);
对于ComponentDidMount
,请将UseEffect
与dep数组和UserEf
引用一起使用。
const prevUsers = useRef();
useEffect(() => {
const prevUsers = prevUsers.current;
// Some equal check function
if (!areEqual(prevUsers, users)) {
AsyncStorage.setItem("users", JSON.stringify(users));
}
prevUsers.current = users;
}, [users]);
请注意,在当前代码中,prevstate.users!==users
总是truley,比较两个对象,在JS中{}!=={}
总是得到true
。
您可以尝试如下所示,您可以在基于函数的组件中使用钩子,而不是在基于类的组件中使用钩子
//state declaration similar to class based component
const [usersdata,setUsers] = useState([]);
const users = await JSON.parse(AsyncStorage.getItem('users'));
//whenever the value of users changes useEffect will reset the value of users in state useEffect handle the lifecycle in function based component
useEffect(()=>{
if(users){
setUsers(JSON.parse(users));
}
},[users])