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

Posted

技术标签:

【中文标题】如何在 UseEffect 中使用自定义方法?【英文标题】:How can I use custom method in UseEffect? 【发布时间】:2020-02-24 09:01:28 【问题描述】:

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

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

但我想在其他 js 文件中声明该函数。因为它被称为其他组件。

根据 Dan Abramov (https://overreacted.io/a-complete-guide-to-useeffect/) 的说法,如果我想移动函数,我必须使用 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)

【问题讨论】:

【参考方案1】:

我应该在每个组件的效果中声明 fetch 函数吗?

提取具有相同提取功能的custom hook、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
    )

【讨论】:

谢谢!我没想过要创建自定义钩子。但是我有一个问题当组件将参数(id)提供给useFetch并且id是组件的状态时,如果id改变了如何重新运行useFetch? useFetch 不应该在 useEffect 中吗?像这样:useEffect(()=>useFetch(id),[id]) ??是不是因为saveed on data和useEffect deps有数据?? 见rules of hooks。 useFetch 使用 useEffect ,它具有 id 作为依赖项。因此每次id 更改时都会重新运行获取,然后返回新数据。如果没有,它只会返回旧数据。【参考方案2】:

由于您的多个组件在 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);

【讨论】:

感谢您的回答。但我有一个问题。如果 id 会被任何事件改变,我应该将 useFetch 移到 useEffect 中吗? useEffect(()=>useFetch(id),[id]); ?? 不,您不需要这样做,因为每当 id 更改时,useFetch 将在更新的渲染上使用新 id 调用,并且其中的 useEffect 将运行 感谢您的回答!!我已经解决了我所有的问题!我一定会擅长创建自定义钩子!谢谢!

以上是关于如何在 UseEffect 中使用自定义方法?的主要内容,如果未能解决你的问题,请参考以下文章

React - nextjs 在 useEffect 中调用自定义钩子

LayUi创建一个自定义通用模块

office2010的PPT怎么自定义播放

useEffect 在自定义钩子中使用 ref 缺少依赖项警告

React Hooks:确保 useEffect 仅在自定义钩子的数组参数内容更改时运行的惯用方法

如何在车把 ember 中定义自定义助手