iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue视图响应式更新详细介绍
  • 968
分享到

vue视图响应式更新详细介绍

2024-04-02 19:04:59 968人浏览 泡泡鱼
摘要

目录概述思路第一步统一封装更新函数第二步监听并触发视图更新引入Dep管家实现下语法糖v-model概述 前面两篇文章已经实现了对数据的变化的监听以及模板语法编译初始化,但是当数据变化

概述

前面两篇文章已经实现了对数据的变化的监听以及模板语法编译初始化,但是当数据变化时,视图还不能够跟随数据实时更新。本文就在之前的基础上介绍下视图响应式更新部分。

思路

统一封装更新函数

待数据发生改变时调用对应的更新函数

这里思考个问题:

在何时注册这个更新函数?

如何找到对应的更新函数?

第一步统一封装更新函数

基于上篇文章compile的部分,将数据初始化的部分统一封装起来。

compileText (n) {
    // 获取表达式
    // n.textContent = this.$vm[RegExp.$1]
    // n.textContent = this.$vm[RegExp.$1.trim()]
    this.update(n, RegExp.$1.trim(), 'text')
  }
  text (node, exp) {
    this.update(node, exp, 'text')
    // node.textContent = this.$vm[exp] || exp
  }
  html (node, exp) {
    this.update(node, exp, 'html')
    // node.innerHTML = this.$vm[exp]
  }

很容易写出update方法:

每个指令都有对应的[dir]Updater管理器,用于在公共的update函数里调用去在相应视图渲染数据。

  update (node, exp, dir) {
    // 第一步: 初始化值
    const fn = this[dir + 'Updater']
    fn && fn(node, this.$vm[exp])
  }
  textUpdater (node, val) {
    node.textContent = val
  }
  htmlUpdater (node, val) {
    node.innerHTML = val
  }

第二步监听并触发视图更新

分析可知,每个模板渲染初始化的过程都需要对数据进行监听,并注册监听函数,因此在上述的update函数中添加更新逻辑。

  update (node, exp, dir) {
    // 第一步: 初始化值
    const fn = this[dir + 'Updater']
    fn && fn(node, this.$vm[exp])
    // 第二步: 更新
    new Watcher(this.$vm, exp, val => {
      fn && fn(node, val)
    })
  }

创建Watcher类:

// 监听器:负责依赖更新
class Watcher {
  constructor (vm, key, updateFn) {
    this.vm = vm
    this.key = key
    this.updateFn = updateFn
  }
  update () {
    // 绑定作用域为this.vm,并且将this.vm[this.key]作为值传进去
    this.updateFn.call(this.vm, this.vm[this.key])
  }
}

此时我们已经完成了更新函数的功能,需要做的就是在数据发生改变的时候,主动调用下对应的update函数。

简单测试下:声明一个全局的watchers数组。在每次Watcher的构造函数中都往watchers中push一下,那么我们就可以再Object.defineProperty()的set方法中去遍历所有的watchers,调用update方法。

浅试一下:

const watchers = []
class Watcher {
  constructor (vm, key, updateFn) {
    this.vm = vm
    this.key = key
    this.updateFn = updateFn
    watchers.push(this)
  }
  update () {
    this.updateFn.call(this.vm, this.vm[this.key])
  }
}
function defineReactive (obj, key, val) {
  // 递归
  // val如果是个对象,就需要递归处理
  observe(val)
  const dep = new Dep()
  Object.defineProperty(obj, key, {
    get () {
      Dep.target && dep.aDDDep(Dep.target)
      return val
    },
    set (newVal) {
      if (newVal !== val) {
        val = newVal
        // 新值如果是对象,仍然需要递归遍历处理
        observe(newVal)
        //暴力的写法,让一个人干事指挥所有人动起来(不管你需不需要更新,全给我更新一遍)
        watchers.forEach(watch => {
           watch.update()
        })
      }
    }
  })
}

此时页面视图已经可以根据数据的变而发生相应的更新了。

引入Dep管家

只触发需要更新的函数

上述的写法过于暴力,数据量一旦稍微大点就会严重影响性能。Vue内部引入了Dep这个大管家的概念来进行依赖收集,统一管理所有的watcher。只让需要干活的watcher去update。

