setState 在 useEffect 钩子中不起作用

时间:2021-07-13 10:35:34

标签: reactjs firebase react-hooks use-effect use-state

我从我的 firebase 实时数据库中获取了一些数据,这些数据在我的 useEffect 钩子函数中作为对象返回。我想将这些数据映射到 UI 中的不同行。但问题是当我尝试通过在 setState() 函数中传递获取的数据来设置组件中的 setState 时,它​​返回一个空对象。我试图将获取的数据对象转换为数组,然后设置状态,但 console.log(state) 仍然显示一个空数组。当我使用状态作为依赖项(useEffect 中的第二个参数)时,它返回状态的无限循环。代码看起来像这样-

const ToDoList = () => {
   const [toDo, setToDo] = useState([])

   useEffect(() =>  {
    const fetchData = async () => {
      try{
        toDoListRef.on('value', snapshot => {
          const fetchedPostObject = snapshot.val()
          console.log(fetchedPostObject) // shows fetched data in the object form
          var fetchedPostArr = []
          fetchedPostArr = Object.entries(fetchedPostObject)
          setToDo(fetchedPostArr)
          console.log(toDo)   // []
        })
      }catch(err){
        console.log(err)
      }
    }
    fetchData()
  }, [])
}

如果我不将获取的对象转换为数组,那么它返回一个空对象,如果我再次使用依赖项,它返回一个无限状态。

2 个答案:

答案 0 :(得分:0)

您不会在 setState 之后获得更新的值,因为它是异步的。相反,你可以尝试这样的事情

useEffect (() => {console.log(toDo)},[toDo])

此挂钩侦听 toDo 的任何更新值,并在 toDo 的值更新时执行。

答案 1 :(得分:0)

首先,您必须了解为什么要使用 useEffect 钩子?在组件的当前状态下执行一些副作用(在您的情况下从 firebase 获取数据)。现在,如果您尝试更改 useEffect 钩子内的状态,该状态将始终相同(useEffect 内的初始状态,这就是 useEffect 旨在用于) 但在 useEffect 之外,您将看到组件的状态已更改。

val subject = PublishSubject.create<Any>()
val observable = subject.hide()

因此,您的组件的状态已更新,但在 useEffect 中,您始终会看到与之前相同的状态。