Reactjs 如何在UseEffect中使用自定义方法?

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

如何在useEffect中使用自定义方法?? 如果我创建了许多组件,它们使用相同的fetch函数,我应该在每个组件的效果中声明fetch函数吗??这个函数做同样的工作

据我所知,若我想在useEffect中使用组件的状态,我应该在useEffect中声明并调用该函数,如示例1所示

但是我想声明另一个js文件的函数。因为它被称为其他组件

根据danabramov(),若我想移动函数,我必须使用useCallback方法。 但我不太明白。请在这个问题上给我任何建议

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将运行感谢您的回答!!我所有的问题都解决了!我一定会在创建自定义钩好!非常感谢。