什么是 react 中的父子耦合以及它与上下文的关系
What is parent-child coupling in react and how does it relate to context?
我正在阅读 React 的上下文>父子耦合文档。我无法从文档中获取什么父子耦合。通常这一行:
通过在菜单组件中传递相关信息,每个菜单项都可以与包含的菜单组件进行通信。
代码为:
<Menu>
<MenuItem>aubergine</MenuItem>
<MenuItem>butternut squash</MenuItem>
<MenuItem>clementine</MenuItem>
</Menu>
正如文章所提到的,React 中的数据流通常是通过将props
从父组件传递到子组件来完成的。但是,在某些情况下,这种prop
共享可能会变得乏味,在这些情况下,我们会使用 context
.
文档中的示例描述了连续串接颜色prop
最终会变得烦恼,但是在大多数情况下,当prop
链比两三层深得多时,您会使用context
。一个更好的例子可能是 Redux 中的store
。
例如,那些使用 Redux 但没有实现 react-redux 的人必须从 context
访问store
。现在,假设您有一个嵌套非常深的组件(孙子的孙子),并且它需要访问store
- 好吧,您可以:
- 通过
props
传递store
。但是,这意味着任何不需要访问store
的中间组件都必须将其作为prop
,以便将其传递给它下面的某个地方需要它的child
。添加批量和样板。 - 将
store
附加到高级组件context
。因此,任何在其自身中指定contextTypes
的子组件都可以访问context
,从而访问store
。通过这样做,我们不必担心 注入任何中间组件 不必要的props
,因为我们可以直接访问context
。
请记住,context
是选择加入的,因此只有明确指定contextTypes
的组件才能访问context
,如果在其上方定义了
使用props
Parent (Passes props with a store property)
|
+-> props -> Child
|
+-> props -> Grandchild
|
+-> props -> Great-Grandchild
|
+-> render() -> this.props.store.getState().message
使用context
Parent (Defines childContextTypes with store property)
|
+ -> Child
|
+ -> Grandchild
|
+ -> Great-Grandchild (Opts-in by defining contextTypes with a store property)
|
+-> render() -> this.context.store.getState().message
更新(参考JMM发布的此问题):
它指的是什么 API?
我的理解是,这是指父组件在上下文中存储函数的能力,子组件可以访问和调用这些函数,从而创建一个作用域 API。
这是什么意思:
each MenuItem can communicate back to the containing Menu component
.
根据上述规定,如果在上下文中声明了一个函数,并且MenuItem
通过contextTypes
选择加入以获取该函数,则MenuItem
可以调用它,从而与另一个组件进行通信。
考虑以下示例:
ReactDOM.render(
<Menu>
<MenuItem>aubergine</MenuItem>
<MenuItem>butternut squash</MenuItem>
<MenuItem>clementine</MenuItem>
</Menu>, mountNode
);
当 Menu 在库代码中实现并且无权访问 MenuItem 时,或者 MenuItems 与 Menu 中的其他任意组件一起洗牌时,可能会发生这种情况。
Menu 是 MenuItem 的父项,但不是 MenuItem 的所有者,因此,它不能直接在 MenuItems 上设置props
。解决这个问题的一种方法是用新的道具克隆每个孩子。但如果嵌套组件种类繁多,有的可以接收冗余道具。
另一种方法是从context
中的 Menu 传递数据,并让任意子组件访问它。
- 将函数的上下文应用于javascript变量
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 使用JQuery的动态上下文菜单
- 如何访问UIWebView'的子窗口上下文
- 气质的“nestRemoting()”有时可以'找不到关系
- 如何在Parse中创建一对多关系
- Ext.js从json构建模型关系的问题
- JQuery在单击正文时隐藏上下文菜单
- JQuery上下文菜单显示/隐藏问题
- JSDoc:模块和名称空间之间的关系是什么
- 单元测试依赖关系没有被嘲笑
- 如何从HTTP上下文对象中获取Post数据
- FRP 中 EventStreams 的循环依赖关系
- HTML字符串作为上下文
- 节点模块依赖关系
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 丢失对象“;这个“;方法中的上下文
- 什么是 react 中的父子耦合以及它与上下文的关系
- 共享上下文之间的共同依赖关系
- 一种处理多个requirejs上下文之间常见依赖关系的实践