React @ Littlechai | 2021-12-06T21:23:51+08:00 | 3 分钟阅读 | 更新于 2021-12-06T21:23:51+08:00

React

虚拟DOM

  • 本质是Object类型对象
  • 虚拟DOM轻量
  • React会将虚拟DOM转化为真是DOM

JSX语法

  • js表达式用{}
  • 样式类名className
  • 内联样式用style={{key: value}}
  • 只有一个根节点
  • 标签必须闭合
  • 标签首字母自定义的要大写

生命周期

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#初始化阶段
1、constructor()
2、componentWillMount() -> getDerivedStateFromProps()
3、render()
4、componentDidMount()
#更新阶段
1、shouldComponentUpdate()
2、componentWillUpdate() -> getDerivedStateFromProps()
3、render()
4、componentDidUpdate(preProps, preState) -> getSnapshotUpdate()
#卸载阶段: ReactDOM.unmountComponentAtNode()
1、componentWillUnmount()

DOM的diff算法

key的作用

key是虚拟DOM对象的标识,在更新显示时key非常重要

具体的,当状态中数据发生变化时,React会根据【新数据】生成【新虚拟DOM】,随后React进行新旧DOM的diff比较,规则如下:

  • 旧虚拟DOM中找到了与新虚拟DOM相同的key:

    • 虚拟DOM中内容没变,则使用之前的真实DOM
    • 虚拟DOM中内容改变,则生成新的真实DOM,随后替换掉页面中之前的真实DOM
  • 旧虚拟DOM中未找到与新虚拟DOM相同的key

    • 根据数据创建新的真实DOM,随后渲染

用index作为key可能引发的问题

  • 若对数据进行:逆序添加删除等破坏顺序的操作:

    ​ 会导致不必要的DOM更新 =>界面无问题,效率低

  • 若结构中包括输入类的DOM:

    ​ 会产生错误DOM更新 =>界面有问题

1
2
3
4
5
6
7
8
虚拟dom
<li key=0>小王 <input type="text"></li>

更新后虚拟dom
<li key=0>小张 <input type="text"></li>
<li key=1>小王 <input type="text"></li>

此时key=0中input标签相同未改变,所以小王的input复用在小张中,但其内容有残留

开发中如何选择key

  • 最好使用唯一标识

React脚手架配置代理

1.package.json配置proxy

配置一个代理!

1
2
3
4
#package.json中
"proxy": "http://localhost:5000"

#当在3000中未发现该文件时,会向5000请求
1
axios.get('http://localhost:3000/students')

2.setupProxy.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const proxy = require('http-proxy-middleware')

module.exports = function (app) {
  app.use(
    proxy('/api1', {//遇见/api1前缀的请求。就会触发该代理
      target: 'http://localhost:5000',//转发目标
      changeOrigin: true,//控制服务器收到的响应头中Host字段的值
      pathRewrite: { '^/api1': '' }
    }),
    proxy('/api2', {
      target: 'http://localhost:5001',
      changeOrigin: true,
      pathRewrite: { '^/api1': '' }
    }),
  )
}

消息订阅-发布机制

PubSub

安装

1
npm install pubsub-js

使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import PubSub from 'pubsub-js'
#创建订阅
var token = Pubsub.subscribe(name, function)
#发布订阅
PubSub.publish(name, content)
#取消订阅
根据name
PubSub.unsubscribe(token)
根据function
PubSub.unsubscribe(function)

© 2021 - 2022 小柴Yeah

Powered by Hugo with theme Dream.

avatar

小柴YeahThe time is no time, when it is past