【发布时间】:2019-07-17 13:06:49
【问题描述】:
我的初始状态为
sites = [
{id, name, vehicles[], drivers[]},
{id, name, vehicles[], drivers[]},
{id, name, vehicles[], drivers[]},
{id, name, vehicles[], drivers[]},
];
当从组件 SiteVehcleSelection 中的列表中选择车辆时,我正在尝试将车辆添加到给定站点,并且处理选择的方法是:
handleVehicleSelection = (event) => {
const vehicle = this.props.vehicles.find((v) => v.id === parseInt(event.target.dataset.id, 10));
this.props.handleVehicleSelection(event, this.state.site.id, {...vehicle});
};
将其传递给父 SiteList 方法:
handleVehicleSelection = (event, siteId, vehicle) => {
this.props.dispatch(siteActions.handleVehicleSelect(siteId, vehicle), event.target.checked);
}
从 SiteList 类调用:
export function handleVehicleSelect(siteId, vehicle, cmd){
return (dispatch) => {
debugger;
return fetch(`${BASE_URL}/accounts/site-vehicle-action/${siteId}/${vehicle.id}/${cmd}`, {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: ''
}).then((res) => {
return res.json();
}).then((json) => {
if (json.msg === true) {
dispatch(vehicleSelect(siteId, vehicle));
}
});
}
}
发送到这个:
export function vehicleSelect(siteId, vehicle){
return {type: actionTypes.ADD_VEHICLE_TO_SITE, siteId, vehicle};
}
我的减速器是:
case actionTypes.ADD_VEHICLE_TO_SITE:
debugger;
const siteIndex = state.findIndex((site) => site.id === action.siteId);
console.log(state);
const newState = [...state.slice(0, siteIndex), {...state[siteIndex], vehicles: [...state[siteIndex].vehicles, action.vehicle],}, ...state.slice(siteIndex +1)];
console.log(newState);
return newState;
当我在更改发生之前和之后登录时,车辆已添加到正确的站点但它没有在视图中显示/刷新这里是之前和之后状态的记录。
更改前:
0: {drivers: Array(0), id: 1, name: "Site One", vehicles: Array(0)}
1: {drivers: Array(0), id: 2, name: "Site Two", vehicles: Array(0)}
2: {drivers: Array(0), id: 3, name: "Site Three", vehicles: Array(0)}
length: 3
__proto__: Array(0)
改动后:
0: {drivers: Array(0), id: 1, name: "Site One", vehicles: Array(1)}
1: {drivers: Array(0), id: 2, name: "Site Two", vehicles: Array(0)}
2: {drivers: Array(0), id: 3, name: "Site Three", vehicles: Array(0)}
length: 3
__proto__: Array(0)
可以看到第一个已正确添加车辆,这是新状态,但返回时没有任何反应,好像站点列表没有刷新一样。
希望这个编辑有助于解释更多。
【问题讨论】:
-
你不能对你的状态做一个深拷贝,修改复制的状态并返回它吗?状态应该是不可变的。
-
是否要将新对象添加到
items1数组中?据我所知,你没有这样做。您能否通过action或至少action.site提供您的初始状态和期望状态? -
是的,我想在 items1 数组中添加一个新对象。
-
您能给我们举个具体的例子吗?您可以更新您的问题。只需提供初始/所需状态和您的操作即可。
-
我仍然看不到具体的例子。初始/所需状态和您传递的操作对象。请为您的数据提供简单的示例。
标签: javascript reactjs ecmascript-6 redux