javascript - 延迟 useEffect 直到 useSelector 从 React Native 中的 Redux 存储中检索数据

标签 javascript reactjs react-native react-redux

我有一个功能性 React 组件 Tasks_1,最初,我想从成功运行的 redux 存储中检索 userId。

之后,我想使用从 redux 存储中检索到的 useEffect 中的 userId 从后端获取数据。

当 useEffect 运行时,它表示从状态 ID 中检索到一个空字符串。在从 useState 设置状态“id”并从存储中检索状态“id”后,如何使 useEffect 运行?

    function Tasks_1 () {
    
    const [id, setId] = useState('');
    
    const userId = useSelector((state) => state.id);
    const [tasks, setTasks] = useState([]);
    
    useEffect(() => {

        setId(userId);
    
        if (id !== '') {
            db.collection('users').doc(id).collection('tasks').onSnapshot((snapshot)=>{
                const tempTasks = [];
                snapshot.forEach(
                   doc => {
                       tempTasks.push(doc.data());
                   }
                )
                setTasks(tempTasks);
            });
        }
    
    }),[id];
    
    return (
        ...

   )

 }

最佳答案

如果你确实按照你的方式工作,你可能会遇到无限循环。使用 setId 更新 id 将导致重新渲染,并且 useEffect 将再次调用,因为您更改了 id 等等......

我相信这会起作用:

const [id, setId] = useState('');

const userId = useSelector((state) => state.id);
const [tasks, setTasks] = useState([]);

useEffect(() => {

      // this will make sure you only set id when userId
      // is a valid value, and it won't reset it every
      // serenader
    if(userId!=='' && id !== userId)
       setId(userId);

    if (id !== '') {
        db.collection('users').doc(id).collection('tasks').onSnapshot((snapshot)=>{
            const tempTasks = [];
            snapshot.forEach(
               doc => {
                   tempTasks.push(doc.data());
               }
            )
            setTasks(tempTasks);
        });
    }

}, [id, userId]);

并且您必须将 userId 添加到数组依赖项中。

关于javascript - 延迟 useEffect 直到 useSelector 从 React Native 中的 Redux 存储中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68822395/

相关文章:

javascript - 如何将游标映射/forEach 与异步内部函数一起使用?

javascript - 使用 ES5/Lodash,如何在不比较整个对象的情况下查找/删除一个数组中不在另一个数组中的对象?

javascript - 错误: cannot read property 'setState' on fetch method

reactjs - 未捕获在状态树中找不到路由器 reducer ,它必须安装在 "router"下

javascript - JS 使用列表中预先排列的数字/字母而不是生成字母/数字?

javascript - 如何修复刷新时的点击事件监听器需要双击才能工作

javascript - react 原生 + react 原生路由器通量 : Why is background color white during transition?

javascript - React Native 中的 alignItems 和 alignSelf 有什么区别?

react-native - React Native 不建议使用 TextInput 发送电子邮件

react-native - 使用 Jest 模拟时找不到模块 'NativeAnimatedHelper'