响应式系统和React | 青训营笔记

73 阅读2分钟

响应式系统和React | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的第6天

React 历史与应用

h.png

hh.png

React的设计思路

响应式与转换式

响应式系统

事件————>执行既定回调————>状态变更

  • 响应式编程
  1. 状态更新,ui自动更新
  2. 前端代码组件化,可复用,可封装
  3. 状态之间的互相依赖关系,只需声明即可
  • 组件化
  1. 组件是组件的组合/原子组件
  2. 组件内拥有状态,外部不可见
  3. 父组件可将状态传入组件内部

React的设计

  • 状态更新,UI不会自动更新,需要手动的调用DOM,进行更新。

  • 欠缺基本的代码层次的封装和隔离,代码层次没有组件化。

  • UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到“Callback Hell”

  • 组件设计

  1. 组件声明了状态和UI的映射
  2. 组件有props/state两种状态
  3. 组件可由其他组件拼装而成

State Hook

useState就是一个Hook;在函数组件中,我们没有this,不能分配或读取this.state。所以我们直接在组件中调用useState Hook:一般来说,在函数退出后变量就会”消失”,而state中的变量会被React保留。

  • useState唯一的参数就是初始state,下面这个例子即初始state值为0。
  • useState不同于this.state,这里的state不一定要是一个对象(也可以是数字或字符串),这个初始state参数只有在第一次渲染时被用到。
const [count, setCount] = useState(0); 

可进行多状态声明

当我们用hook更新一个state变量时,会替换它的值,这和class中的this.setState不一样,后者会把更新后的字段合并入对象中

function handleWindowMouseMove(e) {

      setState(state => ({ ...state, left: e.pageX, top: e.pageY })
}

我们推荐把state切分成多个state变量,每个变量包含的不同值会在同时发生变化。 比如可以把组件的state拆分为position和size两个对象;

function Box() {
  const [position, setPosition] = useState({ left: 0, top: 0 });
  const [size, setSize] = useState({ width: 100, height: 100 });

  useEffect(() => {
    function handleWindowMouseMove(e) {
      setPosition({ left: e.pageX, top: e.pageY });
    }

数组解构

下面这段代码:

const [fruit, setFruit] = useState('banana'); 
复制代码


相当于:

``
var fruitStateVariable = useState('banana'); // 返回一个有两个元素的数组
var fruit = fruitStateVariable[0]; // 数组里的第一个值
var setFruit = fruitStateVariable[1]; // 数组里的第二个值

它意味着我们同时创建了 fruit 和 setFruit 两个变量,fruit 的值为 useState 返回的第一个值,setFruit 是返回的第二个值。