javascript - 重用包含上下文的组件
问题描述
我有一个在内部使用上下文的复杂组件。例如:
// ComplexComponent.tsx
const MyContext = createContext({});
export function useMyContext() {
return useContext(MyContext);
}
export default function ComplexComponent({ fooValue }) {
return (
<MyContext.Provider value={{ foo: fooValue }}>
<NestedComponent />
</MyContext.Provider>
);
}
// NestedComponent.tsx
import { useMyContext } from './ComplexComponent';
export default function NestedComponent() {
const { foo } = useMyContext();
return (
<div>
{ foo }
</div>
);
}
有没有办法动态生成上下文,以便我可以在代码的其他地方重用这个组件(同时发生一些实例)?
显然我必须把createContext
函数放在里面 ComplexComponent
,但是我将无法导入useMyContext
。
解决方案
从Context
文档:
Context 旨在共享可被视为 React 组件树“全局”的数据
据我了解您的问题是,我认为 React 不Context
支持您想要实现的目标。
作为一种潜在的替代方法,您可以定义一个可以从嵌套组件调用的 setter 函数,但是:
// ComplexComponent.tsx
// ...
export default function ComplexComponent({ fooValue }) {
const [foo, setFoo] = useState(fooValue);
return (
<MyContext.Provider value={{ foo, setFoo }}>
<NestedComponent />
</MyContext.Provider>
);
}
然后像这样“动态地”设置它:
// NestedComponent.tsx
// ...
export default function NestedComponent() {
const { foo, setFoo } = useMyContext();
setFoo("New Foo Value");
return (
<div>
{ foo }
</div>
);
}
这里需要注意的是,这将更新foo
上下文中每个消费者的值。我会争辩说,如果您想要具有不同值的不同组件foo
,最好将fooValue
's 传递给它们作为props
.
推荐阅读
- javascript - MouseEvent 在 IE 中不起作用,还有其他方法吗?
- twilio - Twilio 可编程聊天 API - 更新成员频道角色
- php - 67个动态复选框,4个被选中后如何禁用所有复选框?
- php - php printf 使用 %s 表示数字
- kubernetes - 如何在 Spring Boot 配置服务器中使用执行器刷新所有 kubernetes pod
- c# - 如何从 XML 中获取值并迭代以存储在变量中
- javascript - mat-tree 棱角材料定制
- python - 如何使用 python 仅打印此列表中的价格并访问它
- c# - 如何从 C# 中的服务器端脚本打开本地机器 exe 文件?我不想要 ActiveXObect
- laravel - Laravel Echo 和 Whisper,listenForWhisper 不起作用