博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React.js 小书 Lesson22 - props.children 和容器类组件
阅读量:5226 次
发布时间:2019-06-14

本文共 1702 字,大约阅读时间需要 5 分钟。

  • 作者:
  • 原文链接:
  • 转载请注明出处,保留原文链接和作者信息。

有一类组件,充当了容器的作用,它定义了一种外层结构形式,然后你可以往里面塞任意的内容。这种结构在实际当中非常常见,例如这种带卡片组件:

组件本身是一个不带任何内容的方形的容器,我可以在用这个组件的时候给它传入任意内容:

基于我们目前的知识储备,可以迅速写出这样的代码:

class Card extends Component { render () { return ( 
{this.props.content}
) } } ReactDOM.render(

React.js 小书

开源、免费、专业、简单
订阅:
} />, document.getElementById('root') )

我们通过给 Card 组件传入一个 content 属性,这个属性可以传入任意的 JSX 结构。然后在 Card 内部会通过 {this.props.content} 把内容渲染到页面上。

这样明显太丑了,如果 Card 除了 content 以外还能传入其他属性的话,那么这些 JSX 和其他属性就会混在一起。很不好维护,如果能像下面的代码那样使用 Card 那想必也是极好的:

ReactDOM.render(  

React.js 小书

开源、免费、专业、简单
订阅:
, document.getElementById('root') )

如果组件标签也能像普通的 HTML 标签那样编写内嵌的结构,那么就方便很多了。实际上,React.js 默认就支持这种写法,所有嵌套在组件中的 JSX 结构都可以在组件内部通过 props.children 获取到:

class Card extends Component { render () { return ( 
{this.props.children}
) } }

把 props.children 打印出来,你可以看到它其实是个数组:

React.js 就是把我们嵌套的 JSX 元素一个个都放到数组当中,然后通过 props.children 传给了 Card

由于 JSX 会把插入表达式里面数组中的 JSX 一个个罗列下来显示。所以其实就相当于在 Card 中嵌套了什么 JSX 结构,都会显示在 Card 的类名为 card-content 的 div元素当中。

这种嵌套的内容成为了 props.children 数组的机制使得我们编写组件变得非常的灵活,我们甚至可以在组件内部把数组中的 JSX 元素安置在不同的地方:

class Layout extends Component { render () { return ( 
{this.props.children[0]}
{this.props.children[1]}
) } }

这是一个两列布局组件,嵌套的 JSX 的第一个结构会成为侧边栏,第二个结构会成为内容栏,其余的结构都会被忽略。这样通过这个布局组件,就可以在各个地方高度复用我们的布局。

总结

使用自定义组件的时候,可以在其中嵌套 JSX 结构。嵌套的结构在组件内部都可以通过 props.children 获取到,这种组件编写方式在编写容器类型的组件当中非常有用。而在实际的 React.js 项目当中,我们几乎每天都需要用这种方式来编写组件。

课后练习

*


因为第三方评论工具有问题,对本章节有任何疑问的朋友可以移步到  发帖,我会回答大家的疑问。

转载于:https://www.cnblogs.com/huzidaha/p/7813457.html

你可能感兴趣的文章
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
js += 含义(小知识)
查看>>
B2321 [BeiJing2011集训]星器 数学&&物理
查看>>
201571030319 四则运算
查看>>
RestTemplate 调用本地服务 connection refused
查看>>
.NET方向高级开发人员面试时应该事先考虑的问题
查看>>
台达PLC modbus 不支持04功能码
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>