vue篇——vue原理以及实现

news2025/2/26 17:58:25

vue

官网解释Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,简单易学、双向数据绑定、组件化。数据和结构的分离、虚拟DOM、运行速度快。链接
它有以下的特性:1.轻量级的框架;2.双向数据绑定;3.指令;4.插件化。
优点:

  • 简单:官方文档很清晰,轻量级框架学习起来很简单。
  • 快速:异步批处理方式更新 DOM。
  • 组合:用解耦的、可复用的组件组合你的应用程序。
  • 强大:表达式 无需声明依赖的可推导属性 (computed properties)。
  • 对模块友好:可以通过 NPM、Bower 或 Duo 安装,不强迫你所有的代码都遵循 Angular 的各种规定,使用场景更加灵活。

缺点:

  • 新生儿:Vue.js是一个新的项目,没有angular那么成熟,没有React那样的丰富。
  • 影响度不是很大:google了一下,有关于Vue.js多样性或者说丰富性少于其他一些有名的库。不支持IE8,需要做浏览器适配

Vue 的两个核心功能

  1. 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。
  2. 响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。

.
声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:
声明式编程(英语zhidao:Declarative programming)是一种编程范型,与命令式编程相对立。它描述目标性质,让计算机明白目标,而非流程。声明式编程不用告诉电脑问题领域,从而避免随之而来的副作用。而指令式编程专则需要用算法来明确的指出每一步该怎么做。

响应式:
Vue 的响应式原理是核心是通过 ES5 的保护对象的 Object.defindeProperty中的访问器属性中的 get和 set方法,data 中声明的属性都被添加了访问器属性,当读取 data 中的数据时自动调用 get 方法,当修改 data 中的数据时,自动调用 set 方法,检测到数据的变化,会通知观察者 Wacher,观察者 Wacher自动触发重新render 当前组件(子组件不会重新渲染),生成新的虚拟 DOM 树,Vue 框架会遍历并对比新虚拟 DOM 树和旧虚拟 DOM 树中每个节点的差别,并记录下来,最后,加载操作,将所有记录的不同点,局部修改到真实 DOM 树上。

原理

解释
vue是一个MVVM 渐进式框架,MVVM是vue的设计模式,在vue框架中数据会自动驱动视图。
View是视图,就是DOM;对应视图也就是HTML部分–代表UI组件,它负责将数据模型转化成UI展现出来。 Model是模型,就是vue组件里的data,或者说是vuex里的数据;–代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。 ViewModel–监听模型数据也就是data的的改变和控制视图行为、处理用户交互,简单理解就是一个同步View和Model的对象,连接Model和View。

总结
在MVVM架构下,View和Model之间并没有直接的联系,而是通过ViewMode进行交互,Model和ViewModel之间的交互是双向的,因此View数据的变化会同步到Model中,而Model数据的变化也会立即反应到View上。
ViewModel通过双向数据绑定把View层和Model层连接了起来,而View和Model之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理。

初次渲染过程

  • 解析模板为render函数(一般在开发环境已经完成,vue-loader)
  • 触发响应式,监听data属性gettersetter(模板中使用到的变量会触发getter)
  • 执行render函数(触发getter),生成vnode,patch(elem,vnode)渲染到页面上

如何更新
修改data的数据,触发setter(此前data数据在getter中已被监听)
重新执行render函数,生成newVnode(新的虚拟dom)
使用 patch(vnode,newVnode)更新到页面上
vue原理
1、编译模板生成render函数,生成vdom
2、执行render函数,触发data中的getter
3、getter方法收集依赖(通俗点就是,在模板里面触发了哪个变量的getter,就把哪个变量观察起来)
4、在依赖中setter修改data中的数据的时候,Notify看下修改的那个数据是不是之前被观察起来的
5、如果是之前观察起来的,就重新渲染( re-render),重新生成render函数,生成newVdom形成一个闭环

数据劫持
vue中的数据劫持代理指的是开发者调用或修改组件data里的某个属性时可以直接使用this.属性名,而不用写成微信小程序的写法,写成this.data.属性名来获取。
例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据劫持代理</title>
    <style>
      .defineP {
        .defineP {
          width: 200px;
          height: 200px;
        }
      }
    </style>
</head>
<body>
  <div>
  </div>
  <script src="./index.js"></script>
</body>
</html>
// vue的数据劫持代理
// 模拟data选项
let data = {
  username: 'curry',
  age: 33
}

// 模拟组件的实例
let _this = {
  test: "测试"
}

// 利用Object.defineProperty()  
// 这个方法接收三个参数:
// 1.属性所在的对象
// 2.属性的名字
// 3.一个描述符对象
for (let item in data) {
  // item是key  data[item]是value
  // console.log(item, data[item])
  Object.defineProperty(_this, item, {
      // get:用来获取扩展属性值  需要展开点击才能看得到
      get() {
          console.log('get()')
          // 扩展属性值依赖于data
          return data[item]
      },
      // set: 监视扩展属性的  只要已修改就调用
      set(newValue) {
          console.log('set()', newValue)
          // _this.username = newValue  不要在set方法中修改当前拓展属性值 会出现死循环
          data[item] = newValue
      }
  })
}
console.log(_this)
// 通过Object.defineProperty的get方法添加的扩展属性不能直接修改
_this.username = 'heihei'
console.log(_this.username)

