【问题标题】:Create filter in a store file with react使用反应在商店文件中创建过滤器
【发布时间】:2021-06-26 22:09:35
【问题描述】:

大家晚上好 我有这个过滤功能,我想在一个名为“post.action”的商店文件中使用:

filtering = (e) => {
    let filtering = e.target.value
    if(filtering === ""){
        this.setState({
            filters:filtering,
            posts:posts
        })
    } else {
        this.setState({
            filters:filtering,
            posts:posts.filter(posts=>{
                return country.filtres.indexOf(e.target.value)>=0
            })
        })

所以我想将此功能集成到我的商店中。 到目前为止,我一直坚持这一点:

export const filterCountries = (posts, filtering) => (dispatch) => {
    return dispatch({
        type:FILTER_COUNTRY,
        payload:{
           
            ),

如何在“有效负载”之后集成它? 希望它足够清楚。 提前谢谢!

【问题讨论】:

  • 在我看来,过滤操作应该只在状态中设置一个属性filter。实际的过滤可以在选择器函数中完成。

标签: reactjs redux filter store


【解决方案1】:

正如琳达所说;你应该过滤selector,这里是一个例子:

const { Provider, useDispatch, useSelector } = ReactRedux;
const { createStore, applyMiddleware, compose } = Redux;
const { createSelector } = Reselect;

const initialState = {
  data: ['aaa', 'aab', 'abb', 'bbb'],
  filter: '',
};
//action types
const SET_FILTER = 'SET_FILTER';
//action creators
const setFilter = (filter) => ({
  type: SET_FILTER,
  payload: filter,
});
const reducer = (state, { type, payload }) => {
  if (type === SET_FILTER) {
    return {
      ...state,
      filter: payload,
    };
  }
  return state;
};
//selectors
const selectData = (state) => state.data;
const createSelectFilteredData = (filter) =>
  createSelector(
    [selectData], //re use select data
    (data) => data.filter((d) => d.includes(filter))
  );
const selectFilter = (state) => state.filter;
//creating store with redux dev tools
const composeEnhancers =
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
  reducer,
  initialState,
  composeEnhancers(
    applyMiddleware(() => (next) => (action) =>
      next(action)
    )
  )
);
const Filter = React.memo(function FilterComponent() {
  const filter = useSelector(selectFilter);
  const dispatch = useDispatch();
  return (
    <label>
      Filter
      <input
        type="text"
        value={filter}
        onChange={(e) =>
          dispatch(setFilter(e.target.value))
        }
      />
    </label>
  );
});
const FilteredList = React.memo(
  function FilteredListComponent() {
    const filter = useSelector(selectFilter);
    const selectFiltered = React.useMemo(
      () => createSelectFilteredData(filter),
      [filter]
    );
    const data = useSelector(selectFiltered);
    return (
      <ul>
        {data.map((d, i) => (
          <li key={i}>{d}</li>
        ))}
      </ul>
    );
  }
);
const App = () => {
  return (
    <div>
      <Filter />
      <FilteredList />
    </div>
  );
};

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.5/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/7.2.0/react-redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reselect/4.0.0/reselect.min.js"></script>
<div id="root"></div>

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 2013-10-18
  • 2012-09-19
  • 2018-06-30
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多