class Dep {
  constructor () {
    this.deps = []
  }
  addDep (dep) {
    this.deps.push(dep)
  }
  notify () {
    this.deps.forEach(dep => dep.update())
  }
}

每个data中的key对应一个dep就行,所以选择在Object.defineProperty的getter函数中进行依赖收集。在watcher中触发依赖收集

class Watcher {
  constructor (vm, key, updateFn) {
    this.vm = vm
    this.key = key
    this.updateFn = updateFn
    // 触发依赖收集,使用一个静态变量target去保存对应的Watcher
    Dep.target = this
    // 主动访问vm[key],触发一下getter
    this.vm[this.key]
    Dep.target = null
  }
  update () {
    // 绑定作用域为this.vm,并且将this.vm[this.key]作为值传进去
    this.updateFn.call(this.vm, this.vm[this.key])
  }
}

收集依赖,创建Dep实例

function defineReactive (obj, key, val) {
  observe(val)
  const dep = new Dep()
  Object.defineProperty(obj, key, {
    get () {
      Dep.target && dep.addDep(Dep.target)
      return val
    },
    set (newVal) {
      if (newVal !== val) {
        val = newVal
        observe(newVal)
        dep.notify()
      }
    }
  })
}

至此,我们一个简版的Vue就实现了。这里还没有涉及到虚拟dom得概念,以后介绍。

实现下语法糖v-model

v-model虽然很像使用了双向数据绑定的 angular 的 ng-model,但是 Vue 是单项数据流,v-model 只是语法糖而已。

// 最简形式,省略了value的显式绑定,省略了oninput的显式事件监听,是第二句代码的语法糖形式
<input v-model="sth" />
<input v-bind:value="sth" v-on:input="sth = $event.target.value" />
//第二句代码的简写形式
<input :value="sth" @input="sth = $event.target.value" />

分析一下其就是在内部实现了v-bind:value=“” 和@input。

 model (node, exp) {
   node.value = this.$vm[exp]
   node.addEventListener('input', (e) => {
     this.$vm[exp] = e.target.value
   })
 }

到此这篇关于vue视图响应式更新详细介绍的文章就介绍到这了,更多相关vue响应式更新内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue视图响应式更新详细介绍

本文链接: https://www.lsjlt.com/news/167703.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue视图响应式更新详细介绍
    目录概述思路第一步统一封装更新函数第二步监听并触发视图更新引入Dep管家实现下语法糖v-model概述 前面两篇文章已经实现了对数据的变化的监听以及模板语法编译初始化,但是当数据变化...
    99+
    2024-04-02
  • html5响应式布局的详细介绍
    本篇内容主要讲解“html5响应式布局的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5响应式布局的详细介绍”吧!一、什么是响应式布局 ...
    99+
    2024-04-02
  • SpringMVC数据响应详细介绍
    目录一、环境准备二、响应页面[了解]三、返回文本数据[了解]四、响应JSON数据SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,Ser...
    99+
    2023-02-06
    SpringMVC数据响应 SpringMVC响应
  • Vue数据变化后页面更新详细介绍
    首先会通过module.hot.accept监听文件变化,并传入该文件的渲染函数: module.hot.accept( "./App.vuevue&type=templat...
    99+
    2022-11-13
    Vue页面更新 Vue数据变化后页面更新
  • win7更新win10详细步骤介绍
    许多期待已久的win7用户们不停地等待着,却迟迟未能收到windows系统的推送。想要升级为win10好一把体验一下win10所带来的新功能,那么win7怎么升级为win10呢此教程可帮助您简单、快速将win7升级win10.快来看看吧。1...
    99+
    2023-07-13
  • Win10新功能Continuum模式详细介绍
      很多用户在使用Win10技术预览版,听说有个Continuum模式,大家都觉得很陌生,毕竟Win10带来的新东西实在多,比如微软小娜等。   Win10 Continuum模式是Win10的一项新的功能,专门为混合形...
    99+
    2023-06-11
    Win10 Continuum 模式 新功能
  • win10创造者更新15002版新功能详细介绍
    把Windows10系统升级到15002版系统后,发现系统新增了一些功能,本人对其进行了探索,现将发现的新增功能小结出来,供朋友们参考。 一、新增了一个Apps(应用和功能)项目。 1、点击任,打开Windows 设置窗...
    99+
    2023-05-22
    win10
  • Vue生态的新成员Pinia的详细介绍
    目录安装和配置Store核心StateGettersActionsVue Devtools最后结论参考文献Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员开发。感觉更...
    99+
    2024-04-02
  • Java详细介绍单例模式的应用
    目录一、什么是单例模式二、实现单例模式的几种方法1. 懒汉模式(线程不安全)2. 懒汉模式(线程安全)3. 饿汉模式一、什么是单例模式 单例模式(Singleton Pattern)...
    99+
    2024-04-02
  • Vue Router路由hash模式与history模式详细介绍
    目录一、前言二、hash模式三、history模式一、前言 对于hash模式和history模式,最直接的区别就是地址栏带不带"#"号了。 vue脚手架搭建的项目...
    99+
    2024-04-02
  • Vue怎么实现响应式数据更新
    本文小编为大家详细介绍“Vue怎么实现响应式数据更新”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么实现响应式数据更新”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先假设我们在祖辈时候传入进来是个动态...
    99+
    2023-07-04
  • vue中使用svg画路径图的详细介绍
    什么是svg: SVG 是使用 XML 来描述二维图形和绘图程序的语言。 svg的优点与特点 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG 是万维网联盟的标准SV...
    99+
    2024-04-02
  • Vue路由模式中的hash和history模式详细介绍
    目录1. 路由概念2. hash模式3. history路由模式1. 路由概念 路由的本质就是一种对应关系,根据不同的URL请求,返回对应不同的资源。那么url地址和真实的资源之间就...
    99+
    2024-04-02
  • Vue路由参数的传递与获取方式详细介绍
    目录前言1. 通过动态路由参数传递2. 通过query字符串传递3. props 隐式传递前言 vue 页面路由切换时传参的方式有如下几种: 动态路由参数 它隐藏字段信息,相对于来说...
    99+
    2024-04-02
  • windows10如何关闭自动更新系统windows10关闭自动更新系统方法详细介绍
    windows10关闭自动更新系统的方法是许多用户在乎的问题,在运用的历程中win10一直提示要升级,因而许多用户就好烦升级的提示,针对系统升级不断提示的问题,绝大多数用户很排斥,担心升级出bug,那麼windows10如何关闭自动更新系统...
    99+
    2023-07-10
  • windows10怎样更换全局字体windows10更换全局字体方式详细介绍
    windows10怎样更换全局字体针对喜爱人性化字体的用户而言是较为常常关心的问题,win10内置的全局字体针对这些用户而言不算很好看,因而都是有许多用户会要想更换全局字体,全局字体可以使用到全部表明字体上,这儿就给各位提供有关window...
    99+
    2023-07-19
  • 老电脑win7需不需要更新win10老电脑win7需不需要更新win10比照详细介绍
    老电脑win7需不需要更新win10是挺多客户在乎的问题,这个问题一直从win10公布到现在都也有很多人担心,最先绝大多数客户是觉得win7十分平稳,不害怕各种各样问题,但是现阶段愈来愈多流行手机软件不会再适用win7了,因而许多消费者想知...
    99+
    2023-07-18
  • Vue响应式原理与虚拟DOM实现步骤详细讲解
    目录一、什么是响应式系统二、实现原理三、虚拟DOM实现四、总结一、什么是响应式系统 在Vue中,我们可以使用data属性来定义组件的数据。这些数据可以在模板中使用,并且当这些数据发生...
    99+
    2023-05-13
    Vue响应式原理 Vue虚拟DOM
  • Vue 状态管理进阶:从创建状态到实现响应式更新
    创建状态 在 Vue 中,可以通过以下方式来创建状态: // 在 Vue 实例中创建状态 this.count = 0; // 在组件中创建状态 export default { data() { return { ...
    99+
    2024-02-24
    Vue 状态管理 响应式更新 状态管理工具
  • React路由渲染方式与withRouter高阶组件及自定义导航组件应用详细介绍
    目录1. 路由的三种渲染方式1.1 component渲染方式1.2 render方式渲染1.3 案例-登录成功才能访问某个页面1.4 children方式渲染2. withRout...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作