javascript - 为什么下面的 react 功能组件不能正常工作?
问题描述
这很简单,当您按“添加”时,它应该添加(并且它会添加),当您按“删除”时,它应该弹出最后一个元素并重新渲染列表,但事实并非如此。我在某个地方犯了错误?
import React, { useState, useEffect } from 'react';
const Test = () => {
const [list, setList] = useState([]);
const add = () => {
setList([list.length, ...list]);
}
const remove = () => {
list.pop();
setList(list);
}
useEffect(() => {
console.log(list)
}, [list])
return (<ul>
<button onClick={add}>add</button>
<button onClick={remove}>remove</button>
{list.map(el => <li>{el}</li>)}
</ul>)
}
export default Test;
更新: 实际上它通过删除最后一个元素来更新状态,但重新渲染仅在按下按钮“添加”时发生
解决方案
不建议修改状态本身,因为它是不可变的。
因此,而不是使用.pop()
数组的原始状态,首先我建议克隆那个并从那里删除所需的元素,然后将结果传递给setList()
函数。
请尝试以下操作:
const remove = () => {
const copy = [...list];
copy.pop();
setList(copy);
}
考虑以下几点:
const list = [1,3,5,6,7];
const copy = [...list];
copy.pop();
console.log(list);
console.log(copy);
我希望这有帮助!
推荐阅读
- c# - 使用 Continuation 链接任务的正确方法
- git - 如何列出存储库中的所有提交及其父信息以及使用命令行或 JGit 添加和删除的行?
- json - 无法检索参数输出的值
- java - 如何在android中发送没有键盘的按键动作?
- apache-spark - 在 foreach 中创建数据框的替代方法
- amazon-web-services - 如何将 DynamoDb 迁移到 RDS (Aurora)
- python - 如果文件中不存在,则从字典中写入某个键的值
- javascript - JS日期到ISO字符串奇怪的行为
- rust - 如何在闭包中引用 self
- css - Bootstrap 4 模态样式(FlexBox)在 IE 中不起作用