深入学习Vue.js(一)Vue.js的设计思路

news/2025/1/12 0:45:37/

文章目录

  • 1.命令式和声明式
  • 2.性能
  • 3.运行时和编译时
  • 4.声明式地描述UI
  • 5.将虚拟DOM渲染为真实DOM

1.命令式和声明式

视图层框架通常分为命令式和声明式。

(1)命令式

​ jQuery就是一种典型的命令式框架,该类框架的特点是关注过程。即代码描述的是做事的过程,这样的写法比较符合我们的直觉。

(2)声明式

​ 声明式框架是目前比较流行的视图层框架,比如说Vue,该类框架更加关注结果。比如在Vue中通过v-if表示组件是否显示的条件,v-for表示循环加载改组件。声明式框架往往会提供一个清晰的结果,至于怎么达到这个结果,这就涉及Vue的底层实现了,换句话说,Vue帮我们封装了过程。

ps.声明式框架的内部实现一定是命令式的,而暴露给用户的是生命式的表现形式

2.性能

声明式代码的性能并不优于命名式代码。

​ 声明式框架的性能理论上比不上命令式代码(在写出极致优化的命令式代码的情况下),因为声明式框架为了实现最优的更新性能,需要先找出前后差异,并只更新发生变化的地方。如下面的代码:

div.innerHTML = 'Hello World';

假设修改操作的性能消耗为A,找出差异的性能消耗为B

(1)命令式的消耗 = A

(2)声明式的消耗 = A+B

ps.因为声明式框架本身就是封装了命令式的代码而保证了项目的可维护性,所以框架需要做的事情就是:在保证可维护性的同时,保证性能损失最小。

3.运行时和编译时

Vue3是一个运行时+编译时框架

(1)运行时框架

​ 提供数据和render函数,使用render函数将数据转换为DOM,由于没有编译过程,无法分析用户提供的内容,

(2)编译时框架

​ 提供HTML标签模板和compiler函数,在编译时调用compiler函数将HTML标签直接转换为可以执行的命令式代码,性能性能更强。

(3)编译时加运行时狂框架

​ 在编译时分析静态和动态内容,然后传入render函数,做进一步优化。

4.声明式地描述UI

编写前端页面所涉及的内容:

  • DOM元素
  • 属性
  • 事件
  • 元素的层级结构

如果使用模板语法来描述是这样:

<div><span @click="handler">click me!</span>
</div>

或者使用对象描述:

const title = {tag: "div",children: [{tag: "span",props: {onClick: handler},children: "click me!"}]
}

该对象最终也会被渲染成上述模板。既然两种方式生成的结果相同,那么使用模板语法和对象语法有什么区别呢?区别就是使用对象描述的形式更加灵活。而在vue.js中就是使用对象也就是虚拟DOM的形式来描述界面的。

5.将虚拟DOM渲染为真实DOM

function renderer(vnode, container) {// 使用 vnode.tag 作为标签名称创建 DOM 元素const el = document.createElement(vnode.tag)// 遍历 vnode.props,将属性、事件添加到 DOM 元素for (const key in vnode.props) {if (/^on/.test(key)) {// 如果 key 以 on 开头,说明它是事件el.addEventListener(key.substr(2).toLowerCase(), // 事件名称 onClick --->clickvnode.props[key] // 事件处理函数)}}// 处理 childrenif (typeof vnode.children === 'string') {// 如果 children 是字符串,说明它是元素的文本子节点el.appendChild(document.createTextNode(vnode.children))} else if (Array.isArray(vnode.children)) {// 递归地调用 renderer 函数渲染子节点,使用当前元素 el 作为挂载点vnode.children.forEach(child => renderer(child, el))}// 将元素添加到挂载点下container.appendChild(el)
}

renderer的具体执行过程:

  • 创建元素
  • 为元素添加属性和方法
  • 处理children

http://www.ppmy.cn/news/7223.html

相关文章

面试官:系统需求多变时如何设计?

面试官&#xff1a;我想问个问题哈&#xff0c;项目里比较常见的问题 面试官&#xff1a;我现在有个系统会根据请求的入参&#xff0c;做出不同动作。但是&#xff0c;这块不同的动作很有可能是会发生需求变动的&#xff0c;这块系统你会怎么样设计&#xff1f; 面试官&#…

全志Tina Linux 系统裁剪 boot0裁剪 uboot裁剪 内核裁剪 文件系统裁剪 C库裁剪 文件系统压缩

文章目录1 概述2 Tina系统裁剪简介2.1 boot0裁剪2.2 uboot裁剪2.3 内核裁剪2.3.1 删除不使用的功能2.3.2 删除不使用的驱动2.3.3 修改内核源代码2.3.3.1 size工具.2.3.3.2 ksize.py脚本2.3.3.3 nm命令2.3.3.4 kernel压缩方式.2.4 文件系统裁剪.2.4.1 应用程序及冗余文件裁剪2.4…

Markdown之CSDN高阶语法技巧(九)

1.UML类图之C模板类转义 #mermaid-svg-jpN7aljnfFUAMJSy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jpN7aljnfFUAMJSy .error-icon{fill:#552222;}#mermaid-svg-jpN7aljnfFUAMJSy .error-text{fill:#552222;str…

rocketmq安装

链接&#xff1a;https://pan.baidu.com/s/14ziQH62MeYmM8N6JsH5RcA 提取码&#xff1a;yyds 下载rocketmq-all-4.9.3-bin-release.zip 下载、修改配置 mkdir -p /app/rocketmq cd /app/rocketmqunzip rocketmq-all-4.9.3-bin-release.zip cd rocketmq-4.9.3/修改 配置文件&…

前端例程20221227:下雪动画

演示 动图太大了不好上传&#xff0c;这里就放个静态图吧&#xff0c;实际上这里是雪花从上到下飘落的效果。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

【Java】Log4j日志

目录 1.日志概述 日志是什么 为什么会有日志 2.log4j概述 什么是log4j 版本 3.log4j入门案例 步骤 实现 总结 4.log4j1详情&#xff1a;记录器rootLogger 5.log4j1详情&#xff1a;日志级别 6.log4j1详情&#xff1a;输出源appender ConsoleAppender FileAppend…

ArcGIS基础实验操作100例--实验8绘制中点连线

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a; 请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验8 绘制中点连线 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

OR-Tools工具介绍以及实战(从入门到超神Python版)

目录前言0、安装一、什么是优化问题&#xff1f;1-1、优化问题介绍1-2、举例1-2-1、导入所需要的库1-2-2、声明求解器1-2-3、创建变量1-2-4、定义约束条件1-2-5、定义目标函数1-2-6、调用求解器&#xff0c;并且显示结果。二、python有关于各种优化问题示例2-1、简单的线性编程…