Mam tablicę obiektów przechowywanych w redux. Chcę móc filtrować tę tablicę na podstawie danych wprowadzanych przez użytkownika. Czy powinienem utworzyć obiekt stanu, który odbiera tablicę za pomocą rekwizytów i modyfikuje tę tablicę, czy też jest to zła praktyka mieszania stanu i rekwizytów? Jeśli dobrze jest zmieszać te dwa, czy powinienem ustawić stan w componentWillReceiveProps?Najlepszy sposób filtrowania tabeli w React
Odpowiedz
Stan budowy oparty na rekwizytach może być nieco skomplikowany, co jest dopuszczalne, ale należy wziąć pod uwagę wszystkie opcje.
Najprostszym rozwiązaniem jest filtrowanie rekwizytów w metodzie render
. Jeśli masz wystarczająco małe elementy, które nie są aktualizowane przez zbyt wielu powodów, a zwłaszcza wtedy, gdy liczba elementów na liście jest niska, to może być korzystna metoda:
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>
);
}
}
Kolejnym rozwiązaniem jest to, co opisujesz i wyprowadzasz stan obliczony na podstawie stanu filtra komponentu i rekwizytów przekazanych do niego. Jest to dobre, gdy masz skomplikowany komponent, który otrzymuje wiele rekwizytów i jest często renderowany. Tutaj buforujesz widoczne elementy i filtrujesz listę tylko wtedy, gdy trzeba ją odfiltrować.
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>
);
}
}
I wreszcie, Redux „droga”, która wymaga, aby przekazać twórcy działania i filterStr
jako rekwizyty do komponentu, prawdopodobnie został przekazany connect
gdzieś indziej. Poniższa implementacja używa składnika bezstanowego, ponieważ nie zachowujemy w ogóle stanu komponentu 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>
)
}
Dzięki za poświęcenie czasu, aby dogłębnie odpowiedzieć na to pytanie! – Juliuszc
Pierwszy i trzeci przykład są całkiem dobre. Muszę jednak zająć się drugim przykładem. Twoje 'this.state.viewableEls' pochodzi wyłącznie z rekwizytów i stanów, podczas gdy pola stanu powinny zawierać unikatowe informacje. Twierdzisz, że ma to zaletę buforowania, ale ja tego nie widzę; ponieważ render jest wywoływany tylko wtedy, gdy rekwizyty/aktualizacja stanu w każdym razie. –
W poprawnym przykładzie, masz rację, nie ma żadnej korzyści dla "buforowania", ale jeśli otrzymujesz inne rekwizyty, które wyzwalają 'render', ale które nie powinny wpływać na wartość' this.state.viewableEls', to jest. O ile oczywiście nie zrozumiałem cię źle. Powiedzmy, że 90% ponownych renderowań jest wyzwalanych przez zmianę rekwizytów, których 'viewableEls' nie jest funkcją (powiedzmy, że istnieje składnik czatu w czasie rzeczywistym, który jest dzieckiem), a' elementy' są w w zakresie dziesiątek tysięcy elementów, za każdym razem, gdy pojawi się nowa wiadomość, nie będzie trywialnej, lecz niepotrzebnej ponownej kalibracji. Nie? –
- 1. Scala: Najlepszy sposób filtrowania i mapowania w jednej iteracji
- 2. Jaki jest najlepszy sposób filtrowania listy obiektów JSON w JavaScript?
- 3. W jaki sposób można łączyć warunki filtrowania?
- 4. Najlepszy sposób przechowywania danych "ustawień witryny" w tabeli bazy danych?
- 5. Wydajny sposób filtrowania tablic w javascript
- 6. Właściwy sposób automatycznego filtrowania zapytań SQLAlchemy?
- 7. Widok tabeli wewnątrz widoku, wewnątrz viewcontroller. Najlepszy sposób to zrobić?
- 8. Najlepszy sposób obsługi dużych (UUID) jako klucz podstawowy tabeli MySQL
- 9. Najlepszy sposób użycia tabeli DB jako komunikatu/kolejki zadań
- 10. jaki jest najlepszy sposób wygenerowania losowego wzoru wewnątrz tabeli
- 11. Jaki jest najlepszy sposób zaprojektowania tabeli miasta, stanu, kraju?
- 12. Najlepszy sposób, aby zapisać dane tablicy PHP do tabeli mysql
- 13. Jaki jest najlepszy sposób na usunięcie wiersza tabeli z jQuery?
- 14. Najlepszy sposób na usunięcie zduplikowanych wpisów z tabeli danych
- 15. Jaki jest najlepszy sposób aktualizowania danych w tabeli, gdy jest ona używana bez blokowania tabeli?
- 16. Najlepszy sposób rejestrowania w SSIS
- 17. Jak zignorować HTML podczas filtrowania tabeli danych jQuery?
- 18. Najlepszy wybór dla klucza podstawowego tabeli osoby
- 19. Najlepszy sposób używania guawy
- 20. Sposób testowania React Składniki macierzyste
- 21. Najlepszy sposób poszukiwania HashSet
- 22. Najlepszy sposób implementacji wtyczki
- 23. Najlepszy sposób obsługi KeyNotFoundException
- 24. Centralny sposób filtrowania nieprawidłowych znaków Unicode w lxml?
- 25. Jaki jest najszybszy sposób przekonwertowania aplikacji React na React Native?
- 26. Błędy filtrowania idiomatycznego w Go
- 27. Jaki jest najlepszy sposób rejestrowania aktywności użytkowników?
- 28. React, Redux, React-Router - Stuck w instalowaniu rzeczowo-ui
- 29. kolekcje do filtrowania lambdaj
- 30. MySQL najlepszy sposób przechowywania długich łańcuchów
todomvc to bardzo logiczne podejście do śledzenia stanu filtrowania. Oto, jak to wygląda w reakcji/redux https://github.com/reactjs/redux/blob/master/examples/todomvc/components/MainSection.js – azium
Szukam czegoś takiego https: // facebook. github.io/fixed-data-table/example-filter.html, z tym, że otrzymuję tablicę przez rekwizyty, zamiast mieć ją jako mój stan. – Juliuszc
Dokładnie ta sama zasada obowiązuje jednak. Pamiętaj, twoje rekwizyty są czyimś stanem. Przechowujesz dane wejściowe użytkownika jako stan gdzieś .. albo redux albo w komponencie tabeli, a następnie filtruj tablicę rekwizytów względem tego stanu filtru. – azium