React是什么?

官方文档上解释是:React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作“组件”。

一个简单的react组件是怎么样的?

在上一节我们创造一个react项目,现在我们创建的一个叫做HelloWorld.js的react组件,在App.js里引入该组件就行,引入代码为使用es6的import去引入,具体代码如下:

import HelloWorld from './components/HelloWorld
具体解释是import是es6语法,HelloWorld被引入的组件名,'./components/HelloWorld’在项目中组件的地址。

下面是我们创建的一个叫做HelloWorld.js的react组件。代码1

import React, { Component } from 'react'; // 引入react和react的Componentexport default class HellWorld extends Component { // 输出一个默认名字为HellWorld的类并继承了react的Component类render() {return (<div>HellWorld</div>)}
}

上面代码其实代价于下面代码:
代码2

import React, { Component } from 'react'; // 引入react和react的Componentclass HellWorld extends Component { //写一个HellWorld的类并继承了react的Component类render() {return (<div>HellWorld</div>)}
}
export default HellWorld // 输出一个默认名字为HellWorld的类

由此可清晰可见一个react的组件有三部分组成。一、引入react;二、书写一个类并继承react的Component类;三、输出默认类名。
其中二书写一个类,里面有一个render函数,这个函数里面可以写HTML的dom结构和js这里叫做jsx语法。
jsx的原理,是将dom解析为一个dom对象,上面代码解析后会变成如下所示代码:
代码3

import React, { Component } from 'react'export default class HellWorld extends Component {render() {return (//   <div>HellWorld</div>React.createElement("div",null,//这里写一个该dom包含的属性对象,比如{className:'bg-red',id:'app'},这表示这个div有class类为bg-red,id为app"HellWorld"))}
}

也就是说代码1和代码2、代码3渲染出来的效果是完全一样的。

重点:

1)render函数里面必须是一个dom标签包裹住其他dom标签,也就是说最外层的dom标签不能有兄弟dom.如果写两个并列的dom编辑器和浏览器都会报错如下图所示:


2)render函数里return返回里要写js需要{}包裹,代码如下:

import React, { Component } from 'react'import './index.css'export default class HelloWorld extends Component {render() {let a= 'HelloWorld---a'return (<div>{a}</div>)}
}

运行结果如下:

react中如何修改样式

修改样式有如下两种。一种是设置style,style里传递的是一个对象;一种是设置className(注意不是class,设置成class会报错),引入具有相应class类的css文件即可。具体表现形式和代码如下:

import React, { Component } from 'react'import './index.css' // 引入css文件export default class HelloWorld extends Component {render() {let a= 'HelloWorld---a'let stylea = {color:'blue'}return (<div>{/* 1、直接以对象的形式给style */}<div style={{color:'red'}}>HelloWorld</div>{/*2、 以对象变量的形式给style */}<div style={stylea}>HelloWorld</div>{/* 3、直接写class的css类名 */}<div className='bg-red'>{a}</div>{/* 4、利用js的正则表达式动态的写class的css类名 */}<div className={1+1>0?'bg-blue':''}>HelloWorld----b</div></div>)}
}

在项目中利用js的正则表达式去动态的改变项目里组件的样式是非常常见的。

react中状态怎么写?

第一种是直接在render外面写一个state对象,具体示例如下所示:

import React, { Component } from 'react'export default class HelloWroldState extends Component {state={hello:'HelloWroldState-----hello'}render() {return (<div><div>HelloWroldState</div><div>{this.state.hello}</div></div>)}
}

代码运行结果如下图所示:

第二种写法就是在render外面写一个constructor构造函数,请千万注意里面要加个super()不然会报错,具体代码如下:

import React, { Component } from 'react'export default class HelloWroldState extends Component {// state={//   hello:'HelloWroldState-----hello'// }constructor(){super()this.state={helloBlue:'HelloWroldState-----helloBlue'}}render() {return (<div><div>HelloWroldState</div>{/* <div style={{color:'red'}}>{this.state.hello}</div> */}<div style={{backgroundColor:'blue'}}>{this.state.helloBlue}</div></div>)}
}

