【问题标题】:The set method in useState variable not updating the state variable [duplicate]useState 变量中的 set 方法不更新状态变量 [重复]
【发布时间】:2021-09-29 11:21:53
【问题描述】:

我正在开发一个具有聊天功能的应用程序。当来自新用户的聊天进入时,存储将更新所有聊天的数组,并且该数组将作为道具传递给子组件。每当 chats 数组更新时,子组件都会运行 useEffect 来执行某些功能。我在子组件中有以下代码来检测聊天数组中的更新:

const App = (props: propsData) => {
let [filtered, setFiltered] = useState([])
let [chats, setChats] = useState({active: [], inactive: []})

  useEffect(()=>{  
    const temp: any = {active: [], inactive: []};
    props.payload.conversations.forEach((element: any) => {
        const status = element.status.toLowerCase(); // element.status can be 'Active' or 'Inactive'
        temp[status].push(element);
            
    });
    console.log(temp) // prints expected output: {active: [some array], inactive: [some array]}
    
    setChats(temp); // this doesn't set the value to 'chats'
    
    console.log(chats) // prints {active: [], inactive: []}
    
    filterChats(); // function combines together the 'active' and 'inacive' arrays in 'chats' 
                   // object to assign to 'filtered' array.
  }, [props.payload.conversations.length])

  return(
    <div>
      {
        filtered.map((item: any) => (
          <div>
            //display item data here
          </div>
        )
        )
    </div
  )
}
export default App;

我的问题是 setter 函数 setChats(temp) 没有设置 chats 的值,如果我明确地将其分配为 chats=temp 它可以工作,但 setter 方法不起作用。我试过不提供任何默认的favlue,类型转换以及提供默认值,但没有任何效果。

【问题讨论】:

  • 你如何使用聊天变量?
  • @Roberto Zvjerković 没什么复杂的。如果我只需要显示活动或非活动聊天,我将 chats.activechats.inactive 分配给 filtered

标签: reactjs typescript react-hooks use-state


【解决方案1】:

setState 是一个异步函数。
因此,在设置后立即添加 console.log(state) 很可能会显示前一个值,因为在运行 log 命令之前它实际上并没有完成状态更新。
您可以做的是添加一个具有相关状态的useEffect 作为依赖项来检查值。

即-

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

【讨论】:

  • 哦,哇,我觉得自己很愚蠢。所以setChats 更新chats 和从useEffect 调用的filterChats 函数更新我在jsx 中循环的filtered。正如你所说,我为chats 创建了另一个效果,在其中我调用了filterChats。谢谢!
猜你喜欢
  • 2021-01-12
  • 2021-06-08
  • 2020-08-31
  • 2021-12-13
  • 2022-10-14
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多