Vue.js的设计思路

简介: Vue.js的设计思路

1686890980813.jpg

前言

今天是学习学习理解《Vue.js设计与实现》的第三篇,第一章到此结束

第一章三篇主要宏观得介绍了框架的设计思路和纲领,首先介绍前端框架中关于命令式,声明式,虚拟dom,运行时和编译时的权衡理念,然后介绍了前端框架设计需要考虑的因素,比如体积,开发体验,特性开关,错误处理等,最后介绍Vue.js在这些理念中做了哪些设计和权衡。

看完第一章,和面试官谈笑风生问题不大,但是如果被问到了细节,就需要后面的章节强化。

详细情况可以查看专栏学习理解《Vue.js设计与实现》

声明式地描述UI

Vue是一个声明式的UI框架。前端页面包括,DOM元素,属性,事件,元素的层级结构。 也就是我们常写的 <template>

  • Vue.js使用与HTML标签一样的方式来描述DOM,
  • 使用与HTML标签一样的方式来描述属性,
  • 使用:或v-bind来描述动态绑定的属性,
  • 使用@或者v-on来描述事件,
  • 使用与HTML标签一致的方式来描述层级结构

vue.js3除了支持使用模板描述UI外,还支持虚拟DOM描述UI。

其实我们在vue.js组件中手写的渲染函数就是使用虚拟DOM来描述UI的。

初识渲染器

渲染器的作用就是把虚拟DOM渲染成真实DOM

渲染器函数 renderer(vnode,container)

  • 接受两个参数,一个虚拟dom对象,一个真实dom元素作为挂载点
  • 渲染器执行总体分三步
  • 创建元素
  • 为事件添加属性和事件
  • 处理children

renderer 函数精髓在于dom更新过程,后面我们会具体学习

代码演示

如下虚拟dom

const vnode = 
    { tag: 'div', 
      props: { 
          onclick: ()=> alert('hello') 
      }, 
      children: 'click me' 
}

执行render函数 虚拟DOM渲染为真实DOM

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

组件的本质

组件就是一组dom的封装

可以用vnode的tag属性来存储要渲染的dom节点

如果tag类型是字符串 则说明是普通字符串

如果tag类型是数组,则说明渲染的是组件,需要递归遍历渲染

模版的工作原理

声明式地描述UI有两种方式,一个为手写虚拟dom,一个是使用模版,对于模板是怎么工作的,我们需要使用编译器。

编译器的作用就是将模版编译为渲染函数

以.vue文件为例,一个.vue文件就是一个组件,<template>标签内部的就是模版

vue.js是各个模块额度组合的有机整体

编译器 把模版编译成 虚拟dom,虚拟dom在通过渲染函数,更新到真实dom

在编译成过程中会表示静态属性和动态属性,生成代码时附带这些信息。

对渲染器来说省去了寻找变更点的工作量。


相关文章
|
移动开发 JavaScript 小程序
uView Collapse 折叠面板
uView Collapse 折叠面板
246 0
|
6月前
|
数据采集 人工智能 数据可视化
SpatialLM:手机视频秒建3D场景!开源空间认知模型颠覆机器人训练
SpatialLM 是群核科技开源的空间理解多模态模型,能够通过普通手机拍摄的视频重建 3D 场景布局,赋予机器人类似人类的空间认知能力,适用于具身智能训练、自动导航、AR/VR 等领域。
494 5
SpatialLM:手机视频秒建3D场景!开源空间认知模型颠覆机器人训练
|
搜索推荐 API
【强烈推荐使用】免费在线使用 GPT-4 | Free GPT-4 Online
这是一个无需API密钥的在线GPT-4工具,用户可直接输入消息进行交互。特色功能包括:重试按钮、Prompt菜单、重新开始对话及设置选项(如随机性调整和历史消息数选择),提供个性化和高效交流体验。详情见个人主页简介。
955 5
【强烈推荐使用】免费在线使用 GPT-4 | Free GPT-4 Online
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
选中项目,点击右上角的显示全部文件按钮,会将默认隐藏的文件显示出来,选中所需图片,右键,添加到项目,然后选择图片查看属性,生成操作选择resource。完毕。本人目前的解决方案。
854 41
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
|
9月前
|
SQL 数据挖掘 数据库
SQL自学笔记(2):如何用SQL做简单的检索
本文深入介绍了SQL的基本语法,包括数据查询、过滤、排序、分组及表连接等操作,并通过实际案例展示了SQL在用户研究中的应用,如用户行为分析、用户细分、用户留存分析及满意度调查数据分析。
146 0
SQL自学笔记(2):如何用SQL做简单的检索
|
存储 搜索推荐
【七大排序】堆排序详解
【七大排序】堆排序详解
476 3
|
11月前
|
关系型数据库 MySQL 应用服务中间件
502 Bad Gateway错误分析与解决方案
502 Bad Gateway错误通常发生在客户端与服务器通信时,表示网关或代理未能从上游服务器获取有效响应。本文分析了该错误的可能原因,包括LNMP安装包问题、加速器配置错误、PHP-CGI进程不足等,并提供了详细的解决方案,如手动安装PHP、调整配置参数、清理磁盘空间等。针对Nginx,还介绍了关键参数调整方法和实施步骤。通过这些方法,可有效解决502错误,提高服务器稳定性。注意备份数据并谨慎操作。
2647 2
|
12月前
|
程序员 编译器
详解 C 标准库 - <limits.h>
`&lt;limits.h&gt;` 是 C 标准库中的头文件,定义了各种基本数据类型的大小限制和特性,如 `CHAR_BIT`、`CHAR_MIN`、`CHAR_MAX` 等,涵盖了整数和字符类型的极限值。它提供了关键的宏常量,帮助程序员理解变量范围,确保代码的正确性和可移植性。
|
计算机视觉 Python
cv2.polylines
cv2.polylines
610 1