javascript - 有没有办法在同一个反应元素内的钩子调用之间进行交互
问题描述
问题
有没有办法在同一个渲染调用中的钩子调用之间进行交互?让钩子在每次调用时都可以访问相同的值。例如,是否可以实现useRandom()
钩子,它会生成随机值,然后在每次调用时返回相同的值,即使在相同的渲染周期内也是如此。
可能但不理想的解决方案
我唯一的解决方案是用一些上下文包装组件,并在每个钩子调用上使用这个上下文进行交互。但是 at 迫使我为每个组件创建两个额外的节点(要使用的上下文和内部的另一个上下文,以防止嵌套组件使用相同的上下文)。我可以为此创建 HoC/renderProp,但这两个额外的上下文仍然存在。
例子
上下文和钩子
const InteractContext = React.createContext();
const useRandom = () => {
const context = useContext(InteractContext);
if (!context.value) {
context.value = Math.random();
}
return context.value;
}
使用钩子的组件
const MyComponent = () => {
const random1 = useRandom();
const random2 = useRandom();
return (
// to prevent using this value by nested components
<InteractContext value={ null }>
{random1} === {random2}
</InteractContext>
);
}
渲染组件
render(
<>
<InteractContext value={{}}>
<MyComponent />
</InteractContext>,
<InteractContext value={{}}>
<MyComponent />
</InteractContext>
</>,
document.getElementById('root')
);
预期结果
我希望看到这种格式:
<some random number> === <the same number>
<another random number> === <the same random number>
这是一个例子:
0.123456789 === 0.123456789
0.987654321 === 0.987654321
解决方案
可能关闭?
const useRandomness = () => (r => () => r)(Math.random());
// inside the component:
const useRandom = useRandomness();
useRandom() === useRandom();
或将该共享值传递给:
const useRandom = v => v;
// inside the component:
const random = Math.random();
useRandom(random) === useRandom(random)
推荐阅读
- javascript - 使用 JQuery 将选择移动到 html 中的下一个列表项
- php - session.name 不能为数字或空
- google-apps-script - 错误:未授予访问权限或已过期。通过服务帐户和域范围的委派访问 Google Admin Directory API 时
- java - 如何将一个 docx 插入另一个 docx 的预定行
- node.js - 运行连接到 MongoDB 云集群的 nodejs 应用程序时,Docker-compose 给出:“node|SyntaxError: Unexpected token import”错误
- python-3.x - Python中磁盘/分区的大小与linux命令不同
- javascript - 如何等待 Http 请求完成?
- css - 当间隙设置为 0(响应式地图)时,为什么 CSS 网格中的图块之间存在小的像素间隙?
- spring - 在 Spring Boot 中为每个事务运行一个语句
- ffmpeg - ffmpeg中具有复杂操作的多个输入文件