React native React Native Redux-从预填充的数据分配状态属性

React native React Native Redux-从预填充的数据分配状态属性,react-native,redux,React Native,Redux,我是Redux新手,反应很自然,如果我犯了一个明显的错误,我向你道歉 在我开始讨论我遇到的错误之前,这里有一些背景知识 我有一个状态和一个数据库(SQLite)。我有一个实例,其中我需要擦除状态并从数据库中重新填充状态。我已经收集并解析了数据库中的数据,只需要将其添加到状态 细节:我在数据库中有一个对象列表(我们称之为汽车),每个对象都有自己的属性。我创建了一个汽车列表并通过了它。收到后,我创建了一个“假状态”(只是空的初始状态),并通过添加到汽车列表中对其进行了修改,因为我知道不应该修改实际状

我是Redux新手,反应很自然,如果我犯了一个明显的错误,我向你道歉

在我开始讨论我遇到的错误之前,这里有一些背景知识

我有一个状态和一个数据库(SQLite)。我有一个实例,其中我需要擦除状态并从数据库中重新填充状态。我已经收集并解析了数据库中的数据,只需要将其添加到状态

细节:我在数据库中有一个对象列表(我们称之为汽车),每个对象都有自己的属性。我创建了一个汽车列表并通过了它。收到后,我创建了一个“假状态”(只是空的初始状态),并通过添加到汽车列表中对其进行了修改,因为我知道不应该修改实际状态

然后我试着把新车财产归还给州政府

我得到一个错误声明:TypeError:assign的一个源在原型链上有一个可枚举键。您正在尝试分配原型属性吗?我们不允许这样做,因为这是一个我们不支持的边缘案例。此错误是一个性能优化错误,不符合规范

我是否理解这一点,即我不能像我正在尝试的那样分配redux状态属性

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
中间件。谢谢!我让它与稍微修改过的代码一起工作(当然是为了适应我的情况)。