React Native Redux - Назначение свойства состояния из предварительно заполненных данных - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в Redux и React Native, поэтому приношу свои извинения за очевидную ошибку.

Вот немного предыстории, прежде чем я доберусь до ошибки, с которой сталкиваюсь.

У меня есть состояние и база данных (SQLite).У меня есть экземпляр, в котором мне нужно стереть состояние и снова заполнить состояние из базы данных.Я уже собрал и проанализировал данные из базы данных, и мне просто нужно добавить их в состояние.

Особенности: У меня есть список объектов (скажем, автомобилей) в базе данных, каждый со своимисобственные свойства.Я создал список автомобилей и передал это.После получения я создаю «поддельное состояние» (которое является просто пустым начальным состоянием) и изменяю его, добавляя в список автомобилей, поскольку я знаю, что вы не должны изменять текущее состояние.

Затем я пытаюсьчтобы вернуть состояние со свойством new cars.

Я получаю сообщение об ошибке: TypeError: Один из источников для assign имеет перечисляемый ключ в цепочке прототипов.Вы пытаетесь назначить свойство прототипа?Мы этого не допустим, так как это крайний случай, который мы не поддерживаем.Эта ошибка является оптимизацией производительности и не соответствует спецификации.

Я понимаю, что могу сказать, что не могу назначить свойство состояния избыточности, как я пытаюсь?

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;
  }
};

1 Ответ

0 голосов
/ 26 июня 2018

При поиске этого сообщения об ошибке появляется этот вопрос SO , который ссылается на https://github.com/facebook/react-native/issues/16814.Похоже, что это специфическая проблема React Native, которая представляет собой комбинацию вашего вызова API и использования оператора распространения.

Помимо этого, у вашего кода есть пара основных проблем:

  • Вы делаете асинхронные вызовы в редукторе, что вам никогда не следует делать
  • обработка списка из ответа 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;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...