一般正式项目开发时一般以第二种写法为主,可是做为小垃圾的我们也得认识人家第一种写法,不能说别人写错了,不然就有点贻笑大方了。

**注意:**这里的this是指向class组件。

React的state怎么变化?

做为一个js老手顾名思义一个js对象的值改变,我们传统的方法直接赋值改变就行了,比如:

let object={a:'3',b:'4'};
object.a = 8
console.log(object) // {a:8,b:4}

直接就修改了,但是React的state却是不能这样变化,它依赖于React的特性,需要调用setState方法。具体代码如下:

import React, { Component } from 'react'export default class HelloWroldState extends Component {// state={//   hello:'HelloWroldState-----hello'// }constructor(){super()this.state={helloBlue:'HelloWroldState-----helloBlue',num:0}}render() {return (<div><div>HelloWroldState</div>{/* <div style={{color:'red'}}>{this.state.hello}</div> */}<div style={{backgroundColor:'blue'}}>{this.state.helloBlue}</div><h1>{this.state.num}</h1><button onClick={this.click}>加一</button></div>)}click=()=>{this.setState({num:this.state.num+1})}
}

结果如下所示:

setState方法的注意事项

1、在同步方法中,setState方法是合并执行的,即它只会运行一次,而且还是异步的,异步更新状态,异步更新真实dom。具体看代码,代码如下:

import React, { Component } from 'react'export default class HelloWroldState extends Component {// state={//   hello:'HelloWroldState-----hello'// }constructor(){super()this.state={helloBlue:'HelloWroldState-----helloBlue',num:0}}render() {return (<div><div>HelloWroldState</div>{/* <div style={{color:'red'}}>{this.state.hello}</div> */}<div style={{backgroundColor:'blue'}}>{this.state.helloBlue}</div><h1>{this.state.num}</h1><button onClick={this.click}>加一</button></div>)}click=()=>{this.setState({num:this.state.num+1})console.log('log1',this.state.num)this.setState({num:this.state.num+1})console.log('log2',this.state.num)this.setState({num:this.state.num+1})console.log('log3',this.state.num)}
}

结果如下图所示:


由上图可以看出来num从0变到1,说明click方法里面的setState方法都合并了只执行了一次,但是三个console打印里面都是0,说明setState是异步的nun打印出来没变,但是页面上是有变化的说明setState是起了作用的。

2、在原生方法和setTimeout异步方法中,setState同步执行,状态同步更新,dom同步渲染.
3、setState的第二个参数是回调函数,可以取到变化值。

