4 回答

TA貢獻1780條經驗 獲得超5個贊
下面是該decrement函數的外觀。這需要id, 循環遍歷所有todos. 如果 atodo與提供的不匹配,id請保持原樣。如果確實匹配,則創建對象的淺表副本 ( ) 并使用更新后的值{...todo}覆蓋該屬性。timeRequired
const decrement = (id) => setTodos((todos) => todos.map((todo) => {
if (todo.id != id) return todo;
return {...todo, timeRequired: todo.timeRequired - 1};
}));
請注意,順序{...todo, timeRequired: todo.timeRequired - 1}很重要。通過放置在它將覆蓋現有屬性timeRequired: todo.timeRequired - 1之后。...todo就像 object{a: 1, b: 2, a: 3}會把 object 留給你一樣{a: 3, b: 2},因為 key 的第二個定義a覆蓋了第一個。

TA貢獻1789條經驗 獲得超10個贊
你可以這樣試試
const decrement = (id) => {
const targetTodo = todos.find(x => x.id == id); //get the todo
const currentTime = targetTodo.timeRequired -1 //decrease the time
const newTodo = { ...targetTodo , timeRequired : currentTime } // create new todo object
const newTodoList = todos.map( item => { // finally replace the old todo object
if(item.id = id) return newTodo
else return item;
})
setTodos(newTodoList)
}

TA貢獻1848條經驗 獲得超2個贊
識別數組中的元素后,從 todo 創建一個具有遞減timeRequired屬性的新對象。然后使用.slice在新項前后對數組進行切片,新項在中間:
const decrement = (i) => {
const replacedTodo = {
...todos[i],
timeRequired: todos[i].timeRequired - 1,
};
setTodos(
todos.slice(0, i),
replacedTodo,
todos.slice(i + 1),
);
};
{todos.map(({ text, id, timeRequired }, i) => (
// ...
<button onClick={() => decrement(i)}> Decrement ? </button>
.map直接使用函數中的索引比稍后從 ID 中查找匹配元素更容易。

TA貢獻1836條經驗 獲得超5個贊
嘗試這個...
const removeTodo = (id) => setTodos((todos) => todos.filter((todo) => todo.id !== id ))
const decrement = (id) => setTodos((todos) => todos.map((todo) => {
const {
id: oldID,
timeRequired,
} = todo;
return {
...todo,
timeRequired: id===oldID? timeRequired-1 : timeRequired,
};
}));
添加回答
舉報