React native React Native Redux-从预填充的数据分配状态属性
我是Redux新手,反应很自然,如果我犯了一个明显的错误,我向你道歉 在我开始讨论我遇到的错误之前,这里有一些背景知识 我有一个状态和一个数据库(SQLite)。我有一个实例,其中我需要擦除状态并从数据库中重新填充状态。我已经收集并解析了数据库中的数据,只需要将其添加到状态 细节:我在数据库中有一个对象列表(我们称之为汽车),每个对象都有自己的属性。我创建了一个汽车列表并通过了它。收到后,我创建了一个“假状态”(只是空的初始状态),并通过添加到汽车列表中对其进行了修改,因为我知道不应该修改实际状态 然后我试着把新车财产归还给州政府 我得到一个错误声明:TypeError:assign的一个源在原型链上有一个可枚举键。您正在尝试分配原型属性吗?我们不允许这样做,因为这是一个我们不支持的边缘案例。此错误是一个性能优化错误,不符合规范 我是否理解这一点,即我不能像我正在尝试的那样分配redux状态属性React native React Native Redux-从预填充的数据分配状态属性,react-native,redux,React Native,Redux,我是Redux新手,反应很自然,如果我犯了一个明显的错误,我向你道歉 在我开始讨论我遇到的错误之前,这里有一些背景知识 我有一个状态和一个数据库(SQLite)。我有一个实例,其中我需要擦除状态并从数据库中重新填充状态。我已经收集并解析了数据库中的数据,只需要将其添加到状态 细节:我在数据库中有一个对象列表(我们称之为汽车),每个对象都有自己的属性。我创建了一个汽车列表并通过了它。收到后,我创建了一个“假状态”(只是空的初始状态),并通过添加到汽车列表中对其进行了修改,因为我知道不应该修改实际状
const initialState = {
cars: [],
selectedDevice: null,
};
const getNewCarList = async (previousState) => {
const carList = await DBProvider.callQueryDB();
const carListLength = carList.length;
let newState = previousState;
for (let i = 0; i < carListLength; i += 1) {
newState = {
...newState,
cars: newState.car.concat({
carName: carList[i].carName,
carID: carList[i].carID,
}),
};
}
return newState;
};
const refreshStore = async (state = initialState, action) => {
switch (action.type) {
case REFRESH_STORE: {
const newCarState = await getNewCarList(initialState).then(newState => newState);
return {
...state,
car: newCarState.cars,
};
}
default:
return state;
}
};
const initialState={
汽车:[],
所选设备:空,
};
常量getNewCarList=async(以前的状态)=>{
const carList=await DBProvider.callQueryDB();
常数卡里斯特长度=卡里斯特长度;
让newState=previousState;
对于(设i=0;i{
开关(动作类型){
案例库:{
const newCarState=等待getNewCarList(initialState)。然后(newState=>newState);
返回{
……国家,
汽车:newCarState.cars,
};
}
违约:
返回状态;
}
};
搜索该错误消息时出现,链接到。这似乎是一个React本机特有的排序问题,它是API调用和spread运算符使用的组合
除此之外,您的代码还有两个主要问题:
- 您正在减速器中进行异步调用,这是您永远不应该做的
- 可以简化API响应中列表的处理
// Handle the request in a thunk function
function getNewCarList() {
return async (dispatch) => {
const carList = await DBProvider.callQueryDB();
// dispatch an action containing the cars array
dispatch({
type : "REFRESH_STORE",
payload : {
cars : carList
}
});
}
}
function carsReducer(state = initialState, action) {
switch(action.type) {
case "REFRESH_STORE" : {
// the reducer just returns a new state value with the new array
return {
...state,
cars : action.payload.cars
}
}
default : return state;
}
}
谢谢你的回复!我正在尝试您的方法,但我得到一个错误,即操作必须是普通对象,并且自定义中间件必须用于异步操作。这就是thunk的用途吗?是的,假设您已经配置了
redux-thunk
中间件。谢谢!我让它与稍微修改过的代码一起工作(当然是为了适应我的情况)。