目录

react基础语法视图层类组件

react基础语法视图层&类组件

react基础语法视图层&类组件

MVVM

https://i-blog.csdnimg.cn/direct/a6b89c8a66a145f5b5148fdcd15059d9.png

https://i-blog.csdnimg.cn/direct/37053376526f4b3db2f1b7258e70fa1e.png

*区别mvc&mvvm

https://i-blog.csdnimg.cn/direct/d7073e1bce4c4baa8943dc7084cd518e.png

两者的区别:

数据模型去渲染视图。数据层改了,vue自己会监听到帮我们拿最新的数据去渲染视图;构建数据构建视图,数据驱动的思想。这一套是非常相似的。

视图中的内容改变,比如一个input,vue 会监测到视图改变自己把数据改了

,不仅实现了数据驱动视图,视图也驱动数据,反向地视图驱动数据, 双向的

https://i-blog.csdnimg.cn/direct/45832f8a5b524d65b0db0df65775184c.png

jsx构建视图

xml:通过自定义标签存储数据

通过reactdom

https://i-blog.csdnimg.cn/direct/64c2a261f8e9487e89c636b2acaa0225.png

https://i-blog.csdnimg.cn/direct/8aca85c6fabc42ca9d4752a06a731e00.png

首先是我们的

胡子语法

https://i-blog.csdnimg.cn/direct/0bad4d11c4e14a5cae352b5069ea053f.png

https://i-blog.csdnimg.cn/direct/e543e926f4c84d83adcc7203e81ee4a7.png

10n -> bigint

除了

number&string

其他都渲染成空

若是

数组

,会把数组

每一项拿出来渲染

但是也有例外:

  1. 函数

    对象可作为一个组件渲染

  2. 行内样式

    style

    必须是一个对象

https://i-blog.csdnimg.cn/direct/73538422d001456492f561d94bcdbbca.png https://i-blog.csdnimg.cn/direct/f471fbcc0f9d44f5b618f4412794bb5f.png

扩展:驼峰命名法

  1. style必须是一个对象
  2. class要用className去做

https://i-blog.csdnimg.cn/direct/70225a633f854705b224205dcfa8f522.png

具体应用:判断&循环

https://i-blog.csdnimg.cn/direct/8609f199b0544022881756c5909c8014.png

循环

循环元素要加唯一key属性

https://i-blog.csdnimg.cn/direct/3aa9160b67d54acb88cbf8c5137c00cb.png

https://i-blog.csdnimg.cn/direct/ef4a8d77e912454fb94effb3583b6ea9.png

引出稀疏数组的问题: https://i-blog.csdnimg.cn/direct/95321c2c1acd475b8b1be976e8500cba.png

https://i-blog.csdnimg.cn/direct/08f336e8025042dfac8c6c2f55e02ea6.png https://i-blog.csdnimg.cn/direct/7e0e37a20f5d457e86ebf12cdd585b92.png

*jsx底层原理

1.createElement生成虚拟dom

虚拟dom: 框架内部自己构建的对象体系。基于对象的这些属性去描述对应dom节点的相关特征。有哪些标签节点,dom节点有什么特征特点,有什么属性,有什么内容……通过自己构建的对象体系已经描述出来了。

https://i-blog.csdnimg.cn/direct/1f9c51f5fc68464c855ade018d369314.png

babal-presest-react-app编译成createElement格式

https://i-blog.csdnimg.cn/direct/d04f9dc3f21741ebb998d24178d5b849.png https://i-blog.csdnimg.cn/direct/d573425a9ef54a789b697ae2030a8798.png https://i-blog.csdnimg.cn/direct/b5aed4abbb074d1eb35d36cb5d9e5d2c.png https://i-blog.csdnimg.cn/direct/5589357bb37f46f5aa468f626f3898c3.png

  1. 当前元素标签名
  2. 当前元素身上那些属性,没有就是null。
  3. 第三及以后都是子节点。

React.Fragment -> Symbol(react.fragment)

React.createElement的返回结果就是我们的虚拟dom,即jsx对象。

https://i-blog.csdnimg.cn/direct/25cc49da99fe42deb7ae2c71482d1ab7.png

type标签名

props既包含了自身属性,又包含子节点。children若一个子节点就直接为其值,多个就是一个数组。

https://i-blog.csdnimg.cn/direct/1150d1e091674f9c9c9ba76f1008181c.png https://i-blog.csdnimg.cn/direct/4982ef44e88141e6976d46b0e122d9bb.png https://i-blog.csdnimg.cn/direct/aa196bb0499d40668779a281e7950922.png https://i-blog.csdnimg.cn/direct/22112d59feae403791cdfd4b6ec85bcf.png

jsx中不能渲染一个对象?以下3种除外

  1. 数组是可以的
  2. style必须是一个对象
  3. 直接渲染虚拟dom对象

2.虚拟dom -> 真实dom

虚拟dom变为真实dom,通过render方法。

*扩展一下遍历对象属性

for in(控制台中浅色浅紫色代表不可枚举的)。

