У меня есть массив объектов, хранящихся в redux. Я хочу, чтобы иметь возможность фильтровать этот массив на основе ввода пользователем. Должен ли я создать объект состояния, который получает массив через реквизит и модифицирует этот массив, или это плохая практика для смешивания состояния и реквизита? Если это нормально, смешайте два, следует ли установить состояние в компонентеWillReceiveProps?Лучший способ фильтрации таблицы в реакторе
ответ
Состояние здания на основе реквизита может быть несколько сложным, что приемлемо, но вы должны рассмотреть все ваши варианты.
Простейший для реализации - это отфильтровать опоры в вашем методе render
. Если у вас есть достаточно малые компоненты, которые не обновляют слишком много причин, и особенно, если количество элементов в списке является низким, это может быть предпочтительным способом:
class FilterList extends React.Component {
render() {
const { elements } = this.props;
const { filterStr } = this.state;
const filteredElements = elements
.filter(e => e.includes(filterStr))
.map(e => <li>{ e }</li>)
return (
<div>
<input
type="text"
value={ filterStr }
onChange={ e => this.setState({ filterStr: e.target.value }) } />
<ul>
{ filteredElements }
</ul>
</div>
);
}
}
Следующая опция делать то, что вы описываете и выводите вычисленное состояние на основе состояния фильтра компонента и реквизита, переданного ему. Это хорошо, когда у вас сложный компонент, который получает много реквизитов и часто отображается. Здесь вы кешируете видимые элементы и только фильтруете список, когда его нужно фильтровать.
class FilterList extends React.Component {
constructor (props) {
this.state = {
viewableEls: props.elements
}
}
componentWillReceiveProps (nextProps) {
const { elements } = this.props;
const { filterStr } = this.state;
if (elements !== nextProps.elements) {
this.setState({
viewableEls: this.getViewableEls(nextProps.elements, filterStr)
})
}
}
getViewableEls (elements, filterStr) {
return elements.filter(el => el.includes(filterStr))
}
handleFilterChange = e => {
const { elements } = this.props;
this.setState({
filterStr: e.target.value,
viewableEls: this.getViewableEls(elements, filterStr)
})
}
render() {
const { viewableEls } = this.state;
return (
<div>
<input
type="text"
value={ filterStr }
onChange={ e => this.setState({ filterStr: e.target.value }) } />
<ul>
{ viewableEls.map(e => <li key={ e }>{ e }</li>) }
</ul>
</div>
);
}
}
И, наконец, перевождь «путь», который требует, чтобы передать создателя действий и filterStr
в качестве реквизита в компонент, вероятно, передали через connect
где-то еще. Нижеприведенная реализация использует компонент без учета состояния, поскольку мы не сохраняем fitlerStr
в состоянии компонента вообще.
const FilterTable = ({ elements, filterStr, changeFilterStr }) => {
return (
<div>
<input
type="text"
value={ filterStr }
onChange={ e => changeFilterStr(e.target.value) } />
<ul>
{
elements
.filter(e => e.includes(filterStr))
.map(e => <li key={ e }>{ e }</li>)
}
</ul>
</div>
)
}
Спасибо, что поставили время, чтобы ответить на вопрос в глубину! – Juliuszc
Первый и третий примеры неплохие. Однако я должен принять во внимание второй пример. Ваш 'this.state.viewableEls' получен полностью из реквизита и состояния, тогда как поля состояния должны действительно содержать уникальные фрагменты информации. Вы утверждаете, что это имеет преимущество кэширования, но я этого не вижу; поскольку рендер запускается только при обновлении реквизита/состояния. –
В надуманном примере вы правы, нет никакой пользы для «кеширования», но если вы получаете другие реквизиты, которые вызывают 'render', но которые не должны влиять на значение' this.state.viewableEls', то есть. Если я не понимаю вас, конечно. Допустим, 90% повторных рендерингов вызвано сменой поддержки, с которой функция 'viewableEls' не является функцией (скажем, есть компонент чата в реальном времени, который является дочерним), а' elements' находится в диапазон в десятки тысяч элементов, будет возникать нетривиальное, но ненужное повторное вычисление каждый раз, когда приходит новое сообщение. Нет? –
- 1. Лучший способ фильтрации DataTable
- 2. Swift: Лучший способ фильтрации массива
- 3. WinForms.TreeView - лучший способ фильтрации узлов
- 4. Лучший способ в реакторе обновить свойство в массиве объектов
- 5. Лучший способ фильтрации невидимых видео в Rails
- 6. Лучший способ для фильтрации словаря в Python
- 7. Лучший способ для пользовательской фильтрации в SlickGrid
- 8. Лучший способ фильтрации больших наборов данных
- 9. Лучший/наиболее эффективный способ фильтрации объектов
- 10. Google Search Appliance - лучший способ фильтрации filetype
- 11. java Лучший способ для фильтрации списка объектов
- 12. Лучший способ фильтрации запросов по параметру?
- 13. Лучший способ назвать таблицы
- 14. Редактирование текста в реакторе
- 15. требуют ('template.jade') в реакторе-реакторе
- 16. Лучший способ получить статистику таблицы
- 17. Лучший способ для проектирования таблицы
- 18. Лучший способ хранения таблицы данных
- 19. Лучший способ разбора HTML таблицы
- 20. Самый эффективный способ фильтрации таблицы Html?
- 21. Лучший способ выбора строки таблицы?
- 22. Лучший способ для таблицы python?
- 23. Лучший способ фильтрации иерархических данных с использованием T-SQL?
- 24. Аудиозапись в реакторе
- 25. Правильный способ обработки условного стиля в реакторе
- 26. Правильный способ реализации Pikaday в метеорном реакторе
- 27. Лучший способ фильтрации по вертикали и по горизонтали?
- 28. Django лучший способ фильтрации дат без жесткого кодирования в представлении
- 29. Лучший способ фильтрации в Django и увидеть, существует ли объект
- 30. Лучший способ фильтрации дочерних объектов в инфраструктуре Entity
todomvc - это очень логичный подход для отслеживания состояния фильтрации. вот как это выглядит с помощью реакции/redux https://github.com/reactjs/redux/blob/master/examples/todomvc/components/MainSection.js – azium
Я ищу больше для чего-то подобного https: // facebook. github.io/fixed-data-table/example-filter.html, за исключением того, что я получаю массив через реквизит, а не как его состояние. – Juliuszc
Точно такой же принцип применяется. Помните, что ваши реквизиты - чужое государство. Вы сохраняете свой пользовательский ввод как состояние где-нибудь .. либо redux, либо в компоненте таблицы, а затем отфильтровывайте свой массив реквизитов против этого состояния фильтра. – azium