返回介绍

Children

发布于 2019-12-27 00:37:38 字数 2761 浏览 984 评论 0 收藏 0

Rax 的核心是组件。你可以像嵌套 html 标签那样嵌套 Rax 组件,因为它类似于标记,使得编写 jsx 变得很容易。因为我们使用的是 javascript,我们可以改变 props.children。我们可以给他们传递特殊的属性,来决定是否渲染他们并且可以按照我们的意愿去操作他们。
Children 提供了用于处理 props.children 不透明数据结构的实用方法。从本质上来讲,props.children 可以是任何的类型,比如数组、函数、对象等等。

方法

Children.map(children, function[(thisArg)])

在 children 里的每个直接子节点上调用一个函数,像数组一样工作,并将 this 设置为 thisArg。如果 children 是一个数组,它将被遍历并为数组中的每个子节点调用该函数。如果子节点为 null 或是 undefined,则此方法将返回 null 或是 undefined,而不会返回数组。
注意:如果 children 是一个 Fragment 对象,它将被视为单一子节点的情况处理,而不会被遍历。

import Children from 'rax-children';

function Hello({ children }) {
  return Children.map(children, (child, i) => {
    if ( i < 1 ) return;
    return child;
  });
}

function App() {
  return <Hello>
    <Text>Hello</Text>
    <Text>Rax</Text>
  </Hello>
}

Children.forEach(children, function[(thisArg)])

与 Children.map() 类似,但它不返回处理后的节点数组,仅遍历节点,多用于处理数据。

function Hello({ children }) {
  Children.forEach(children, (child, i) => {
    if ( i < 1 ) {
      child.props.children = 'Hello' + child.props.children
    };
  });
  return children
}

function App() {
  return <Hello>
    <Text>World</Text>
    <Text>Rax</Text>
  </Hello>
}

Children.count(children)

返回 children 中的元素总数量,等同于通过 map 或 forEach 调用回调函数的次数。

function Hello({ children }) {
  const count = Children.count(children);
  return children
}

function App() {
  return <Hello>
    <Text>World</Text>
    <Text>Rax</Text>
  </Hello>
}

Children.only(children)

验证 children 是否只有一个子节点(一个 React 元素),如果有则返回它,否则此方法会抛出错误。
当然你也可以使用 propTypes 去验证,但这只会在控制台有一个警告。

function Hello({ children }) {
  const only = Children.only(children);
  return only ? children : null;
}

function App() {
  return <Hello>
    <Text>World</Text>
  </Hello>
}

Children.toArray(children)

将 children 这个复杂的数据结构以数组的方式扁平展开并返回,并为每个子节点分配一个 key。当你想要在渲染函数中操作子节点的集合时,它会非常实用,特别是当你想要在向下传递 this.props.children 之前对内容重新排序或获取子集时。

function Hello({ children }) {
  const [state, setState] = useState('Rax');
  return Children.toArray(children).filter(child => child.props.children === state);
}

function App() {
  return <Hello>
    <Text>Rax</Text>
    <Text>World</Text>
  </Hello>
}

参考

JSX

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文