据我了解,这是散布运算符的工作方式:
x=[1,2,3];
y=[...x,4,5];
//这与y = [1,2,3,4,5]
const initialState={
ingredients: [
new Ingredient('Apples', 5),
new Ingredient('Tomatoes', 10),
]
};
export function shoppingListReducer( state=initialState, action:ShoppingListActions.ShoppingListActions ) {
switch(action.type) {
case ShoppingListActions.ADD_INGREDIENT:
return {
...state,
ingredients:[...state.ingredients,action.payload ]
}
default:
return state;
}
在上面的示例中,
return {
...state,
ingredients:[...state.ingredients,action.payload ]
}
评估为?
有效载荷属于成分类型:
export class Ingredient {
constructor(public name: string, public amount: number) {}
}
答案 0 :(得分:1)
基本上,您正在尝试创建具有state
对象的所有属性的对象,并使用ingredients
数组中的所有值以及{{1}覆盖其属性state.ingredients
}。可以这样做以将结果对象的引用与状态对象分开。
action.payload
或者,为了更好地理解它,您可以将其分解为以下内容
var state = {
"someprop" : "somevalue",
"ingredients" : ["a", "b"]
};
var action = {
"payload" : 4
};
var result = {
...state,
ingredients:[...state.ingredients,action.payload ]
};
state.someprop = "somevalue1"; // does not alter result object
state.ingredients.push("c"); // does not alter result object
console.log(result);
注意:如果var result = {...state};
result.ingredients = [...state.ingredients, action.payload];
中存在嵌套对象或state
中存在对象,它们仍将继续共享相同的引用。
答案 1 :(得分:0)
在对象内部使用时,将其视为object.assign。将原始状态添加到对象中,然后添加下一个内容(成分),并在必要时覆盖已经存在的任何内容(成分),等等。