Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应本机+;Firestore无限循环,使用挂钩_Reactjs_Firebase_React Native_React Hooks_React Native Firebase - Fatal编程技术网

Reactjs 反应本机+;Firestore无限循环,使用挂钩

Reactjs 反应本机+;Firestore无限循环,使用挂钩,reactjs,firebase,react-native,react-hooks,react-native-firebase,Reactjs,Firebase,React Native,React Hooks,React Native Firebase,刚刚开始学习钩子 我正在从firestore获取数据,并尝试使用钩子将其设置为状态。当我取消对行的注释时,我陷入了一个无限循环。没有错误,但是控制台疯狂地记录了数千次状态 如果你需要更多信息,请告诉我 function Lists(props) { const [lists, setLists] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => {

刚刚开始学习钩子

我正在从firestore获取数据,并尝试使用钩子将其设置为状态。当我取消对行的注释时,我陷入了一个无限循环。没有错误,但是控制台疯狂地记录了数千次状态

如果你需要更多信息,请告诉我

function Lists(props) {

    const [lists, setLists] = useState([])
    const [loading, setLoading] = useState(true)

    useEffect(() => {
        const subscriber = 
            firestore().collection('users').doc(props.user).collection('lists')
              .onSnapshot(QuerySnapshot => {
                  const items = []
                  QuerySnapshot.forEach(documentSnapshot => {
                      items.push({
                          ...documentSnapshot.data(),
                          key: documentSnapshot.id,
                      });
                    //setLists(items)

                    setLoading(false)

                    console.log(lists)
                  })

            })
            // unsubscribe from firestore
            return () => subscriber();
    })

//rest of func..

发生此问题的原因是useEffect被反复调用<如果您熟悉React类组件,则code>useEffect类似于
componentDidMount
componentDidUpdate

因此,无论何时在useEffect中设置状态,都会触发更新,然后再次调用useEffect,从而调用无限循环

为了解决这个问题,useEffect接受一个额外的参数,这是一个依赖项数组,它表示只有当它的一个依赖项发生更改时,才应该重新执行这个
useEffect
调用。在您的例子中,您可以提供一个空数组,告诉react这个useffect应该只调用一次

useffect(()=>{
常数订户=
firestore().collection('users').doc(props.user).collection('list'))
.onSnapshot(QuerySnapshot=>{
常量项=[]
QuerySnapshot.forEach(documentSnapshot=>{
推({
…documentSnapshot.data(),
关键字:documentSnapshot.id,
});
//集合列表(项目)
设置加载(错误)
console.log(列表)
})
})
//从firestore取消订阅
return()=>subscriber();

},[])/发生此问题是因为useEffect会被反复调用<如果您熟悉React类组件,则code>useEffect
类似于
componentDidMount
componentDidUpdate

因此,无论何时在useEffect中设置状态,都会触发更新,然后再次调用useEffect,从而调用无限循环

为了解决这个问题,useEffect接受一个额外的参数,这是一个依赖项数组,它表示只有当它的一个依赖项发生更改时,才应该重新执行这个
useEffect
调用。在您的例子中,您可以提供一个空数组,告诉react这个useffect应该只调用一次

useffect(()=>{
常数订户=
firestore().collection('users').doc(props.user).collection('list'))
.onSnapshot(QuerySnapshot=>{
常量项=[]
QuerySnapshot.forEach(documentSnapshot=>{
推({
…documentSnapshot.data(),
关键字:documentSnapshot.id,
});
//集合列表(项目)
设置加载(错误)
console.log(列表)
})
})
//从firestore取消订阅
return()=>subscriber();
}, []) //