reactjs - ReactJS中useState Hooks的基础实现示例
问题描述
我们知道useState钩子用于管理 ReactJs 中功能组件内的状态。
因此,出于学习目的,我正在实现 useState 钩子的示例(下面给出了代码片段),其中我采用了一个具有一些初始值的数组,并且我需要更新数组并在每次单击时在浏览器中显示整个更新后的数组按钮。我尝试使用下面的代码段,但没有得到预期的结果。
问题:当我第一次单击按钮时,它会在数组中添加新元素,但在单击按钮两次或更多次后,它只会覆盖最后一个元素。
预期结果:应该在数组中添加新元素,而不是覆盖数组中的最后一个元素。
在这个例子中,我肯定错过了 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>
解决方案
使用状态newArray
而不是array
实现map
。array
将[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>
推荐阅读
- angular - Angular 将服务限制为仅一个组件树
- javascript - 带有对象数组的 ReactJS(逐个字符搜索)
- python - 如何修复我的错误处理代码?(tkinter 图形用户界面)
- laravel - 另一个表中的列总和 - laravel
- python - 我可以从 python 程序自动化这个经过 twilio 验证的电话号码列表吗
- python - 条带更新订阅python
- excel - 如何停止 Excel VBA workbook_open 事件?
- python - 无法覆盖 __str__ 方法
- c - 将文件作为命令行参数传递不会在 CLion 中注册为路径
- haskell - 用 Haskell 中的字符串替换字符串中的每个数字