Как я могу получить новый массив данных, основанный на параметре поиска? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть некоторые данные, которые я запрашиваю из вызова API, которые мне нужно будет отфильтровать.

Я работаю над этим с Redux, а не с локальным состоянием.

Вот мои действия:

import ActionTypes from '../constants/ActionTypes';


export const passengersDataAction = passengersData => ({
  type: ActionTypes.PASSENGERS_DATA,
  // This is the array of objects that I need to search through
  payload: { passengersData }, 
});

export const searchParamAction = searchParam => ({
  type: ActionTypes.SEARCH_PARAM,
  // This is the param that I need to send to passengersData
  // in order to get a new array of objects
  payload: { searchParam },
});

Это мой редуктор:

import createReducer from '../../../redux/createReducer';
import ActionTypes from '../constants/ActionTypes';

const initialState = {
  passengersData: [],
  searchParam: '',
};

const handlers = {
  [ActionTypes.PASSENGERS_DATA](state, action) {
    return {
      ...state,
      passengersData: action.payload.passengersData,
    };
  },

  [ActionTypes.SEARCH_PARAM](state, action) {
    return {
      ...state,
      searchParam: action.payload.searchParam,
    };
  },
};

export default createReducer(initialState, handlers);

И выше приведен редуктор.

Я хочу вернуть новый массив объектов на основе значения searchParam.

Примерно так:

  [ActionTypes.SEARCH_PARAM](state, action) {
    return {
      ...state,
      passengersData://HERE GOES THE NEW ARRAY BASED ON WHAT searchParam RETURNS,
      searchParam: action.payload.searchParam,
    };
  },

В компоненте, который я делаю так:

  <View>
    <TextInput
      style={PassengersStyles.SearchBox}
      // searchParamActionHandler sends the input value to the update the reducer
      onChangeText={text => searchParamActionHandler(text)}
      value={searchParam}
      placeholder="Search..."
    />
  </View>
  <Text>{searchParam}</Text>
  <PassengerCardBasedOnRoute searchParam={searchParam} />

PassengerCardBasedOnRoute - это компонент, представляющий массив объектов, поступающих из passengersData.Например:

           {passengersData.map(info => (
            <PassengersInfo
              key={info.id}
              searchParam={this.props.searchParam}
              cardinalpoint={info.cardinalpoint}
              name={info.name}
              address={info.address}
              datetime={info.timestamp}
            />
           }

Кстати, как выглядит массив объектов:

[
 {
  "id": 3,
  "name": "Marcos Alonso",
  "address": "Sabana",
  "phone": "712321222",
  "pickup": 0,
  "cardinalpoint": "N",
  "latitude": "9.93683450",
  "longitude": "-84.10991830",
  "timestamp": "2019-02-19 21:23:46",
  "dropofftimestamp": null,
  "pickuptimestamp": null,
  "deleted": null,
  "driver": 1
 },
 ...
]

Итак, как я могу вернуть этот новый массив для отображения критериев поиска?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

В редукторе для типа действия 'SEARCH_PARAM' вы можете создать копию 'passengerData' из состояния и изменить эту копию по своему усмотрению.

const initialState = {
  passengersData: [],
  searchParam: '',
  searchedData: []
};

[ActionTypes.SEARCH_PARAM](state, action) {
//In filter you can add your own logic to get the data
const searchedData = state.passengersData.filter((passenger) => passenger.name === action.payload.searchParam);

   return {
     ...state,
     searchedData,
     searchParam: action.payload.searchParam,
   };
},

FYI, это заменит 'passngerData 'с поиском данных.Если вы хотите сохранить исходные данные «passengerData», вы можете создать новое состояние в хранилище и восстановить его из редуктора.

0 голосов
/ 22 февраля 2019

Обновлено :

Если я хорошо понимаю ваши потребности, вы должны просто сделать это: я делаю небольшое изменение, чтобы отобразить только те данные, которые были отфильтрованыname | address

{
    passengersData.filter(item => item['name'] === this.props.searchParam || item['address'] === this.props.searchParam).map(info => (
        <PassengersInfo
          key={info.id}
          searchParam={this.props.searchParam}
          cardinalpoint={info.cardinalpoint}
          name={info.name}
          address={info.address}
          datetime={info.timestamp}
        />
 }

вам не нужно менять свое состояние, НО, если вы хотите сделать это с помощью приставки, вы можете добавить новое состояние (например, passengerDataFiltred) и провести лечение:

...
const initialState = {
   passengersData: [],
   passengersDataFiltred: [],
   searchParam: '',
};
...
[ActionTypes.SEARCH_PARAM](state, action) {
    const filtrededData = state.passengersData.filter(item => item['name'] === action.payload.searchParam || item['address'] === action.payload.searchParam);
    return {
        ...state,
        passengersDataFiltred: filtrededData,
        searchParam: action.payload.searchParam,
    };
}
...

затем сопоставьте пассажировDataFiltred:

      {passengersDataFiltred.map(info => (
        <PassengersInfo
          key={info.id}
          searchParam={this.props.searchParam}
          cardinalpoint={info.cardinalpoint}
          name={info.name}
          address={info.address}
          datetime={info.timestamp}
        />
       }

Пожалуйста, дайте мне свой отзыв, если это не то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...