reactjs - React hooks - 如何按需调用useEffect?

标签 reactjs react-hooks

我正在用 React 钩子(Hook)重写一个 CRUD 表。下面的自定义 Hook useDataApi 用于获取表的数据,观察 url 变化 - 因此当参数变化时它会被触发。但我还需要在删除和编辑后获取最新的数据。我该怎么做?

const useDataApi = (initialUrl, initialData) => {
  const [url, setUrl] = useState(initialUrl)

  const [state, dispatch] = useReducer(dataFetchReducer, { data: initialData, loading: true })

  useEffect(() => {
    const fetchData = async () => {
      dispatch({ type: 'FETCH_INIT' })
      const result = await instance.get(url)
      dispatch({ type: 'FETCH_SUCCESS', payload: result.data })
    }

    fetchData()
  }, [url])

  const doFetch = url => {
    setUrl(url)
  }

  return { ...state, doFetch }
}

由于 url 在删除/编辑后保持不变,因此不会被触发。我想我可以有一个增量标志,并让 useEffect 也监视它。但这可能不是最佳做法?有没有更好的办法?

最佳答案

您需要做的就是从useEffect 中取出fetchData 方法,并在需要时调用它。还要确保将函数作为依赖项数组中的参数传递。

const useDataApi = (initialUrl, initialData) => {
  const [url, setUrl] = useState(initialUrl)

  const [state, dispatch] = useReducer(dataFetchReducer, { data: initialData, loading: true })

  const fetchData = useCallback(async () => {
      dispatch({ type: 'FETCH_INIT' })
      const result = await instance.get(url)
      dispatch({ type: 'FETCH_SUCCESS', payload: result.data })
  }, [url]);

  useEffect(() => {
    fetchData()
  }, [url, fetchData]); // Pass fetchData as param to dependency array

  const doFetch = url => {
    setUrl(url)
  }

  return { ...state, doFetch, fetchData }
}

关于reactjs - React hooks - 如何按需调用useEffect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55826190/

相关文章:

reactjs - 如何使用组件中的 Redux-hooks useDispatch 在操作中通过 API 调用来调用函数?

javascript - 事件监听器之间的状态未按预期更新

reactjs - 使用 SetTimeout 测试自定义 Hook ,并使用 Jest 测试 useEffect

javascript - propType 失败 : The prop `id` is required to make `Dropdown` accessible for users of assistive technologies such as screen readers

reactjs - 在react上使用redux的原因是什么?

node.js - React Nodejs 项目中的多个 package.json 文件

reactjs - 如何在 react 中使用表单 Hook 验证 react 选择下拉列表

javascript - "useRefs"变量是 div 引用的初始值?

javascript - 在 ReactJS 应用程序中将字符串转换为 JSON 对象时出错

javascript - 为什么 React 会同时显示我的所有组件?