【问题标题】:How can I get a new array of data based on a search param?如何根据搜索参数获取新的数据数组?
【发布时间】:2019-02-22 08:54:31
【问题描述】:

我从 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);

上面是reducer。

我想要的是根据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
 },
 ...
]

那么,我怎样才能返回这个新数组来呈现搜索条件?

【问题讨论】:

  • nameaddress 还是什么的搜索?
  • 嗨@codekaizer,是的。按名称。

标签: javascript reactjs ecmascript-6 redux react-redux


【解决方案1】:

在“SEARCH_PARAM”动作类型的减速器中,您可以根据状态创建“passengersData”的副本,并根据需要更改该副本。

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

仅供参考,这会将“passesngerData”替换为“searchedData”。如果你想保留原来的 'passengerData' 那么你可以在 redux store 中创建一个新的 state 并从 reducer 返回它。

【讨论】:

  • 嗯,是的,实际上它正在发生。我能做些什么呢?如果passengersData 不存在,则搜索功能将不起作用。
  • @Reacting 刚刚更新了答案,为搜索到的数据添加了新的 redux 状态。
【解决方案2】:

更新

如果我能很好地理解您的需求,您应该这样做:我稍作更改,仅映射按名称|地址过滤的数据

{
    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}
        />
 }

您不需要更改您的状态,但是如果您想使用 redux 进行更改,您可以添加一个新状态(例如,passengersDataFiltred)并进行处理:

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

然后映射乘客数据过滤器:

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

如果这不是您想要的,请给我您的反馈?

【讨论】:

  • 我需要查看您的代码(如果可能的话)以了解您的更多需求!
  • 嗯,关于这个功能的所有代码都是我发布的。
  • 无论如何我需要更像@Hitesh Chaudhari 回答
  • “searchParam”是什么意思?在您的减速器中,searchParam 的值 是对象的属性之一(id、名称、地址、...、驱动程序)或“searchParam”可以是例如“地址”和 它的值地址的值 ?
  • searchParam 只是输入的字符串。就像您在搜索框中输入的任何内容一样,searchParam
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多