React:Composition
在日常的UI构建中,经常会遇到一种情况:组件本身更多是作为一个容器,它所包含的内容可能是动态的、未预先定义的。这时候它的内容取决另一个组件或外部的输入。比如弹层。
props.children:
React在组件中提供了props.children这个内置变量。当我们创建一个用作容器的组件时,在其返回的JSX中插入{props.children},此时{props.children}表示将来容器中需要插入的的内容。
比如我们创建一个带边框的div作为容器,
//一个带边框的div组件
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
以后某个组件在输出的模板中调用了FancyBorder后,所有位于<FancyBorder></FancyBorder>标签内的内容将被看作FancyBorder组件的props.children。
function WelcomeDialog() {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
Welcome
</h1>
<p className="Dialog-message">
Thank you for visiting our spacecraft!
</p>
</FancyBorder>
);
}
当然,更普遍的情况是,我们要分发到容器上的内容,是需要指定位置的。
比如某段文字应该放在容器的右边,而某条评论或图片放在左边。这时候怎么办呢?
props.children给了我们启发。
JSX,也即要渲染的内容,可以作为参数prop传递给组件,然后在组件中恰当的位置进行渲染。要知道,React Element用typeof操作符判断时,其输出是‘object’,对象当然可以作为参数传递给函数啦!
function SplitPane(props) {
return (
<div className="SplitPane">
<div className="SplitPane-left">
{props.left}
</div>
<div className="SplitPane-right">
{props.right}
</div>
</div>
);
}
function App() {
return (
<SplitPane
left={
<Contacts />
}
right={
<Chat />
} />
);
}
这就解决了组件内容的嵌套和分发。
在React构建UI组件时,变量、方法、组件都可以作为props传递给子组件,实现单向的数据传输。
Specialization:定制化处理(我是这么理解啦)
我们常常需要用组件来实现一个特定的模块/视图。比如一个弹层,可以是警告,也可以是登陆框,更可以是某个内容展示。
既然我们可以通过props来分发内容,自然可以利用它来对定制一个符合我们期望的组件。
通过给容器传入各种参数、React Element,我们完全可以控制在模板的什么地方展示什么内容。这一切都通过props进行集合处理。
例子就不给了,跟上边一样,记住:
props.children分发容器标签之中的内容
props.xxx 分发其他指定内容
React:Composition的更多相关文章
- React之Composition Vs inheritance 组合Vs继承
React的组合 composition: props有个特殊属性,children,组件可以通过props.children拿到所有包含在内的子元素, 当组件内有子元素时,组件属性上的child ...
- 蒲公英 · JELLY技术周刊 Vol.21 -- 技术周刊 · React Hooks vs Vue 3 + Composition API
蒲公英 · JELLY技术周刊 Vol.21 选 React 还是 Vue,每个人心中都会有自己的答案,有很多理由去 pick 心水的框架,但是当我们扪心自问,我们真的可以公正的来评价这两者之间的差异 ...
- composition api和react hooks的对比
一. 我的走位: 保持中立 1. 各有各的好处, 谁也别说谁 2. 一个东西带来的好处, 相应的副作用肯定也有, 人无完人 二 . vue3 的composition api 和 rea ...
- React JS快速开始手册
怎样用React JS构建一个用户界面?本文将快速地给你一个React JS的概览.代码,请君移步react-starter 概念 React只有很少的API,这使得它很容易去学习与理解.当然,使用它 ...
- React Native 的ES5 ES6写法对照表
模块 引用 在ES5里,如果使用CommonJS标准,引入React包基本通过require进行,代码类似这样: //ES5 var React = require("react" ...
- React/React Native 的ES5 ES6写法对照表
//es6与es5的区别很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component ...
- ANGULAR 2 FOR REACT DEVELOPERS
Now that Angular 2 is in beta, the time has come for us to drop everything and learn something new, ...
- React/React Native 的ES5 ES6写法对照表-b
很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教 ...
- React文档翻译 (快速入门)
翻译自react的大部分文档,方便自己查阅. 目录 生命周期 实例化 存在期 销毁期 state Do Not Modify State Directly State Updates May Be A ...
随机推荐
- vscode--常用插件&同步
1.setting.json文件 { "files.autoSave": "off", "extensions.ignoreRecommendatio ...
- [wp]xctf newscenter
手工注入 查询所有数据库名称和表名 ' union select 1,table_schema,table_name from information_schema.tables# 发现就两个数据库i ...
- xpath爬虫实战-爬取小说斗罗大陆第四部
爬取思路 用到的第三方库文件 lxml,requests,fake_agent 用fake_agent里的UserAgent修饰爬虫 用requests进行基本的请求 用lxml进行html的分析 用 ...
- Logon Trigger Example (C++)
This C++ example shows how to create a task that is scheduled to execute Notepad when a user logs on ...
- Scala教程之:scala的参数
文章目录 默认参数值 命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数. def log(m ...
- 设置linux中Tab键的宽度(可永久设置)
一.仅设置当前用户的Tab键宽度输入命令:vim ~/.vimrc然后:set tabstop=6 //将Tab键的宽度设置为6保存:ctrl+z+z(或:wq!)OK!二.设置所有用户的Tab键 ...
- Linux系统管理第一二三四章 系统管理 目录和文件管理 安装及管理程序 账号管理
命令 功能 序号 第一章 cd 切换目录 1 stat 查看文件状态信息 2 cp 复制 -f -i -p -r 3 du 统计磁盘的大小 4 find 精细查找文件和目录 5 help 帮助 ...
- vue2.0学习笔记(第八讲)(vue-cli的使用)
vue-cli相当于脚手架,可以帮助我们自动生成模板工程.其内部集成了很多的项目模板,如simple.webpack.webpack-simple等.其中webpack这个项目模板适用于大型项目的开发 ...
- 解决vue中BMap未定义问题
原文链接: 点我 最近在项目中使用了百度地图来显示物流信息,实现方式有两种: 引用Vue Baidu Map引用BMap存在的问题:\color{red}{存在的问题:}存在的问题::使用BMap可以 ...
- 震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
这里还有数据库相关的优质文章:快戳我,快戳我