React - 原理总结
yuiyake 7/26/2022
# react与MVVM
# react生命周期
# Hooks
# 为什么react的hook不能在条件语句和循环语句中用,可vue3源于Hook理念的组合式Api可以?
- React 不允许 hook 处于条件语句是因为 React 把每次 render 中 useState 的顺序值 0、1、2、3 当成了 key,
- 方便后续 render 用 key 查找对应的 state。这样的目的是使 useState 更简洁。因为我们保证了 hooks 的调用顺序
- (不保证就会报错),所以 hooks 内部可以使用链表来实现。
- react hook是在fiber节点上存储hooks链表,每执行一次usestate,返回相对应节点数据,指针后移一位,也就意味着你在循
- 环中调用可能在下一次执行时少调用一次,这样会获取错误的fiber节点。
- fiber是什么呢 说白了fiber就是一个返回组件的函数
- 也可以看看这个,感觉这个面试说好点fiber解释 (opens new window)
// 因为从React角度来看,根本就看不见变量a和变量b! React 只知道useState的返回值被你拿去了,但是你拿去之后赋值给什么变量,React根本就不知道。
Const[a,setNextA]=usEstate(0)
const[b,setNextB]=usEstate(0)
const setNextA = () => {
a += 1
}
const setNextB = () => {
b += 1
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- Vue 3 的 setup 并不是一个常规函数,而是含有一个闭包(闭包 = 自由变量 + 函数)的函数。
- 当你用b.value += 1触发re-render时,并不会重新执行setup函数,只会重新执行fnReturn,因此 Vue根本就不需要找a和b( 想找也找不到,原因跟React一样,Vue 只知道你拿走了ref(O)的返回值),因为a和b都是fnReturn可以直接读到的自由变量啊!换句 话说,a、b、fnReturn 三者组成了闭包,这个闭包会一直维持着a和b变量,提供给fnReturn访问。
const a = ref(0);
const b = ref(0);
export const Fang = defineComponent{(
props: ...,
setup: () => {
return () => {
<div>{a.value} - {b.value}</div>
}
}
)}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10