React入门
React简介
官网
介绍描述
- 用于动态构建用户界面的 JavaScript 库(只关注于视图)
- 由Facebook开源
React的特点
- 声明式编码
- 组件化编码
- React Native 编写原生应用
- 高效(优秀的Diffing算法)
React高效的原因
- 使用虚拟(virtual)DOM,不总是直接操作页面真实DOM。
- DOM Diffing算法,最小化页面重绘。
React的基本使用
相关的js库
- react.js:React核心库。
- react-dom.js:提供操作DOM的react扩展库。
- babel.min.js:解析JSX语法代码转为JS代码的库。
基本使用:
1 |
|
创建虚拟DOM的两种方式
纯JS方式(一般不用)
1 |
|
JSX方式
1 |
|
虚拟DOM与真实DOM
- 虚拟DOM对象最终都会被React转换为真实的DOM
- 我们编码时基本只需要操作react的虚拟DOM相关数据, react会转换为真实DOM随着变化而更新。
1 |
|
React JSX
JSX
全称: JavaScript XML
react定义的一种类似于XML的JS扩展语法:
本质是React.createElement(component,props,children)
方法的语法糖
babel.js的作用
浏览器不能直接解析JSX代码, 需要babel转译为纯JS的代码才能运行
只要用了JSX,都要加上type="text/babel"
, 声明需要babel来处理
渲染虚拟DOM(元素)
- 语法:
ReactDOM.render(virtualDOM,containerDOM)
- 作用: 将虚拟DOM元素渲染到页面中的真实容器DOM中显示
- 参数说明
- 参数一: 纯js或jsx创建的虚拟dom对象
- 参数二: 用来包含虚拟DOM元素的真实dom元素对象(一般是一个div)
1 |
|
JSX练习
1 |
|
模块与组件、模块化与组件化的理解
模块
- 理解:向外提供特定功能的js程序, 一般就是一个js文件
- 为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂
- 作用:复用js, 简化js的编写, 提高js运行效率
组件
- 理解:用来实现局部功能效果的代码和资源的集合(html/css/js/image等等)
- 为什么要用组件: 一个界面的功能更复杂
- 作用:复用编码, 简化项目编码, 提高运行效率
模块化
当应用的js都以模块来编写的, 这个应用就是一个模块化的应用
组件化
当应用是以多组件的方式实现, 这个应用就是一个组件化的应用
React面向组件编程
基本理解和使用
使用React开发者工具调试
下载 react_dev_tools
谷歌浏览器插件:https://share.weiyun.com/90Vjmvt6
函数式组件
1 |
|
类式组件
1 |
|
注意
- 组件名必须首字母大写
- 虚拟DOM元素只能有一个根元素
- 虚拟DOM元素必须有结束标签
组件三大核心属性之state
理解
- state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合)
- 组件被称为”状态机”,通过更新组件的state来更新对应的页面显示(重新渲染组件)
强烈注意
组件中render方法中的this为组件实例对象
组件自定义的方法中this为undefined,如何解决?
- a) 强制绑定this: 通过函数对象的bind()
- b) 箭头函数
状态数据,不能直接修改或更新
1 |
|
简写:
1 |
|
组件三大核心属性之props
理解
- 每个组件对象都会有props(properties的简写)属性
- 组件标签的所有属性都保存在props中
作用
- 通过标签属性从组件外向组件内传递变化的数据
注意:
组件内部不要修改props数据
编码操作
props基本使用:
1 |
|
对props进行限制:
1 |
|
props简写方式:
1 |
|
函数式组件使用props:
1 |
|
组件三大核心属性之refs
理解
组件内的标签可以定义ref属性来标识自己
编码
字符串形式的ref:
1 |
|
回调函数形式的ref:
1 |
|
回调ref中回调执行次数的问题:
1 |
|
createRef的使用:
1 |
|
事件处理
通过onXxx属性指定事件处理函数(注意大小写)
- 1) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
- 2) React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
通过event.target得到发生事件的DOM元素对象
1 |
|
React收集表单数据
受控组件
1 |
|
非受控组件
1 |
|
函数柯里化
高阶函数-函数柯里化
1 |
|
不用函数柯里化的实现
1 |
|
组件的生命周期
理解
- 组件从创建到死亡它会经历一些特定的阶段。
- React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
- 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。
引出生命周期
1 |
|
生命周期(旧)
1 |
|
生命周期(新)
1 |
|
重要的钩子
- render:初始化渲染或更新渲染调用
- componentDidMount:开启监听, 发送ajax请求
- componentWillUnmount:做一些收尾工作, 如: 清理定时器
即将废弃的钩子
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
现在使用会出现警告,下一个大版本需要加上UNSAFE_
前缀才能使用,以后可能会被彻底废弃,不建议使用。
getSnapShotBeforeUpdate的使用场景
1 |
|
key的作用
1 |
|
React脚手架
使用 create-react-app 创建 react 应用
react脚手架
xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目
- 包含了所有需要的配置(语法检查、jsx编译、devServer…)
- 下载好了所有相关的依赖
- 可以直接运行一个简单效果
react提供了一个用于创建react项目的脚手架库: create-react-app
项目的整体技术架构为: react + webpack + es6 + eslint
使用脚手架开发的项目的特点: 模块化, 组件化, 工程化
创建项目并启动
先安装node.js,如果要使用yarn,则安装yarn
1 | npm install --global yarn |
第一步,全局安装:npm i -g create-react-app
第二步,切换到想创项目的目录,使用命令:create-react-app hello-react
第三步,进入项目文件夹:cd hello-react
第四步,启动项目:npm start
,或者 yarn start
react脚手架项目结构
1 | public ---- 静态资源文件夹 |
后续更新!