为什么以下反应功能组件无法正常工作?

时间:2020-05-09 11:29:59

标签: javascript reactjs react-hooks

这很简单,当您按下“添加”时,它应该添加(然后添加),而当您按下“删除”时,它应该弹出最后一个元素并重新呈现列表,但不是。我在某个地方犯了错误?

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;

更新: 实际上,它通过删除最后一个元素来更新状态,但是只有在按下“添加”按钮时才会重新渲染

2 个答案:

答案 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)
  }
相关问题