【问题标题】:UI not re-rendering on state update using React Hooks and form submissionUI 未使用 React Hooks 和表单提交重新渲染状态更新
【发布时间】:2019-09-15 07:01:45
【问题描述】:

我正在尝试使用 React Hooks 和表单来更新 UI。我设置了一个状态来监视表单上的值,当我单击提交时,我想将此值添加到一个数组(保持状态)并将其显示在 UI 上。我的问题是,当我提交值时,虽然它已添加到数组中(并且状态已更新),但 UI 仅在我更改输入中的值时才会更新。

我的组件如下:

const PushToArrayUpdateState = () => {

    const [array, setArray] = useState([]);
    const [formVal, setFormVal] = useState(``);

    const handleSubmit = event => {
        event.preventDefault();
        let updateArray = array;
        updateArray.push(formVal);
        console.log(updateArray);
        setArray(updateArray);
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <input type="text" name="arrayVal" onChange={e => setFormVal(e.target.value)} />
                <input type="submit" value="Submit" />
            </form>
            <div>
                {array.map((val, index) => <p key={index}>{val}</p>)}
            </div>
        </div>
    );
};

您还可以在以下位置看到此 [not] 工作: https://codesandbox.io/s/p3n327zn3q

对于为什么 handleSubmit 函数中的 setArray 不会自动导致组件重新渲染,有人有任何建议吗?

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    代替

    let updateArray = array;
    

    试试这个:

    const updateArray = [...array];
    

    https://codesandbox.io/embed/qxk4k3zmzq

    因为 JS 中的数组是引用值,所以当你尝试使用 = 复制它时,它只会复制对原始数组的引用。

    【讨论】:

    【解决方案2】:

    同样的表现可能会发生类似的错误:

    const [bought, setBought] = useState([])
    
    ...
    
    
    bought.push(newItem)
    setBought(bought)
    

    要解决此问题,您需要使用

    const newBought = [...bought, newItem] <- new reference
    setBought(newBought) 
    

    【讨论】:

    • 这正是原因。很好的解释!非常感谢蒂姆!
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2019-08-08
    • 2020-01-13
    • 2019-07-28
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多