【问题标题】:Basics implementation example of useState Hooks in ReactJSReactJS中useState Hooks的基础实现示例
【发布时间】:2020-09-23 09:17:35
【问题描述】:

我们知道 useState 钩子用于管理 ReactJs 中功能组件内的状态。

因此,出于学习目的,我正在实现 useState 钩子的示例(下面给出了 sn-p),其中我采用了一个具有一些初始值的数组,我需要更新数组并在每当我点击按钮时浏览器。我尝试了下面的 sn-p 但没有得到预期的结果。

问题:当我第一次单击按钮时,它会在数组中添加新元素,但在单击按钮两次或更多次后,它只会覆盖最后一个元素。

预期结果:应该在数组中添加新元素,而不是覆盖数组中的最后一个元素。

在这个例子中,我肯定错过了 useState 钩子的任何逻辑或任何重要概念。请帮助我了解有关 React Hooks 的更多信息。

const {useState} = React;

const Example = () => {
    const array = [1,2,3] ;
    const [newArray,setNewArray] = useState(array);
    const [newElement,setElement]= useState(array[array.length-1]);

    const handleBoth = () => {
        setElement(prev => prev + 1);
        setNewArray([...array,newElement]);
    }

    const mapping = newArray.map(element => <li> No. {element}</li>)    

    return (
        <div>
            <ul>
                {mapping}
            </ul>
            <button onClick={handleBoth}>Add</button>
        </div>
    );
};

ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    使用状态newArray 而不是array 实现maparray 将在每次渲染时重新初始化为 [1,2,3]。实际上,您应该只是将 array 常量移到组件之外

    const {useState} = React;
    const array = [1,2,3];
    
    const Example = () => {
        const [newArray,setNewArray] = useState(array);
        const [newElement,setElement]= useState(array[array.length-1]+1);
    
        const handleBoth = () => {
            setElement(prev => prev + 1);
            setNewArray([...newArray,newElement]);
        }
    
        const mapping = newArray.map(element => <li> No. {element}</li>)    
    
        return (
            <div>
                <ul>
                    {mapping}
                </ul>
                <button onClick={handleBoth}>Add</button>
            </div>
        );
    };
    
    ReactDOM.render(
      <Example />,
      document.getElementById("react")
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
    <div id="react"></div>

    【讨论】:

    • 谢谢,你能解释一下之前发生的事情吗?所以下次我会意识到有些东西放错了地方。
    • 是的,问题主要在于您拥有setNewArray([...array,newElement]); 的这一声明。每次重新渲染,React 都会遍历整个组件,所以array 再次被初始化回[1,2,3]。因此,当您调用 setNewArray - 每次调用它时,它只是这样做:setNewArray([1,2,3,newElement]); ... 与使用状态时相比 - 每次组件重新渲染时都不会重新初始化该值,它仅在您初始化时才初始化调用useState,因此状态值将在渲染中持续存在
    • 是的,我现在很清楚之前发生了什么。有点怀疑你为什么在这里添加+1 useState(array[array.length-1]+1);
    • 哦,好的,您的array[1,2,3]。因此array[array.length-1] = 3。但是当您追加到列表时,您不想追加 3,因为这会发生 --> [1,2,3,3]。你想加 4。这就是 array[array.length-1]+1 的正确方程
    最近更新 更多