在 Redux Reducer 中添加 item 2 层级
Adding item 2 levels deep in Redux Reducer
我正在尝试向任务对象添加注释,但到目前为止我已经将它添加到所有任务中。当我尝试不同的方式时,它不会编译。 Object.assign 不喜欢在 .push()
之后出现
当它添加到所有任务时:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
const { notes } = task;
const { text } = action;
notes.push({
text,
id: notes.length,
})
return task.id === action.id ?
Object.assign({}, { task, notes }) : task
})
不编译时:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
return task.id === action.id ?
const { notes } = task;
const { text } = action;
notes.push({
text,
id: notes.length,
})
Object.assign({}, { task, notes }) : task
})
你几乎不想在 reducer 中使用 Array.push()
,因为这会直接改变现有数组,而直接改变通常会破坏 UI 更新(参见 Redux FAQ)。您 可以 在旧数组的 新副本 上使用 push()
,但大多数示例不使用该方法。大多数时候,建议的方法是使用 const newArray = oldArray.concat(newValue)
,其中 returns 包含所有旧项和新项的新数组引用。
除此之外,请记住,在不可变地更新嵌套数据时,每个 级嵌套都需要创建并返回一个副本。
还没有实际测试过这个,但我认为你的代码应该大致像这个例子:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
if(action.id !== task.id) {
return task;
}
const { notes } = task;
const { text } = action;
const newNotes = notes.concat({id : notes.length, text});
const newTask = Object.assign({}, task, {notes : newNotes});
return newTask;
}
default : return tasks;
}
}
我正在尝试向任务对象添加注释,但到目前为止我已经将它添加到所有任务中。当我尝试不同的方式时,它不会编译。 Object.assign 不喜欢在 .push()
之后出现当它添加到所有任务时:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
const { notes } = task;
const { text } = action;
notes.push({
text,
id: notes.length,
})
return task.id === action.id ?
Object.assign({}, { task, notes }) : task
})
不编译时:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
return task.id === action.id ?
const { notes } = task;
const { text } = action;
notes.push({
text,
id: notes.length,
})
Object.assign({}, { task, notes }) : task
})
你几乎不想在 reducer 中使用 Array.push()
,因为这会直接改变现有数组,而直接改变通常会破坏 UI 更新(参见 Redux FAQ)。您 可以 在旧数组的 新副本 上使用 push()
,但大多数示例不使用该方法。大多数时候,建议的方法是使用 const newArray = oldArray.concat(newValue)
,其中 returns 包含所有旧项和新项的新数组引用。
除此之外,请记住,在不可变地更新嵌套数据时,每个 级嵌套都需要创建并返回一个副本。
还没有实际测试过这个,但我认为你的代码应该大致像这个例子:
let taskReducer = function(tasks = [], action) {
switch (action.type) {
case 'ADD_NOTE':
return tasks.map((task) => {
if(action.id !== task.id) {
return task;
}
const { notes } = task;
const { text } = action;
const newNotes = notes.concat({id : notes.length, text});
const newTask = Object.assign({}, task, {notes : newNotes});
return newTask;
}
default : return tasks;
}
}