javascript React不更新网站

y1aodyip  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(87)

我在react中创建了一个简单的待办事项列表,当我删除一个任务时,它不会立即更新,但是当我在输入中进行更改时,我不知道为什么会发生。试图改变deleteTask的工作方式,但我没有找到解决方案。
form.jsx

import { useState } from 'react';
import './styles/form.css';
import Tasks from './tasks';

function TaskForm() {
  const initialList = [{task: 'Do something', done: false}];
  const [tasks, setTasks] = useState(initialList);
  const [input, setInput] = useState('');
  const [validTask, setValidTask] = useState('valid');
  const addTask = () => {
    if(input.length !== 0) {
      setValidTask('valid');
      setTasks(tasks.push({task: input, done: false}));
      setTasks(tasks);
      setInput('');
    }
    else {
      setValidTask('invalid');
    }
    console.log(tasks);
  }
  return (
    <>
      <div className='maindiv'>
        <p>Task app</p>
        <input maxLength={32} value={input} placeholder='add a new task...' onChange={e => setInput(e.target.value)}/><br />
        <p style={{color: 'red'}} className={validTask}>Task can't be empty</p>
        <input type='submit' value='Add task' onClick={addTask}/>
      </div>
      <Tasks tasks={tasks}/>
    </>
  );
}

export default TaskForm;

tasks.jsx

import { useState } from 'react';
function Tasks(props) {
  const [tasks, setTasks] = useState(props.tasks);
  const deleteTask = (index) => {
    tasks.splice(index, 1);
    setTasks(tasks);
    
  };
  const taskList = props.tasks.map(task => (
    <li key={task.id}>
      <input type='checkbox' value={task.done} /> 
      {task.task}
      <input type='button' value='delete' onClick={() => deleteTask(task.id)} />
    </li>
  ));
  return <ul>{taskList}</ul>;
}

export default Tasks;
yfjy0ee7

yfjy0ee71#

你不是在更新状态,而是在 * mutating * 状态:

tasks.splice(index, 1);
setTasks(tasks);

根据the documentation
splice()方法通过删除或替换现有元素和/或添加新元素来更改数组的内容***。
因此,您不是创建一个新的数组引用,而是修改现有的数组引用并将状态设置回同一引用。由于引用没有改变,React不会看到状态被“更新”。这就是为什么变异状态会导致这样的bug。
创建一个新的数组引用,修改它,然后将状态更新为:

let newTasks = [...tasks];
newTasks.splice(index, 1);
setTasks(newTasks);
7gcisfzg

7gcisfzg2#

你不能像文档中清楚描述的那样在React状态中拼接数组

const deleteTask = (index) => {
    setTasks(tasks => [...tasks.slice(0, index), ...tasks.slice(index+1)]);
};

或使用过滤器:

const deleteTask = (index) => {
    setTasks(tasks => [...tasks].filter((_, i) => i === index));
};

相关问题