Reactjs 如何在UseEffect中使用自定义方法?
如何在useEffect中使用自定义方法?? 如果我创建了许多组件,它们使用相同的fetch函数,我应该在每个组件的效果中声明fetch函数吗??这个函数做同样的工作 据我所知,若我想在useEffect中使用组件的状态,我应该在useEffect中声明并调用该函数,如示例1所示 但是我想声明另一个js文件的函数。因为它被称为其他组件 根据danabramov(),若我想移动函数,我必须使用useCallback方法。 但我不太明白。请在这个问题上给我任何建议Reactjs 如何在UseEffect中使用自定义方法?,reactjs,react-redux,react-hooks,use-effect,Reactjs,React Redux,React Hooks,Use Effect,如何在useEffect中使用自定义方法?? 如果我创建了许多组件,它们使用相同的fetch函数,我应该在每个组件的效果中声明fetch函数吗??这个函数做同样的工作 据我所知,若我想在useEffect中使用组件的状态,我应该在useEffect中声明并调用该函数,如示例1所示 但是我想声明另一个js文件的函数。因为它被称为其他组件 根据danabramov(),若我想移动函数,我必须使用useCallback方法。 但我不太明白。请在这个问题上给我任何建议 1. Component.js c
1. Component.js
const Component = () => {
const [id,setId] = useState(0);
const dispatch = useDispatch();
useEffect(() => {
fetch(`url/${id}).then(res => dispatch({type: success, payload: res}))
},[id])
}
2. Component.js
const Component = () => {
const [id, setId] = useState(0);
useEffect(()=> {
callApi(id)
},[id])
}
Api.js
const callApi = (id) => {
const dispatch = useDispatch();
return fetch(`url/${id}).then(res => dispatch({type:success, payload:res})
}
我应该在每个组件的效果中声明fetch函数吗
使用相同的提取功能提取一个,useFetch()
// custom hook
const useFetch = (id) => {
const [data, setData] = useState(null);
useEffect(
() => {
async function fetchData() {
const res = await fetch(`url/${id})
setData(res);
}
fetchData();
}, [id] // id as dependency
)
return data;
}
// sample component using custom hook
const Component = (props) => {
const dispatch = useDispatch();
const data = useFetch(props.id); // use custom hook
useEffect(
() => {
if (data) {
dispatch({type: success, payload: data});
}
}, [data] // dispatch every time data changes
)
}
我应该在每个组件的效果中声明fetch函数吗
使用相同的提取功能提取一个,useFetch()
// custom hook
const useFetch = (id) => {
const [data, setData] = useState(null);
useEffect(
() => {
async function fetchData() {
const res = await fetch(`url/${id})
setData(res);
}
fetchData();
}, [id] // id as dependency
)
return data;
}
// sample component using custom hook
const Component = (props) => {
const dispatch = useDispatch();
const data = useFetch(props.id); // use custom hook
useEffect(
() => {
if (data) {
dispatch({type: success, payload: data});
}
}, [data] // dispatch every time data changes
)
}
由于多个组件在useEffect中执行相同的操作,因此可以将代码提取到自定义挂钩中,并在所有组件中使用它 useFetch.js
export const useFetch = () => {
const dispatch = useDispatch();
useEffect(() => {
fetch(`url/${id}).then(res => dispatch({type: success, payload: res}))
},[id])
}
现在您可以在组件中编写
const Component = () => {
const [id, setId] = useState(0);
useFetch(id);
}
由于多个组件在useEffect中执行相同的操作,因此可以将代码提取到自定义挂钩中,并在所有组件中使用它 useFetch.js
export const useFetch = () => {
const dispatch = useDispatch();
useEffect(() => {
fetch(`url/${id}).then(res => dispatch({type: success, payload: res}))
},[id])
}
现在您可以在组件中编写
const Component = () => {
const [id, setId] = useState(0);
useFetch(id);
}
谢谢我没想到汤姆·胡克。但我有一个问题,当组件给useFetch参数(id)并且id是组件的状态时,如果id被更改,如何重新运行useFetch?useFetch不应该在useEffect中吗??像这样:useffect(()=>useffetch(id),[id])??是否可以,因为保存在数据上,并且useEffect deps具有数据??请参阅
useFetch
使用具有id
作为依赖项的useEffect
。因此,每次id
更改时,提取都将重新运行,然后返回新数据。如果没有,它将返回旧数据。谢谢!我没想到汤姆·胡克。但我有一个问题,当组件给useFetch参数(id)并且id是组件的状态时,如果id被更改,如何重新运行useFetch?useFetch不应该在useEffect中吗??像这样:useffect(()=>useffetch(id),[id])??是否可以,因为保存在数据上,并且useEffect deps具有数据??请参阅useFetch
使用具有id
作为依赖项的useEffect
。因此,每次id
更改时,提取都将重新运行,然后返回新数据。如果没有,它将返回旧数据。谢谢您的回答。但我有一个问题。如果id将被任何事件更改,我是否应该在useEffect中移动useFetch??useffect(()=>useffetch(id),[id])??不,您不需要这样做,因为无论何时id更改,更新后的渲染中都将使用新id调用useFetch,其中的useEffect将运行感谢您的回答!!我所有的问题都解决了!我一定会在创建自定义钩好!非常感谢。谢谢你的回答。但我有一个问题。如果id将被任何事件更改,我是否应该在useEffect中移动useFetch??useffect(()=>useffetch(id),[id])??不,您不需要这样做,因为无论何时id更改,更新后的渲染中都将使用新id调用useFetch,其中的useEffect将运行感谢您的回答!!我所有的问题都解决了!我一定会在创建自定义钩好!非常感谢。