我们一般从3个维度去分析遍历对象属性的api:公有还是私有,是否可枚举,是否symbol。我们一般认为,仅私有,全部(不仅仅可枚举),全部(不仅仅非symbol)是比较好的。

私有/公有是否仅可枚举是否symbol
for in公有也会。×仅。×仅非symbol。×
Object.keys仅私有。√仅。×仅非symbol。×
Object.getOwnPropertyNames仅私有。√全部。√仅非symbol。×
Object.getOwnPropertySymbol仅私有。√全部。√仅symbol。×
Relect.ownKeys仅私有。√全部。√全部。√

https://i-blog.csdnimg.cn/direct/c04e41d91bf6468fb754ce676c273ea1.png https://i-blog.csdnimg.cn/direct/30458453a9ca4af992fff9646c62acd9.png

https://i-blog.csdnimg.cn/direct/b31375d975a747cc87c2c15457ae208d.png

render方法实现

https://i-blog.csdnimg.cn/direct/9867f2ceb03841f7a8ddbb740b3bc1aa.png

https://i-blog.csdnimg.cn/direct/99881903fec942d59aeb71a549212fda.png https://i-blog.csdnimg.cn/direct/bca86541edc74a17b0f411e8b22cf7aa.png https://i-blog.csdnimg.cn/direct/d414b53f3f72461fbfd80fbba192e4a2.png

https://i-blog.csdnimg.cn/direct/d26edead47dc472c878af01adda573ed.png https://i-blog.csdnimg.cn/direct/e69273b82a1d4f799e6771a8ccdbfe4e.png

函数组件渲染底层原理

工程化就是在组件化的基础上合并、压缩、打包

https://i-blog.csdnimg.cn/direct/e643b818890d49c1bab1293f03b7f863.png

函数组件的概念:

函数组件:创建一个函数,返回jsx视图。

https://i-blog.csdnimg.cn/direct/ae3313fb34f44814ad3cc09c1499b9df.png

编译流程基本一致,

主要的区别就是type是一个函数

https://i-blog.csdnimg.cn/direct/097165fbec174b2a8c735fbe7bdde81c.png

https://i-blog.csdnimg.cn/direct/12f2178aac604ab49e1707d6f0dca701.png https://i-blog.csdnimg.cn/direct/210efe2c766741a7acd9cf2653561867.png https://i-blog.csdnimg.cn/direct/585312a097ea4aaf99c4978510d109cc.png https://i-blog.csdnimg.cn/direct/3c2654d5389d489da342c0ae0420a6d5.png

子节点

-》props.

childeren

双闭合调用

的时候会产生

https://i-blog.csdnimg.cn/direct/a527c1cd9fe24801bab9b7bb6f549c24.png

props属性

只读的。

对象的规则有三个:

https://i-blog.csdnimg.cn/direct/3e6dc04204514d3e98153268393acfb9.png https://i-blog.csdnimg.cn/direct/e100b327daa64cb186bf1b5b83f09ba9.png

https://i-blog.csdnimg.cn/direct/da72738192e848919c16306c89c92c36.png

作用:父传子,通过props

https://i-blog.csdnimg.cn/direct/d9d72b067a664e1fb7e15ac328c7ff3a.png https://i-blog.csdnimg.cn/direct/88286b90eb9043dabd22257c94e4f60b.png https://i-blog.csdnimg.cn/direct/1b838135f9d8463193a5448ac930c83b.png https://i-blog.csdnimg.cn/direct/49fffd50d95b4d58a6eaddff7362f787.png

插槽处理机制

https://i-blog.csdnimg.cn/direct/d33cda1cc79d4e8089ea03fc4b5f09f5.png

插槽传递的是视图,html标签dom结构,

https://i-blog.csdnimg.cn/direct/b44256d3ccd64da0913352196ade36c6.png

React上有很多方法,use是hooks函数,

React.children,内部实现了转换成了array。

https://i-blog.csdnimg.cn/direct/a88e19e7ec6b4e9bab91221cff04bcec.png

具名插槽实现

https://i-blog.csdnimg.cn/direct/6410ed937d4243b7b8450b2f91f3d249.png

组件封装

https://i-blog.csdnimg.cn/direct/eecb05d1cbe043e29a4e67af3f0cc8ef.png https://i-blog.csdnimg.cn/direct/8d78c7a0ac19423c9fee40cc65df2d4d.png

静态组件&动态组件

https://i-blog.csdnimg.cn/direct/d0e11fed7e8f41d782ab5989f888b6dc.png

类组件

*js继承

call继承

  • 原型继承

刚总结了,让A继承于B,

就是让A.prototype的__proto__属性值为B.prototype

https://i-blog.csdnimg.cn/direct/2953aba096704aee952ea85f85d82019.png

function A(){
    B.call(this) // 继承B的私有
    this.name = 'angela'
    this.age = 18
}
A.prototype.sum =function(a,b){return a+b;}

function B(){
    this.sex='female'
}
B.prototype.sus=function(a,b){ return a-b; }
console.dir(B)
Object.setPrototypeOf(A.prototype, B.prototype) // 继承B的公有
console.dir(A)