hash

  • hash 变化会触发页面跳转,即浏览器的前进,后退
  • hash 变化不会刷新页面,SPA(单页面)必须的特点
  • hash 永远不会提交到server 端
    vue中就是通过hash 的变化触发路由的变化,来触发视图的渲染
<body>
    <p>
        hash路由
    </p>
    <button id='btn'>
        修改 hash
    </button>
</body>

<script>
 //hash 变化 包括;
    //a. js 修改URL
    //b. 手动修改url的hash
    //c.浏览器的前进、后退
    
    //页面初次加载获取hash
    window.addEventListener ('DOMCintentLoaded',() =>{
        console.log('hash',location.hash)
    })
    //hash变化触发
     window.onhashchange = (event) =>{
        console.log('hash',location.hash)
    }
     //js 修改 url
     document.getElementById('btn').addEventListener('click',()=>{
         location.href = '#/user'
     })
</script>

history
h5 history 主要是通过 history.pushState 跳转 和 window.onpopstate 监听页面的前进和后退

<body>
    <p>
       historyh路由
    </p>
    <button id='btn'>
        修改 url
    </button>
</body>

<script>
 
    //页面初次加载获取hash
    window.addEventListener ('DOMCintentLoaded',() =>{
        console.log('load',location.pathname)
    })

     //js 修改 url
     document.getElementById('btn').addEventListener('click',()=>{
         //pushState 有三个参数
         //第一个参数是个js对象,可以放任何的内容,可以在onpostate事件中(后面介绍)获取到便于做相应的、处理。
        //第二个参数是页面标题:目前所有浏览器都不支持,填空字符串即可
        //第三个参数是个字符串,就是保存到history中的url。
         let state= {
             title:'新页面'
         }
         history.pushState(state,'','user')
     })
    
    //监听浏览器的前进、后退
    window.onpostate = (event) => {
        console.log(event.state)  // {title:'新页面'}
        console.log(location.pathname)
    }
</script>
  • history 模式需要后端配合,就是无论用户访问什么路由,所有路由的切换都由前端来做,后端只需要返回index.html的文件,如果后面没有配置兼容,当访问user这个路由,点击刷新,就会报user页面找不到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL索引事务(一)

1、索引 1.1、概念 索引相当于一种特殊文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引类型&#xff0c;各类索引各自的结构实现。 1.2、作用 *通俗来讲&#xff0c;索引就相当于是我们的书本目录&#xff0c;…

电视、报纸、杂志、网络等曝光度好的媒体有哪些?

在当今社会&#xff0c;媒体是传递信息、宣传思想和引导社会舆论的重要平台。对于企业和个人而言&#xff0c;选择曝光度好的媒体来传递信息&#xff0c;是提高知名度和影响力的重要手段。那么&#xff0c;曝光度好的媒体有哪些呢&#xff1f;下面将从电视、报纸、杂志、网络等…

chatgpt赋能python:Python语言在SEO中的应用

Python语言在SEO中的应用 介绍 Python是一种易于学习&#xff0c;功能强大的高级编程语言&#xff0c;其优秀的性能和简单易用的开发方式&#xff0c;使其成为当前最受欢迎的语言之一。Python在各种应用场景中都有着广泛的应用&#xff0c;其中SEO领域更是不可忽视。Python可…

Tuxera for Mac2023中文版电脑读写硬盘U盘工具

在我们的日常学习和生活当中&#xff0c;因为小巧、便于携带等特性&#xff0c;U盘成为比较常用的移动存储设备。但在使用的过程中&#xff0c;也经常会遇到一些棘手的问题&#xff0c;例如&#xff1a;插入之后无法识别&#xff0c;或只能查看不能读写。那么&#xff0c;U盘不…

工欲善其事,必先利其器还是有必要的

uPic 图床配置教程 - Github 背景 最近发现上传图片的图床服务越来越难用&#xff0c;有的时候上传很慢&#xff0c;甚至会上传不上去。所以搜罗一波&#xff0c;本地实战搞起&#xff0c;巧了&#xff0c;这个软件不错&#xff0c;能达到起码得要求&#xff0c;正适合博客上…

MyBatis-Plus 可视化代码生成器来啦,开发效率提升2倍

前言 一、mybatis-plus-generator-ui是什么&#xff1f; 二、 mybatis-plus-generator-ui怎么用&#xff1f; 1、maven pom引入 2、新建程序入口&#xff0c;以main函数的方式运行 3、实例运行 三、mybatis-plus-generator-ui代码生成 1、Table的查询和浏览 2、输出配置 …

chatgpt赋能python:Python如何调字体大小的方法和步骤

Python如何调字体大小的方法和步骤 什么是调字体大小&#xff1f; 调字体大小是一种常见的文本编辑功能&#xff0c;可以通过更改文本中字号的大小&#xff0c;调整文本在屏幕上显示的大小。在Python编程中&#xff0c;也可以通过调整字体大小来改善程序界面的可读性。 如何…

