#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь создать панель поиска, которая отфильтровывает набор данных. Функция поиска, которую я создал, использует несколько состояний для фильтрации результатов. Когда строка поиска и страница результатов находятся в одном классе, функция поиска работает, но то, что я пытаюсь сделать сейчас, это отделить строку поиска и отобразить результаты поиска на отдельной странице. Вот состояние, устанавливаемое в классе SearchBar.
handleChange = (event) => {
this.setState({
names: event.target.value
})
}
Проблема в том, что я понятия не имею, как заставить данные, хранящиеся в классе SearchBar, отображаться на странице результатов. Вот как я фильтрую результаты на странице результатов.
const filteredData = data.filter(entry => (entry.name === (this.state.names))
Эти данные фильтруются в классе Search, но this.state.names
сохраняются в классе SearchBar . Этот класс панели поиска отображается в моем заголовке, где пользователи могут искать все, что они хотят, и после нажатия кнопки поиска появляется страница результатов. Итак, как я могу взять данные, хранящиеся в классе SearchBar, и использовать их в другом классе?
ОБНОВЛЕНИЕ: я попытался передать состояние классу Search в функции визуализации, но это приводит к тому, что вся страница просто зависает.
render() {
return (
<Search names = {this.state.names} />
)
}
Комментарии:
1. Я не смог уследить за ходом мыслей, не могли бы вы добавить код, а затем указать, чего вы хотите достичь
2. Вам нужно будет перенести состояние в родительский компонент, а затем передать его через props (обычный) или Context (не такой распространенный). В качестве альтернативы вы могли бы использовать что-то вроде Redux, но это, вероятно, излишне, если это ваша единственная проблема.
3. И как это должно быть сделано, потому что я пытался выполнить
<Search names = {this.state.names} />
функцию рендеринга в классе SearchBar, и теперь моя страница не загружается. Что я делаю не так?4. не могли бы вы вставить свой код? поскольку немного сложно понять, чего именно вы пытаетесь достичь
Ответ №1:
Не уверен, правильно ли я понял, но:
- Вы можете создать новый компонент для хранения ваших данных.
- Затем используйте эту функцию (или аналогичную) в onChange для этого компонента
const filterData = (e) => { const valueToCheck = e.target.value let newArr = [] for(entry of data) { // do the logic //push the data you want into an array newArr.push(entry) } setState(newArr) }
Ответ №2:
Панель поиска должна вызывать обратный вызов onSearchResults([…]), а затем PageResult
может принять эти результаты, вам нужен компонент, который организует все.
const App = () =>{
const [results, setResults] = useState([]);
return (<>
<SearchBar onSearchChange={setResults}/>
{ results.length amp;amp; <PageResult results={results}/> }
</>)
}
Панель поиска вызовет props.onSearchChange(results)
отфильтрованные данные. Компонент приложения отреагирует на это изменение и отправит эти результаты в компонент PageResult