【问题标题】:React state does not re-renderReact 状态不会重新渲染
【发布时间】:2020-01-14 11:50:41
【问题描述】:

请帮忙,我想问一下为什么反应状态没有重新渲染。

控制台显示更新后的状态,但不在渲染中。

我有相同场景的类似代码,这只是为了简化。

       import React, {useState} from "react";

       const [x, setX] = useState([1]);

       const Sample = () => {
        <div>
            hello
            <button onClick={async () => {
                tempX.push(1);
                console.log(tempX)
                await setX(tempX)

            }}>
              x
            </button>
            {x.map( function(z) {return z})}          
         </div>
       }

       export default Sample;

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

如果您最后设置了具有相同值的 setState,则 useState 不会重新渲染。 你正在改变你的数组,这就是重新渲染没有发生的原因。

而且 setState 不返回承诺,所以你不需要 async 和 await。

创建新副本,然后使用扩展运算符调用 setX。

   import React, {useState} from "react";

   const [x, setX] = useState([1]);

   const Sample = () => {
    <div>
        hello
        <button onClick={() => {
            const updated = [...tempX, 1]; // create new copy of your array;
            console.log(updated)
            setX(updated)

        }}>
          x
        </button>
        {x.map( function(z) {return z})}          
     </div>
   }

   export default Sample;

【讨论】:

    【解决方案2】:

    UseEffect- 在第二个参数(在本例中为 [x] 更改)时重新渲染

    我不相信这是你需要的:

    import React, { useState, useEffect } from "react";
    
    
        const Sample = () => {
    
            const [x, setX] = useState([1]);
            const onClick = (push) => { setX([...x, push]); }
    
            const itemsToPush = [5, 2, 3, 4]
    
            useEffect(() => {
                console.log("X changed")
            }, [x])
    
            return (
                <div>
                    hello
                <button onClick={() => onClick(itemsToPush)}>
                        {x}
                    </button>
                </div >
            )
        }
    
        export default Sample;
    

    你好,有人知道如何在onClick函数中按顺序添加数组元素(itemsToPush)吗?

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 2021-05-19
      • 2020-09-05
      • 2022-01-26
      • 1970-01-01
      • 2018-11-29
      • 2020-04-22
      相关资源
      最近更新 更多