这很简单,当您按下“添加”时,它应该添加(然后添加),而当您按下“删除”时,它应该弹出最后一个元素并重新呈现列表,但不是。我在某个地方犯了错误?
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;
更新: 实际上,它通过删除最后一个元素来更新状态,但是只有在按下“添加”按钮时才会重新渲染
答案 0 :(得分:1)
不建议修改状态本身,因为它是不可变的。
因此,而不是在数组的原始状态上使用.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);
我希望这会有所帮助!
答案 1 :(得分:0)
在这种情况下,您需要设置一个新数组,setList(list)
不会导致React重新渲染,因为它仍然与您使用的数组相同。
在setList([...list])
函数中尝试remove
。
还有pop
的另一种选择,它不会变异原始变量:
const remove = () => {
const [removed, ...newList] = list
setList(newList)
}