React全家桶学习笔记
1. React 的基本认识
React用于构建用户界面的JS库
1.1 React 特点
1. Declarative
2. Component-Based
3. Learn Once, Write Anywhere(支持客户端服务器渲染)
4. 高效
4.1 虚拟DOM,不总是直接操作DOM
4.2 DOM Diff 算法,最小化页面重绘
5. 单向数据流
2. 使用React
2.1 直接引入
<script src="https://unpkg.com/react@16/umd/react.production.min.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
2.2 JSX - JavaScript XML
const v1 = React.createElement("h2", {id:myId.toLowerCase()}, msg.toUpperCase());
const v2 = <h3 id={myId.toUpperCase()}>{msg.toLowerCase()}</h3>;
2.3 渲染DOM
ReactDOM.render(v2, document.getElementById("test2"))
ReactDOM.render(<Person {...p1} />, document.getElementById("test1"));
3. 模块和组件
3.1 模块就是一个js文件,具有特定功能
3.2 组件就是一个界面的局部功能模块 html+css+js+media
4. React 面向组件编程
面向对象 -> 面向模块 -> 面向组件
5. 组件三大属性
5.1 state
5.2 refs - 标识组件内部的元素
5.3 props
6. 添加绑定事件this的指向问题
6.1 构造函数中添加 this.handleClick = this.handleClick.bind(this)
6.2 箭头函数
6.3 onClick={this.handleClick.bind(this)} 效率低,因为每次都会重新渲染
7. 定义组件的两种方式
7.1 工厂模式 function (无状态组件)
7.2 组件类模式 class (有状态组件)
8. 默认属性值和属性类型和必要性的限制
Person.defaultProps = {
sex:"male",
age:18
}
自 React v15.5 起,React.PropTypes 已移入另一个包中。请使用 prop-types 库 代替
Person.propTypes = {
name:PropTypes.string.isRequired,
age:PropTypes.number,
sex:PropTypes.string
}
9. … 剩余参数 打包和解包
const arr1 = [1, 2, 3]
const arr2 = [6, ...arr1, 9] -> [6, 1, 2, 3, 9]
10. 功能界面组件化编码流程
1. 拆分组件
2. 实现静态组件
3. 实现动态组件
1. 动态显示初始化数据
2. 交互功能
11. 表单组件的分类
1. 受控组件:表单项输入的数据自动收集成状态
2. 非受控组件:需要时才手动读取表单输入框的数据,操作DOM(读),写法简洁
12. 组件(对象)生命周期
constructor - 构造器
render - 渲染,只要重新渲染就要调用render
componentDidMount - 挂载完成
componentWillUnmount - 准备结束
第一次初始化
constructor -> componentWillMount -> render() -> componentDidMount
每次更新state
componentWillUpdate -> render() -> componentDidUpdate
移除组件
componentWillUnmount
ReactDOM.unmountComponentAtNode(document.getElementById('app')
13. 编程方式
1. 命名式编程 - 自己控制流程 jQuery
2. 声明式编程
14. Virtual DOM & Diff Algorithm
1. 创建虚拟DOM
2. 真实DOM树
3. 绘制界面显示
4. setState() 更新状态
5. 创建虚拟DOM树
6. 新旧比较差异
7. 更新差异对应的真实DOM
15. React CLI
dependencies - 运行依赖
react
react-dom
devDependencies - 开发依赖
react-scripts
SPA - single page application
16. package.json
1. 标识 name/version
2. 依赖 dependencies/devDependencies 运行依赖和开发依赖
3. 运行命令
17. README.md markdown
应用说明文件
18. React应用(基于React脚手架)
- 使用create-react-app 创建react应用
- 项目整体技术架构 react+webpack+es6+eslint
- 脚手架开发项目的特点:模块化、组件化、工程化
npm root -g - live reload - 实时刷新
- 标签属性:静态属性在左,动态属性在右
- axios 请求
- axios - 轻量级,建议使用 promise 风格
- fetch - 原生函数,老版本不支持,引入兼容fetch.js
- 组件间通信
- props传递数据
一般数据 父 -> 子
函数数据 子 -> 父 - 消息订阅和发布机制 subscriber - publisher
npm install pubsub-js --save - Redux 全局状态管理
- react-router / react-ui
- SPA 单页面应用 - 局部刷新
- 路由系统实现
npm i --save react-router-dom
- browser history push | pop | replace
- hash history
history / match / withRouter 对象
1. 路由组件
2. 非路由组件
路由组件和非路由组件分开
路由组件 -> pages/views 文件
非路由组件 -> components 文件
嵌套路由
如何编写路由效果
1. 编写路由组件
2. 在父路由组件中指定
路由链接 - NavLink
路由 - Route
路由链接和非路由链接 - network 是否发请求
- react-ui
- material-ui
- ant-design
19. React-UI
- 按需打包
npm install react-app-rewired customize-cra --save-dev
npm install babel-plugin-import --save-dev
在项目根目录创建一个 config-overrides.js
const { override, fixBabelImports } = require(‘customize-cra’);
module.exports = override(
fixBabelImports(‘import’, {
libraryName:‘antd-mobile’,
style:‘css’,
}),
);
20. Redux
- application-level state manager
- npm install --save redux
- 核心API
createStore - store 对象
- 内部维护 state reducer
- 核心方法
getState
dispatch(action)
subscribe(listener)
- redux 三个核心概念
- action
type:“INCREMENT”
data:数据属性
Action Creater
const increment = (number)=>({type:“increment”, data:number}) - reducer
根据老的state和action产生新的state纯函数
注意:返回新的状态
不要修改原来的状态 - store
将 state/action/reducer 联系在一起的管理对象
createStore(reducer)
- react组件和redux耦合度高
解决:react-redux
npm i --save react-redux
connect 连接组件和redux
组件分类:UI组件、容器组件
UI组件不使用redux API
容器组件放在containers
connect(
mapStateToprops,
mapDispatchToprops
) - redux 问题
redux 默认是不能进行异步处理的
应用中又需要在redux中执行异步任务(ajax, 定时器)
解决:redux异步编程
redux异步中间件
npm install --save redux-thunk