import React, { Component } from 'react'export default class HelloWroldState extends Component {// state={//   hello:'HelloWroldState-----hello'// }constructor(){super()this.state={helloBlue:'HelloWroldState-----helloBlue',num:0}}render() {return (<div><div>HelloWroldState</div>{/* <div style={{color:'red'}}>{this.state.hello}</div> */}<div style={{backgroundColor:'blue'}}>{this.state.helloBlue}</div><h1>{this.state.num}</h1><button onClick={this.click}>加一</button></div>)}click=()=>{this.setState({num:this.state.num+1},()=>{console.log('log000',this.state.num)})this.setState({num:this.state.num+1},()=>{console.log('log001',this.state.num)})this.setState({num:this.state.num+1},()=>{console.log('log002',this.state.num)})console.log('log1',this.state.num)this.setState({num:this.state.num+1})console.log('log2',this.state.num)this.setState({num:this.state.num+1})console.log('log3',this.state.num)}}

执行结果

4、setState函数调用一次会引发render函数重新渲染。没有state的变化则render不会重新渲染。这点在于组件里数据渲染变化的应用中很是重要
5、react中要特别注意this的指向问题,所以为了规避这个问题,一般都会选择箭头函数,因为箭头函数的this是指向他的非箭头函数的方法的,所以会一直指向到class,从而不会发生错误。

闲话

隔了很久重新捡起,感觉还是有点小吃力,祝大家温故而知新。

重学React基础知识整理(二)相关推荐

  1. pytorch基础知识整理(二)数据加载

    pytorch数据加载组件位于torch.utils.data中. from torch.utils.data import DataLoader, Dataset, Sampler 1, torch ...

  2. 重学java基础第二十二课:IDEA安装

  3. 重学java基础第十二课:计算机语言发展史

  4. 电学基础知识整理(二)

    电学基础知识整理(二) 电容和电容器 电容器 两个靠近且夹着绝缘电介质的导体,这样的系统称为电容器. 电容器可以存储电荷,从而可以储能. 电容 指在给定电位差下自由电荷的储藏量,记为C,国际单位是法拉 ...

  5. 小学生学c语言基础知识,小学数学1-6年级基础知识整理,孩子学习用得上

    小学数学1-6年级基础知识整理,孩子学习用得上 作者:网编整理 丨 来源:网络 丨 发布时间:2020-04-16 14:35丨 分享 (一到六年级) 小学一年级初步认识加减法.学会基础加减. 小学二 ...

  6. CSP-S初赛基础知识整理

    文章目录 CSP-S初赛基础知识整理 RT [1]计算机基础知识 计算机系统的组成 计算机硬件的五大组成 [1-2]进制及其转化和运算 [1-2]二进制 [1]基本定义及应用 [1]基本运算 [2]位 ...

  7. 矩阵论(零):线性代数基础知识整理(5)——特征值与相似

    矩阵论专栏:专栏(文章按照顺序排序) 本篇博客的上篇是矩阵论(零):线性代数基础知识整理(4)--线性空间与线性变换,梳理了线性空间与线性变换的相关内容.本文主要整理矩阵的特征值与相似的相关内容. 方 ...

  8. react基础知识1

    React基础知识1 一.React的基本认识 1.1 官网:https://reactjs.org/ 1.2 介绍描述 <1> 用于构建用户界面的 JavaScript 库(只关注于Vi ...

  9. 计算机二级c语基础知识,计算机二级C语基础知识整理.doc

    计算机二级C语基础知识整理 1.1 算法 算法:是一组有穷指令集,是解题方案的准确而完整的描述.通俗地说,算法就是计算机解题的过程.算法不等于程序,也不等于计算方法,程序的编制不可能优于算法的设计. ...

最新文章

  1. [转载]项目风险管理七种武器-多情环
  2. 洛谷——P2083 找人
  3. mysql修改表、字段、库的字符集(转)
  4. 速攻蓝牙NRF52832系列教程之方法篇(三)
  5. python3解释器执行long(10)的结果为_Python3解释器执行'AB2C3D'.lower().title()的结果是( )。...
  6. C链表反转(时间复杂度O(n))
  7. struts2文件上传,下载
  8. iOS输入框禁止输入emoji表情
  9. 思想的交流,扩大视野
  10. MIPS处理器 CPU数据通路
  11. hadoop 文件上传
  12. 网站 小图标 大全 url
  13. docker配置加速器的几种方案
  14. 6.插入脚注后,正文空一行
  15. 关于小米历史官方刷机包
  16. 在Ubuntu 8.10 中安装使用新一代输入法ibus Deb包下载_Ubuntu,Linux,ibus输入法,拼音,五笔,搜狗
  17. python写酒店管理系统报告_酒店管理系统e-r图_酒店系统管理实验报告
  18. 关于雪崩击穿温度系数
  19. CSMACA 与 CSMA/CD 区别
  20. python词云分析--媒体近期的讨论热点

热门文章

  1. 计算机网络传输层简介
  2. 广州蝶梦网络科技有限公司的互联网意义
  3. npm 废弃/删除(五)
  4. virtualbox虚拟机环境搭建之一---Ubuntu1804安装Virtualbox,在Virtualbox中导入Win7镜像
  5. python远程使用ants中的配准命令和N4biasfiledcorrection注意点
  6. java白皮书是什么_ABEL 更新白皮书,对我们意味着什么?
  7. echarts 点击地图画布空白处 触发事件
  8. SpringBoot教程目录
  9. 英语软件的日志怎么写
  10. win10的wsapp把电脑卡死