React 中 `children` 属性一个有意思的点

480 阅读1分钟

一个 React 组件结构

const App = () => (
  <A>
    <B>
      <C />
    </B>
  </A>
);

A B C 3 个组件,都有自己内部的 state

根据我们对 React 的了解,如果 C 更新,绝对不会影响到 A

那如果是A 更新呢?会引起 C更新吗?答案是:不会

父组件?

根据我们对 React 的了解:

父组件更新将触发子组件更新。

在这里,我们很容易把 A 称为 C父组件。但其实,A 不是 C 的父组件

父组件 应该是直接使用 <C /> 的组件,看上文结构,App 才是 C 的父组件

写成这样的话更直观一点:

const App = () => (
  <A children={<B children={<C />} />} />
);

A 中包含的内容(children),只是父组件(App)传给他的 props 而已,A 不可能是 props 的父组件。

AC 是独立的,它们只是结构上嵌套,但逻辑上没什么依赖。

A 如何触发 C 更新?

只有 A 内部直接使用 <C /> 的时候,比如:

const A = () => (
  <B>
    <C />
  </B>
);

const App = () => (
  <A />
);

这样 A 才是 C 的父组件,A 更新才能触发 C 更新。

我是不是在哪见过?

是的,在《Before You memo()》这里:

overreacted.io/before-you-…

组件结构上的嵌套,是依赖 children 这根"电线"来实现的。

children 是个占位符,代表了所处位置,但它本身只是传入组件的一个 js 数据。

这是不是挺绕的?

这确实挺特么绕的。

但只需要记住:A 不是 C 的父组件,App 才是父组件!