const a = new A
console.log(a)

https://i-blog.csdnimg.cn/direct/fc1c56941d6642d495ea2e4bad4ee332.png https://i-blog.csdnimg.cn/direct/58d532b0e11e42d9a2d811608d694cac.png https://i-blog.csdnimg.cn/direct/10745b6ae88643e491d9f5f73913f11d.png

类组件

*es6 class语法

https://i-blog.csdnimg.cn/direct/7c3fa4007c2e4c37b59bf8affe6d0bf2.png

*类组件继承原理

https://i-blog.csdnimg.cn/direct/77d818e622ac4613af2724f3aa5aac07.png https://i-blog.csdnimg.cn/direct/8efcb65eed5e46899ef89fb21689d3ff.png

  1. 继承了

    私有

    属性

    props context refs updater

  2. 继承了

    公有

    属性

    isReactComponent setState forceUpdate

  3. super内部实现就是call继承

https://i-blog.csdnimg.cn/direct/dcdfd748d14346d4802c3184ec3f043d.png

class A{
    num = 100
    getNum=()=>{
        console.log(this.num)
    }
    sum = function(x,y){
        console.log(this.num)
    }
    add(){

    }
}
const a = new A
a.getNum()
a.sum()
console.log(a)

https://i-blog.csdnimg.cn/direct/5d076c45c9de4e018bac5a949eab5693.png

类组件第一次渲染底层逻辑

类组件和函数组件的区别:

会把此当做构造函数执行,创建一个实例,然后执行render

https://i-blog.csdnimg.cn/direct/577ec8eefd374215a1d9076a3c0ad38b.png

整体流程:

  1. 挂载props

https://i-blog.csdnimg.cn/direct/55ddc30d842f45279b55aaa5a434587b.png

  1. 初始化状态:状态就是state。setState & forceUpdate。

之后扩展

state

https://i-blog.csdnimg.cn/direct/5b437a19b11a459685b46a0af743ad82.png

setState是异步的,即时打印值没有变。

https://i-blog.csdnimg.cn/direct/404e7fe0106e40959954edfac0f31ab0.png https://i-blog.csdnimg.cn/direct/29f11f5b3fc646b7ae2a2eb172b32178.png

forceUpdate

https://i-blog.csdnimg.cn/direct/25ebba3519ed4523935d4b4c6b040cad.png https://i-blog.csdnimg.cn/direct/856b6d499c5b4537a0159d1e9529b23e.png

https://i-blog.csdnimg.cn/direct/0fa2e1900d3c44839d799814807b7da7.png https://i-blog.csdnimg.cn/direct/adec8a3147ce4c7bafd408eb8ab8b099.png

  1. 执行周期函数

https://i-blog.csdnimg.cn/direct/86004fd6f3eb4a3389d06a3a77ebc0c9.png https://i-blog.csdnimg.cn/direct/f64c3d81c2164d738aaf1164af968b4d.png

https://i-blog.csdnimg.cn/direct/c8737f67279a4ff7a6d14088d4005a9a.png

  1. render
  2. componentDidMount

https://i-blog.csdnimg.cn/direct/b7e877d87f3b416e8438d8af861b9726.png

类组件更新的底层逻辑

组件更新整体流程

https://i-blog.csdnimg.cn/direct/309edb6ba0e9437da35012bb7e988a5c.png

https://i-blog.csdnimg.cn/direct/dd1e9ea4fc7b4874be62a8ed5aebba7f.png

  • forceUpdate会跳过shoudUpdate

https://i-blog.csdnimg.cn/direct/19ce4ca6e19348bdb49fba0bbedb775a.png

第二种组件更新的情况:父组件更新也会触发子组件的更新

什么情况能让组件更新?

  1. 修改状态

    能让组件更新

  2. 父组件更新

父组件自上而下渲染的时候,一定

会遇到子组件

先深度递归

https://i-blog.csdnimg.cn/direct/20b3c59ce0c048dd801265865c978e21.png https://i-blog.csdnimg.cn/direct/d27e00f00893441fb62f49c48fedf911.png

https://i-blog.csdnimg.cn/direct/677bd7b110f8473b9d6a37954ef2085f.png https://i-blog.csdnimg.cn/direct/85942b91557847c285452752efad5121.png

https://i-blog.csdnimg.cn/direct/82aef946638649eaabbabd412ff6b6bd.png https://i-blog.csdnimg.cn/direct/e7841505664b40e59b8867c63bf8c90a.png

周期函数的命名特点:

基本component开头,将要都是will,已完成都是did,

更新是update,挂载是mount,卸载是unmount

PureComponent和Component的区别

https://i-blog.csdnimg.cn/direct/87cbbadebd304ca9b8a574942491db95.png

React.PureComponent

浅比较概念:对象至多比较一级

https://i-blog.csdnimg.cn/direct/c912f5db568240ce947ae63006603249.png

https://i-blog.csdnimg.cn/direct/27cb227590624b3e839844f6760bf615.png

浅比较源码比较

https://i-blog.csdnimg.cn/direct/57c11d8a9a314c9197331fd22e91b153.png