上期回顾

  • 前文我们讲解了 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 是父祖中传入的信息,关于这两项的具体内容我们也放在下篇内容中详细的讲解。

除了上述内容之外,函数式组件还有以下几个特征:

  1. 组件不会被实例化,而是直接解析成 reactElemnt,整体渲染性能得到提升

  2. 没有实例化,自然在组件内部我们也不能使用 this

  3. 组件无法访问生命周期的方法,这个我们已经介绍过

  4. 组件没有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 组件的更多相关文章

  1. Webpack + React 开发 03 props

    React中组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloWorld name="John"> ,就是 HelloWorld 组件加入 ...

  2. 【React】354- 一文吃透 React 事件机制原理

    大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...

  3. 《HelloGitHub月刊》第03期

    <HelloGithub>第03期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

  4. React Canvas:高性能渲染 React 组

    React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...

  5. React学习(一)父子组件通讯

    React父子组件之间通讯,利用props和state完成,首先React是单向数据流,父组件可以向子组件传递props: 实现父子组件双向数据流整体的思路是: 1,父组件可以向子组件传递props, ...

  6. 【每天半小时学框架】——React.js的模板语法与组件概念

           [重点提前说:组件化与虚拟DOM是React.js的核心理念!]        先抛出一个论题:在React.js中,JSX语法提倡将 HTML 和 CSS 全都写入到JavaScrip ...

  7. React 深入系列1:React 中的元素、组件、实例和节点

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...

  8. React Native入门教程2 -- 基本组件使用及样式

    在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...

  9. react实战项目开发(2) react几个重要概念以及JSX语法

    前言 前面我们已经学习了利用官方脚手架搭建一套可以应用在生产环境下的React开发环境.那么今天这篇文章主要先了解几个react重要的概念,以及讲解本文的重要知识JSX语法 React重要概念 [思想 ...

  10. 《HelloGitHub月刊》第 03 期

    <HelloGithub>第03期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

随机推荐

  1. hdoj1043

    8数码问题有解:除0外逆序数%2相等.16数码有解:除0外,如果0的行数相差奇数个,逆序也差奇数个,vice versa.

  2. Confluence 6 为一个空间应用一个主题

    主题允许你对 Confluence 的外表和显示进行自定义.你的 Confluence 空间管理员可以到 The Atlassian Marketplace 上下载主题. 一旦一个主题被安装到 Con ...

  3. HTML页面加载完毕后运行的js

    Js方法:<script type=”text/javascript”> window.onload=function (){ var userName=”xiaoming”; alert ...

  4. Django中CBV及其源码解释

    FBV(function base views) 就是在视图里使用函数处理请求. CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的编程语言,如果只 ...

  5. Tree总结

    树结构问题因为容易写出解法,因此经常出现在面试题中 1. 树的种类 1) Tree 2) Binary Trees 3) Binary Search Trees(BST) : used to sort ...

  6. 廖雪峰网站:学习python函数—递归函数(四)

    # 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 # 计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: # fact ...

  7. virtualbox 中centOS在不能ssh

    这个重要跟虚拟机的网络设置有关系.废话不多说. 针对一个网卡的形式.可以如下进行配置 1.网络-- 连接方式还选择“网络地址转换(NAT)” 其他不变,展开高级,设置端口转发  主机IP设为本机IP, ...

  8. 【LeetCode】数组移除元素

    链表等复杂数据结构用多了,简单的数组操作也不能遗忘! 1. 给定一个有序数组,移除所有重复元素并返回新的数组长度,不能分配额外数组的内存空间. e.g. 给定输入的数组 = [1,1,2],函数应当返 ...

  9. [luogu P3195] [HNOI2008]玩具装箱TOY

    [luogu P3195] [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...

  10. Utils--Cookie工具类

    Utils--Cookie工具类 package com.taotao.manage.util; import java.io.UnsupportedEncodingException; import ...