我在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;
2条答案
按热度按时间yfjy0ee71#
你不是在更新状态,而是在 * mutating * 状态:
根据the documentation:
splice()
方法通过删除或替换现有元素和/或添加新元素来更改数组的内容***。因此,您不是创建一个新的数组引用,而是修改现有的数组引用并将状态设置回同一引用。由于引用没有改变,React不会看到状态被“更新”。这就是为什么变异状态会导致这样的bug。
创建一个新的数组引用,修改它,然后将状态更新为:
7gcisfzg2#
你不能像文档中清楚描述的那样在React状态中拼接数组
或使用过滤器: