玩转 React 【第03期】:邂逅 React 组件

上期回顾
前文我们讲解了 React 模板 JSX,接着我们继续来看看 React 组件又是如何工作的呢?
组件化开发到了今天已经是大家的共识,在 React 中,组件同样也是组成我们整个项目的基本单元。
react 中组件可以将UI切分成一些的独立的、可复用的部件。组件的返回值是一个需要在也页面上显示的 React 元素,也就是说 React 中组件必须有返回值。示例如下:
function Hello (props){
return (<div>
<h1>Hello world</h1>
</div);
}
整个 Hello 就是一个组件,调用的时候,我们 可以直接 调用 <Hello /> 就可以,另外这里要注意,组件的命名必须是首字母大写。
创建组件
在 React 中创建组件有三种方式:
1) 无状态的函数式组件;
2) 基于ES5 的 React.createClass;
3) 基于 ES6 的 extends React.Component;
这三种方式都可以去创建一个 React 组件,但是在实际的使用过程中有什么不同呢?我们具体来看。
函数式组件
函数式组件,是为了创建纯粹的展示组件,也就是说函数式组件一旦创建了就不能修改,除非它的父级修改了才会引起它的修改,这样的好处就是性能较高,内部没有太多的东西,如 state 和 声明周期,当然生命周期和state是什么我们后边再详细说,这里我们先大概了解,这俩东西主要是用来更改组件的内容,以及组件修改后的一系列处理的。
函数式组件的编写方式如下:
function Hello (props[,context]){
return (<div>
<h1>Hello {props.name}</h1>
</div);
}
ReactDOM.render(<Hello name="MiaoV" />, node)
return 中就是我们要显示在页面上的内容,props 是父组件传入的信息,context 是父祖中传入的信息,关于这两项的具体内容我们也放在下篇内容中详细的讲解。
除了上述内容之外,函数式组件还有以下几个特征:
组件不会被实例化,而是直接解析成 reactElemnt,整体渲染性能得到提升
没有实例化,自然在组件内部我们也不能使用 this
组件无法访问生命周期的方法,这个我们已经介绍过
组件没有state,只能访问 props
函数式组件由于其优良的性能,个人建议如果一个组件的内部我们不需要控制它进行改变的话,尽量还是使用 函数式组件
React.createClass
React.createClass 是一种基于 ES5 的创建组件的方式。本质就是一个工厂,在 React.createClass(配置对象) 放入我们的配置对象,然后它会帮我们返回一个 React 组件,
示例如下:
let Fn = React.createClass({
render: function(){
return (
<div>
<h1 id="title">Hello React!</h1>
<h2 id={title}>Hello React!</h2>
<h2 className="box">class属性</h2>
<h2 style={ {background: 'red'} }>style属性</h2>
</div>
);
}
});
上述是 React.createClass 的使用方式,但是要注意 React.createClass 方法 在React 16 之后就已经取消了,所以我们就不再讨论这个方法,直接来看 ES6 的写法。
React.Component
React ES6中,如果要声明一个类式组件,我们需要从 React.Component 继承过来,具体写法如下:
class Hello extends React.Component {
render(){
return (
<h1>hello! {this.props.name}</h1>
);
}
}
ReactDOM.render(
<Hello name = "MiaoV" />
document.querySelector('#app')
);
在使用 React.Component 的时候,有一些问题是需要我们注意的:
在 React.Component 中我们必须要定义一个 render 方法,这个方法中的返回值,就是最终我们要渲染到页面中 ReactElement 。
组件在实际调用的时候,会生成一个实例化对象,所以组件的方法中的 this 就指向这个实例化对象。
props 这个属性中存储的是我们调用时传入的属性,也是默认的第0个参数,所以组件中如果定义了 constructor, 必须 使用 super 继承,另外必须 把第 0 个参数传入去,示例如下:
最后强调一下,组件的命名必须首字母大写。
class Hello extends React.Component {
constructor(props){
super(props);
}
render(){
return (
<h1>hello! {this.props.name}</h1>
);
}
}
关于组件的创建我们就先介绍到这,在下一篇中,我们会详细的讲解 props,state 以及组件其他的相关知识。
——以上是笔者归纳总结,如有误之处,欢迎指出。
订阅号ID:Miaovclass
关注妙味订阅号:“妙味前端”,为您带来优质前端技术干货;
玩转 React 【第03期】:邂逅 React 组件的更多相关文章
- Webpack + React 开发 03 props
React中组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloWorld name="John"> ,就是 HelloWorld 组件加入 ...
- 【React】354- 一文吃透 React 事件机制原理
大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...
- 《HelloGitHub月刊》第03期
<HelloGithub>第03期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...
- React Canvas:高性能渲染 React 组
React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...
- React学习(一)父子组件通讯
React父子组件之间通讯,利用props和state完成,首先React是单向数据流,父组件可以向子组件传递props: 实现父子组件双向数据流整体的思路是: 1,父组件可以向子组件传递props, ...
- 【每天半小时学框架】——React.js的模板语法与组件概念
[重点提前说:组件化与虚拟DOM是React.js的核心理念!] 先抛出一个论题:在React.js中,JSX语法提倡将 HTML 和 CSS 全都写入到JavaScrip ...
- React 深入系列1:React 中的元素、组件、实例和节点
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
- React Native入门教程2 -- 基本组件使用及样式
在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...
- react实战项目开发(2) react几个重要概念以及JSX语法
前言 前面我们已经学习了利用官方脚手架搭建一套可以应用在生产环境下的React开发环境.那么今天这篇文章主要先了解几个react重要的概念,以及讲解本文的重要知识JSX语法 React重要概念 [思想 ...
- 《HelloGitHub月刊》第 03 期
<HelloGithub>第03期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...
随机推荐
- linux中ping IP可以通但是主机名不通
在/etc/hosts中配置要ping的主机名称映射 例如: ping test1不通 在/etc/hosts中配置 ip地址 test1
- eclipse 快捷键Open Implementation 直接退出
遇到eclipse 快捷键Open Implementation 非正常退出.直接关闭的现象. 网查了一下 碰到一篇博客说 和google 输入法有关 卸载了google 输入法就好了 半信 ...
- jQuery -- touch事件之滑动判断(左右上下方向)
$("body").on("touchstart", function(e) { // 判断默认行为是否可以被禁用 if (e.cancelable) { // ...
- ASP.NET发送电子邮件(转)
原始地址:http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html(有代码下载,博主真是有操守) 1.补充知识 (1)POP ...
- Lua常用封装方法
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...
- centos 7 源代码安装mysql5.6
###### mysql ######### 引言:这里选用mysql5.6版本,5.7版本编译时间需要几个小时. 编译安装环境: yum -y install make gcc-c++ cmake ...
- 【Oracle】【7】去掉字符串中的空格/字符
SELECT TRIM(' 去除前后空格 ') FROM DUAL; SELECT REPLACE(' 去除 任意位置的空格 ', ' ', '') FROM DUAL; 扩展: 1,both, tr ...
- python中lambda的用法
一.lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 g = l ...
- ayit-#41. 因数的个数-数论
搞了两天发现是qpow时大数相乘爆精度了,以前没遇到过,因为大数检测时模数达到了1e18,所以qpow可能会爆,应该利用快速幂原理写一个快速加即可. 先筛出1e6以内的质数,然后把x里<=1e6 ...
- js 处理 cookie的存储与删除
<script> //JS操作cookies方法! //写cookies function setCookie(c_name, value, expiredays){ var exdate ...