#react-redux
#реагировать-redux
Вопрос:
Я создаю функцию поиска, в качестве запроса я должен использовать mapStateToProps
для получения данных, как мне следует поступить в этом файле?
Это мой код для этого
import React, { useState, useEffect } from "react";
import useDebounce from "../../custom-hook/index";
import "../Search/index.css";
function Search() {
// State and setter for search term
const [searchTerm, setSearchTerm] = useState("");
// State and setter for search results
const [results, setResults] = useState([]);
// State for search status (whether there is a pending API request)
const [isSearching, setIsSearching] = useState(false);
// Run every 5ms
const debouncedSearchTerm = useDebounce(searchTerm, 500);
// Here's where the API call happens
// We use useEffect since this is an asynchronous action
useEffect(
() => {
// Make sure we have a value (user has entered something in input)
if (debouncedSearchTerm) {
// Set isSearching state
setIsSearching(true);
// Fire off our API call
searchCharacters(debouncedSearchTerm).then(results => {
// Set back to false since request finished
setIsSearching(false);
// Set results state
setResults(results);
});
} else {
setResults([]);
}
},
// This is the useEffect input array
[debouncedSearchTerm]
);
// Pretty standard UI with search input and results
return (
<div>
<input
placeholder="Search..."
className="search"
onChange={e => setSearchTerm(e.target.value)}
/>
{isSearching amp;amp; <div>Searching ...</div>}
{results.map(result => (
<div key={result.id}>
<h4>{result.title}</h4>
<img
src={`${result.thumbnail.path}/portrait_incredible.${
result.thumbnail.extension}`}
alt="something"
/>
</div>
))}
</div>
);
}
// API search function
function searchCharacters(search) {
console.log(search);
}
export default Search;
Как видно из моего кода выше, в ответ у меня есть isSearching
функция, она устанавливается useState, но теперь мне это не нравится, я должен настроить mapSateToProp для получения реквизита из хранилища
Пожалуйста, помогите мне за это, большое вам спасибо
Комментарии:
1. зачем вам нужно, чтобы он был разделен на два разных компонента?
2. Поскольку я должен использовать mapStateToProp, в качестве запроса я должен разделиться на два разных компонента. Это моя просьба наставника. Можете ли вы мне помочь? Я не понимаю в этом. Или, если вы можете, нет необходимости разделять на два разных компонента
Ответ №1:
Этот фрагмент кода взят из документации по react-redux. Вы должны импортировать connect
функцию из этой библиотеки, а затем обернуть свой компонент.
function mapStateToProps(state) {
const { todos } = state
return { todoList: todos.allIds }
}
export default connect(mapStateToProps)(TodoList)
Обновлено:
Поскольку вы используете хуки, useSelector может работать лучше для вас.
Комментарии:
1. Я знаю, как это сделать, но как я могу применить функцию поиска
2. После подключения
Search
компонента вы можете использовать данные, выбранные вmapStateToProps
из егоprops
. Не могли бы вы объяснить, пожалуйста, что вы имеете в виду, у вас уже есть какой-то редуктор?3. @Kite обновил мой ответ для работы с хуками. Было бы полезно, если бы вы рассказали мне, как выглядит ваш редуктор и какие данные следует выбирать из хранилища.
4. В mapStateToProps нет хранилища для моего поиска, я создам для этого фиктивные данные. Редуктора нет, я имею в виду, что я создам макет данных для этого примера. Можете ли вы помочь мне с этим
5. Хм, обычно в сообществе React
mapStateToProps
означает функцию, которая использовалась для выбора данных из хранилища Redux, эти данные будут переданы в качестве реквизитов компоненту React. Прежде всего, вам нужно понять, что вам нужно сделать, какую проблему решить. Возможно, если вы сможете поделиться со мной описанием задачи, предоставленным вашим наставником, я смогу помочь двигаться в правильном направлении.