@strannik_k

Как правильно сделать фильтрацию списка в Redux?

Пробовал сделать фильтрацию в Redux.
Пока наилучшим решением вижу делать фильтрацию так же, как это делается в обычном React.js без Redux. Т.е. в дочерний компонент передается родительская функция, в которой изменяется state родительского компонента.
Пришел к выводу, что редьюсеры здесь не стоит использовать, т. к. состояние store не меняется. К тому же, если его изменить, то не получиться отобразить один список в нескольких компонентах с разной фильтрацией.

Пример моего решения написан ниже. Я хотел узнать - является ли такой подход к фильтрации правильным в Redux или есть лучше, правильней?

Родительский компонент (контейнер):
handleFilterUpdate(filterType, filterValue ){
    this.setState({ filterType: filterType, filterValue: filterValue });
}

render () {
    const listItems = this.props.listItems;
    return (
        <div>
            <MyFilter onFilterUpdate={this.handleFilterUpdate.bind(this)} />
            <List items={getFilteredItems(listItems, this.state.filterType, this.state.filterValue)}/>
        </div>
    );
}

Дочерний компонент MyFilter:
handleClick(e) {
    this.props.onFilterUpdate('filter_type', this.refs.filterInput.value);
}

render() {
    return (
        <div>
            <input type="text" ref = "filterInput"/>
            <button onClick={this.handleClick.bind(this)}>Apply filter</button>
        </div>
    );
}
  • Вопрос задан
  • 2397 просмотров
Решения вопроса 1
Храните тип фильтра в store а не в state. Затем фильтруйте из общего массива по этому фильтру во время mapStateToProps (изменение фильтра - это экшн). При этом не плохо бы использовать reselect.

function mapStateToProps(state) {
  const filter = state.something.filter
  const items = state.other.items
  return {
    items: filterItems(items, filter)
  } 
}
connect(mapStateToProps)(...)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы