把数据搞到页面上展示

简介: 根据上文提到了数据响应式的实现,这次我们再一次升级,模仿vue框架,实现这些响应式数据渲染到页面中。

网络异常,图片无法展示
|


根据上文提到了数据响应式的实现,这次我们再一次升级,模仿vue框架,实现这些响应式数据渲染到页面中。


原始的Vue用法:

网络异常,图片无法展示
|


接下来写一个我们自己的简版DVue。

根据 从设计理念到数据响应式一文,我们先来实现data中响应式数据的获取。


数据代理


从图片中可以看出,通过new 一个Vue实例,拿到data中的数据。访问格式为vm.name


首先,自己创建一个DVue文件,在页面中引入。以下与逻辑操作有关的代码均是在DVue中。


我们需要创建一个DVue类,通过构造函数获取传入的参数。在内部对data中的数据进行拦截监听。但是我们访问vm.name是没有输出的(undefined)。因为我们对DVue只是进行了响应拦截,并没有对其进行代理

class DVue {
  constructor(options) {
    this.$options = options
    this.$data = options.data
    console.log(this.$data)
    observe(this.$data)
    proxy(this) // 代理
  }
}


那么我们就需要去实现这个代理的功能函数。将拿到的this.$data变量中的键值进行遍历(Object.keys),分别将其代理到实例上。其数据一定也是响应式的。


function proxy(vm) {
  Object.keys(vm.$data).forEach((key) => {
    Object.defineProperty(vm, key, {
      get() {
        return vm.$data[key]
      },
      set(newVal) {
        if (newVal != vm.$data[key]) vm.$data[key] = newVal
      },
    })
  })
}


编译响应式数据


当然,啥也没写就是这样的。。。

网络异常,图片无法展示
|


今天咱们就把数据替换到页面上。


在做好数据的响应式及代理之后,我们又一重要的环节要来了:编译!


看过原理的同学都知道,负责编译的就是Compile这个类。在DVue类中执行编译(new Compile(options.el, this)),将当前dom和实例传入。

class Compile {
  constructor(el, vm) {
    this.$vm = vm
    let dom = document.querySelector(el)
    this.compiler(dom)
  }
  compiler(el) {
    const childNodes = el.childNodes
    childNodes.forEach((node) => {
      if (isNode(node)) {  // 元素
        if (node.childNodes.length > 0) this.compiler(node)
      } else if (isTextNode(node)) {  // 文本
        console.log('编译插值', node.textContent, this.$vm[RegExp.$1])
        this.compileText(node)
      }
    })
  }
  compileText(node) {
    node.textContent = this.$vm[RegExp.$1]
  }
}
function isNode(el) {
  return el.nodeType === 1
}
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/ //{{ 值 }}
function isTextNode(el) {
  return el.nodeType === 3 && defaultTagRE.test(el.textContent)
}


在Compile中,循环遍历#app下面的子节点。可能会遇到子节点是文本或是元素的情况,至此我们就需要将两种情况分开。


  • 文本节点。直接将节点的textContent属性替换即可。
  • 元素节点。里面可能存在元素嵌套元素这样的可能。所以我们需要判断当前元素节点的子元素个数(node.childNodes.length > 1),如果里面还存在子元素。就需要将其递归在进行下层解析。


这边可能还有一点难理解的可能就是正则。对于此我也不是特别熟悉,这边我是参考的源码中的正则获取到的{{ 值 }}的值。当然源码中使用的是exec方法进行的匹配判断。具体exec方法使用可以参考这里。有的时候使用exec方法是不能立即起作用的,需要手动的重启以下,具有一定的延迟性。

网络异常,图片无法展示
|

结合上篇文章,我们已经完成了上图的两大模块:Observer的数据劫持、Compile的初始化视图。


简单的数据在页面中展示到此就完成拉。感兴趣的可以关注 Vue源码初识专栏,会持续输出vue相关知识哦(●'◡'●)。 如果不足,请多指教。

目录
相关文章
Cadence(OrCAD)原理图导入到PADS Layout遇到的问题和解决方法
先在Cadence中导出原理图的网表,当然这里的网表是PADS Layout支持的.asc格式,然后在PADS Layout导入该网表文件,最终出现提示错误的文本文件,没有导入成功。
2214 2
|
1天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
617 11
|
7天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
6天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1624 6
|
3天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
5天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
658 11
|
8天前
|
缓存 算法 关系型数据库
深入浅出分布式 ID 生成方案:从原理到业界主流实现
本文深入探讨分布式ID的生成原理与主流解决方案,解析百度UidGenerator、滴滴TinyID及美团Leaf的核心设计,涵盖Snowflake算法、号段模式与双Buffer优化,助你掌握高并发下全局唯一ID的实现精髓。
372 160
|
8天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
461 6
n8n:流程自动化、智能化利器