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

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

MVVM

*区别mvc&mvvm

两者的区别:

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

视图中的内容改变,比如一个input,vue会监测到视图改变自己把数据改了 ,不仅实现了数据驱动视图,视图也驱动数据,反向地视图驱动数据,双向的

jsx构建视图

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

通过reactdom

首先是我们的胡子语法

10n -> bigint

除了number&string其他都渲染成空

若是数组,会把数组每一项拿出来渲染

但是也有例外:

  1. 函数对象可作为一个组件渲染
  2. 行内样式style必须是一个对象

扩展:驼峰命名法

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

具体应用:判断&循环

循环

循环元素要加唯一key属性

引出稀疏数组的问题:

*jsx底层原理

1.createElement生成虚拟dom

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

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

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

React.Fragment -> Symbol(react.fragment)

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

type标签名

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

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 | 仅私有。√ | 全部。√ | 全部。√ |

render方法实现

函数组件渲染底层原理

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

函数组件的概念:

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

编译流程基本一致,主要的区别就是type是一个函数

子节点 -》props.childeren。双闭合调用的时候会产生

props属性

只读的。

对象的规则有三个:

作用:父传子,通过props

插槽处理机制

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

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

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

具名插槽实现

组件封装

静态组件&动态组件

类组件

*js继承

call继承 + 原型继承

刚总结了,让A继承于B,就是让A.prototype的__proto__属性值为B.prototype

复制代码
function A(){`
`    B.call(this)` `// 继承B的私有`
    `https://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)`
`

js设计模式

面向对象(OOP)

面向对象中的继承

类组件

*es6 class语法

*类组件继承原理

  1. 继承了私有属性 props context refs updater
  2. 继承了公有属性 isReactComponent setState forceUpdate
  3. super内部实现就是call继承
复制代码
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)`
`

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

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

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

整体流程:

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

之后扩展state

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

forceUpdate

  1. 执行周期函数

  1. render
  2. componentDidMount

腾讯文档-流程图插件

类组件更新的底层逻辑

组件更新整体流程

腾讯文档-流程图插件

  • forceUpdate会跳过shoudUpdate

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

什么情况能让组件更新?

  1. 修改状态能让组件更新
  2. 父组件更新

父组件自上而下渲染的时候,一定会遇到子组件,先深度递归

腾讯文档-流程图插件

周期函数的命名特点:

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

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

PureComponent和Component的区别

React.PureComponent

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

浅比较源码比较

相关推荐
han_3 分钟前
JavaScript如何实现复制图片功能?
前端·javascript
崽崽的谷雨25 分钟前
react实现一个列表的拖拽排序(react实现拖拽)
前端·react.js·前端框架
小小坤1 小时前
前端基于AI生成H5 vue3 UI组件
前端·javascript·vue.js
既见君子1 小时前
透明视频
前端
竹等寒1 小时前
Go红队开发—web网络编程
开发语言·前端·网络·安全·web安全·golang
lhhbk1 小时前
angular中下载接口返回文件
前端·javascript·angular·angular.js
界面开发小八哥1 小时前
数据可视化图表库LightningChart JS 全新发布v7.0——提高视觉质量
开发语言·javascript·信息可视化·图表·lightningchart
YUELEI1181 小时前
Vue使用ScreenFull插件实现全屏切换
前端·javascript·vue.js
问道飞鱼2 小时前
【技术方案设计】H5埋点方案设计以及实现(入门版)
开发语言·javascript·h5·事件·埋点