#javascript #reactjs #react-hooks #jsx
#javascript #reactjs #реагирующие хуки #jsx
Вопрос:
В React 16.X у меня есть функция в моем родительском компоненте:
const fetchData = ()=> {
return ajax
.get({},data)
.then((response) =>
{
setState(response);
// Here I update the state with setState()
})
.catch((error) =>
{
});
};
Теперь я передаю это внутри своего дочернего элемента в props
:
<child fetchData={fetchData}/>
В моем дочернем элементе я использую:
const {fetchData} = props;
// from my parent
Но когда я вызываю это fetchData
из своего дочернего элемента, оно обновляет состояние моего родителя (из-за setState
). Все, что я хотел, это повторно fetchData
использовать функцию для получения данных из API, а не изменять состояние родительского элемента.
Есть ли возможный способ добиться этого? Я хочу повторно использовать функцию fetchData
, но не обновлять родительское состояние.
Комментарии:
1. Вместо того, чтобы делать
setState
команду частью функции, ограничьте функцию самим запросом (т. Е. Позвольте ей возвращать только вызов ajax.get). Затем используйтеprops.fetchData().then(response => ...)
в дочернем компоненте. В качестве альтернативы, передайте правильныйsetState
метод вfetchData
качестве параметра.2. я понимаю, что это очень простое решение, но в случае, когда проект превращается в огромные файлы, есть ли другой способ добиться этого? @ChrisG
3. Ну, это тоже очень простая проблема 🙂 Не уверен, что понимаю, почему размер проекта будет иметь значение; мое решение создает универсальную функцию для получения данных, что делает ее идеально подходящей для большого проекта. Не уверен, какое другое решение вы представляете здесь?
4. Хорошо, я понимаю, что я мог бы воспринимать вещи очень сложно. Хорошо, я посмотрю на предложенные вами изменения и попробую этот подход.
Ответ №1:
На случай, если вы застряли в этом:
Пожалуйста, используйте следующее, чтобы пройти:
//define a function that only returns the request
const request = () =>{
return ajax
.get({},data);
};
//In anywhere else use it like this in main function
const fetchData = async ()=> {
const request = this.request();
return request
.then((response) =>
{
setState(response);
// Here I update the state with setState()
})
.catch((error) =>
{
});
};
//Or pass it in the props to use in the child component as
//In parent
<Abc requestFunc={this.request}/>
//and in Abc Component
const abc= (props)=>{
const requestCall = {props}
}
//call requestCall
requestCall().then....