javascript - React Hooks - 无需调用即可内存函数

标签 javascript reactjs ecmascript-6 react-hooks

我有一个以下函数来控制我的模态:

const getModalProps = useCallback(
(id) => ({
  onClose: () => handleClose(id),
  onOpen: () => handleOpen(id),
  isOpen: isOpen(id),
}),
[handleClose, handleOpen, isOpen],
);

这个想法是使用像<Modal {...getModalProps('userModal')} />这样的东西。当我想按以下方式使用它时,问题就来了:

const modalProps = getModalProps('userModal');

useEffect(() => { modalProps.onOpen() }, [modalProps.onOpen])

这会导致无限循环,因为 modalProps.onOpen实际上是一个匿名箭头函数,而不是 useCallback 内存函数。

我不知道如何使用 getModalProps返回已内存但未调用 handleOpen 的函数和handleClose .

类似的想法(我知道这行不通,只是一个概念):

const getModalProps = useCallback(
(id) => ({
  onClose: memoise(() => handleClose(id)),
  onOpen: memoise(() => handleOpen(id)),
  isOpen: isOpen(id),
}),
[handleClose, handleOpen, isOpen],
);

handleClosehandleOpen只是你的正常useCallback功能。

如果需要更多信息,请发表评论。

最佳答案

创建一个自定义 Hook ,用于创建记忆化的 onCloseonOpen,并返回 modalProps 对象:

const useGetModalProps = id => { // you can also pass isOpen to the hook
  const onClose = useCallback(() => handleClose(id), [handleClose, id]);
  const onOpen = useCallback(() => handleOpen(id), [handleOpen, id]);

  return {
    onClose,
    onOpen,
    isOpen: isOpen(id),
  };
}

用法:

const modalProps = useGetModalProps('userModal');

useEffect(() => { modalProps.onOpen() }, [modalProps.onOpen])

或者

<Modal {...modalProps } />

关于javascript - React Hooks - 无需调用即可内存函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64110663/

相关文章:

javascript - 谷歌地图是否将 map 坐标定位到百度 map 中的同一位置?

javascript - 从 Axios GET 请求访问数据

ecmascript-6 - Vue.js 与 es6 模板字符串绑定(bind)

javascript - 如何在react.JS中将子窗口url获取到父窗口中?

javascript - 如何使用 element.style.backgroundImage = "url(filePath)"将背景图像添加到 javascript?

javascript - Electron +nuxt+amCharts 4 : Unexpected token export

javascript - Ag 网格仅在组值之间放置边框

javascript - 为什么 ref 不是子组件中的属性?

javascript - 检查空值并发出警报

reactjs - 使用 React-Bootstrap 更改移动 View 中的列顺序