Apple Vision Pro 内容开发制作

承接 Apple Vision Pro内容制作 3D模型制作 全新的平台。熟悉框架和工具。准备好为Apple Vision Pro设计和构建一个全新的应用程序和游戏世界。 沉浸 Apple Vision Pro提供了一个无限的空间画布来探索&#xff0c;实验和玩&#xff0c;让你自由地完全重新思考你的3D体验。人…

4.4 变量的线程安全分析

目录 4.4 变量的线程安全分析1、成员变量和静态变量是否线程安全&#xff1f;2、局部变量是否线程安全&#xff1f;3、局部变量线程安全分析4、常见线程安全类5、实例分析 4.5 习题1、卖票练习2、转账练习 4.4 变量的线程安全分析 1、成员变量和静态变量是否线程安全&#xff…

不止Chat,GPT-4 将释放更大生产力

目录 1.对 ChatGPT 的巨大超越 2.与 ChatGPT 相同的技术路线 3.GPT-4 背后的强大阵容 4.开启多模态大模型时代 相比 ChatGPT 能力有大进化&#xff0c;多模态上有突破但不多。 近日&#xff0c;多模态大模型 GPT-4 震撼登场&#xff01; GPT-4 能够接受图像和文本输入&am…

读书笔记:从ChatGPT到AIGC:智能创作与应用赋能

文章目录 引爆内容生产力应用场景&#xff1a;ChatGPT的多场景应用传媒电商影视教育金融医疗 发展梳理&#xff1a;从PGC到UGC再到AIGCPGC&#xff1a;企业和平台是内容创作的主体UGC&#xff1a;用户成为内容创作主体AIGC 内容生成&#xff1a;AIGC涵盖多样的内容模态AI图像&a…

JupyterLab 4.0 发布了

JupyterLab 是 Jupyter Notebook 的下一代版本&#xff0c;它提供了更强大的功能和更灵活的用户界面&#xff0c;6月6日&#xff0c;官方发布了JupyterLab 4.0的说明&#xff0c;并且说该版本是下一个主要的版本。 JupyterLab的主要改进是: 用户界面&#xff1a;Jupyter Note…

2023年高性能计算就业及实习岗位大爆料

关于高性能计算能做什么&#xff1f;未来的就业前景如何&#xff1f;薪资如何&#xff1f; 只要是计算密集型的软件&#xff0c;必然需要HPC工程师。最近火热的行业和技术领域&#xff0c;包括深度学习计算机视觉&#xff0c;自然语言处理&#xff0c;自动驾驶&#xff0c;Al f…

如何建立制造业设备巡检系统?零代码工具起关键性作用

什么设备巡检系统 设备巡检系统是一种管理工具&#xff0c;用于监测和记录设备运行状况&#xff0c;并在需要时指示工作人员进行巡检、维护或维修。这些系统通常由计算机软件和一组传感器或控制器组成&#xff0c;可监测各种设备的运行状况&#xff0c;如机器、设备、管线和车…

vue3-实战-06-管理后台-品牌管理模块开发

目录 1-品牌列表 1.1-需求图 1.2-定义接口和数据类型 1.3-请求接口和渲染数据 2-新增和修改品牌 2.1-需求原型分析 2.2-dialog开发 2.3-请求接口封装 2.4-图片上传组件开发 2.5-新增-修改品牌信息 3-删除品牌 4-表单校验 在开发品牌管理之前&#xff0c;我们先将mo…

【数据分享】1929-2022年全球站点的逐年最低气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2022年全球气象站…

物联网开发的流程是怎么样的

物联网开发流程&#xff0c;物联网是指通过各种传感设备把任何物品与互联网相连接&#xff0c;进行信息交换和通信&#xff0c;以实现智能化识别、定位、跟踪、监控和管理的一种网络。物联网开发流程&#xff0c;物联网开发的步骤是怎么样的&#xff1f;可以参考以下文章内容&a…

Nautilus Chain全球行分享会,深圳站圆满举办

在北京时间 6 月 4 日&#xff0c;由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动&#xff0c;在深圳&#xff08;深圳南山区清华研究院&#xff09;顺利举办&#xff0c;本次分享会联合主办方还包括 Stanford Blockchain Accelerator、Zebec P…

基于ADME的分子过滤和 lead-likeness标准

T002 基于ADME的分子过滤和 lead-likeness标准 项目来源于TeachOpenCADD 本文目标 在药物设计的背景下&#xff0c;重要的是通过例如它们的物理化学性质来过滤候选分子。 在这个教程中&#xff0c;从 ChEMBL ( Talktorial T001 )获得的化合物将按照 Lipinsik 的五法则进行…

Android AIDL Callback的使用(配源码)

零、示例说明 本示例&#xff0c;完成的功能是&#xff1a;客户端向服务端注册一个回调&#xff0c;服务端是一个商店shop&#xff0c;当商店里的产品 Product 有变化时&#xff0c;调用回调向通知客户端&#xff0c;什么商品更新了。 一、完整源代码 完整源码链接: https:/…