React Hook "useState" вызывается в функции "setResults", которая не является ни компонентом функции React, ни пользовательской функцией React Hook
Я пытаюсь сделать вызов API в функциональном компоненте, который является реакцией, и в зависимости от результата повторно визуализировать содержимое компонента. Вот код:
Компонент, который вызывает API-
function IntegrationDownshift() {
render(
<Paper square>
{setResults(inputValue).map(
(suggestion, index) =>
renderSuggestion({
suggestion,
index,
itemProps: getItemProps({
item:
suggestion.userFullName
}),
highlightedIndex,
selectedItem
})
)}
</Paper>
);
}
Здесь setResults
функция:
function setResults(textInput) {
const [data, setData] = useState({ users: [] });
searchUser(textInput).then(result => {
useEffect(() => {
searchUser(textInput).then(result => {
setData(result.users);
});
}, []);
});
}
Я пытаюсь получить данные о состоянии и перерисовать мой компонент на основе данных. Вот searchUser
находится в действии, которое вызывает внешний API.
searchUser
вызывает действие и извлекает данные успешно, но я не уверен, почему состояние обновляется - я получил ошибку ниже -
React Hook "useState" вызывается в функции "setResults", которая не является ни компонентом функции React, ни пользовательской функцией React Hook response-hooks / rules-of-hooks
- В качестве второго альтернативного варианта я пытаюсь вернуть значения из searchUser и получить к нему доступ в приведенной ниже функции, но все равно бесполезно
Я новичок в хуках, и любая помощь / указатели будут полезны.
2 ответа
Вам нужно поставить первую букву в верхнем регистре setResults => SetResults
function SetResults(textInput) {
const [data, setData] = useState({ users: [] });
searchUser(textInput).then(result => {
useEffect(() => {
searchUser(textInput).then(result => {
setData(result.users);
});
}, []);
});
}
Имя функции должно начинаться с заглавной буквы. поэтому имя вашей функции - setResults . вам нужно изменить его на SetResults.
Имена функциональных компонентов React должны начинаться с заглавной буквы. Если вы менипулируетеsetResults
к SetResults
, тогда это будет работать.
А Hooks не поддерживает обычные классы javascript, поэтому попробуйте создать другой компонент с именем SetResults
. И включить его в основной компонент
На самом деле setResults нужно писать с заглавной буквы.
function SetResults(){...} // S capitalized here
Примечание. Если вы не используете перехватчики реакции, вам не нужно писать первую букву имени функции с большой буквы, но при использовании перехватчиков первая буква вашей функции должна быть заглавной.
Подобный вопрос обсуждается здесь,
Функция реагирования должна возвращать визуализируемый JSX, чтобы быть распознанным как функция Реакции. Вы используете "setResults" в качестве вспомогательной функции - она не возвращает визуализируемый JSX. Таким образом, ошибка 'React Hook "useState" вызывается в функции "setResults", которая не является ни компонентом функции React, ни пользовательской функцией React Hook response-hooks / rules-of-hooks' имеет смысл.
Обратитесь к этой статье о том, как извлекать данные с помощью useEffort - Автор дал отличное объяснение хуков.
https://daveceddia.com/useeffect-hook-examples/
Попробуйте этот код
export default function IntegrationDownshift() {
const [data, setData] = useState({ users: [] });
// useEffect method is first called prior to render.
useEffect( () => {
async function searchUser() {
// This will set Data Set and trigger render method
setData(result.users);
}
searchUser();
}, [setData]);
function renderSuggestion(suggestion) {
// Pretty print the suggestion data here
return <div> {suggestion} </div>;
}
return ( <Paper square> {data.map( (suggestion, index) => {
// Render each Suggestion
return renderSuggestion( suggestion);
} )}</Paper>);
}
Хуки в основном позволяют вам использовать состояние и другие функции компонентов класса React в компонентах функций. Таким образом, вызов Hooks в обычной функции JavaScript не допускается. Вы можете сделать это только на верхнем уровне функциональных компонентов или в ваших пользовательских хуках.
Думайте в Крюках как это:
- useState похож на this.setState в компонентах класса.
- useEffect аналогично componentDidMount и componentDidUpdate в компонентах класса.
В React Docs есть раздел, объясняющий правила использования хуков: