返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue 如何关掉响应式问题
  • 564
分享到

Vue 如何关掉响应式问题

2024-04-02 19:04:59 564人浏览 八月长安
摘要

目录Vue如何关掉响应式例子v-onceVue响应式的处理过程Vue如何关掉响应式 大家都知道Vue有双向数据绑定 ,但是很少人知道怎样把它这个功能关掉 比如想要让某个值的改变不改变

Vue如何关掉响应式

大家都知道Vue有双向数据绑定 ,但是很少人知道怎样把它这个功能关掉

比如想要让某个值的改变不改变原有值

使用 Object.freeze(),这会阻止修改现有的 property,也意味着响应系统无法再追踪变化。

例子

var obj = {
  foo: 'bar'
}

Object.freeze(obj)

new Vue({
  el: '#app',
  data: obj
})
<div id="app">
  <p>{{ foo }}</p>
  <!-- 这里的 `foo` 不会更新! -->
  <button v-on:click="foo = 'baz'">Change it</button>
</div>

额外 Vue 也为大家提供了一个 只能修改数据一次的方法

v-once

通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定:

<span v-once>这个将不会改变: {{ msg }}</span>

Vue响应式的处理过程

响应式是从vue实例的init方法开始的。

在Init方法中先调用initState()初始化vue实例的状态,在这个方法中调用了initData(),initData()是把我们的data属性注入到vue实例上,并且调用observe()把data对象转换成响应式对象。于是observe()就是我们响应式的入口。

observe()做了什么事情:observe接收一个参数value,这个参数value就是我们响应式要处理的对象。

那么在创建observe对象时做了什么事:来看他的构造函数

数组的响应式处理:其实就是设置数组的那几个特殊方法,比如push,pop,sort等等,这些方法会改变原数组,所以当这些方法被调用的时候,我们要去发送通知。发送通知的时候是找到数组对象对应的ob,也就是observe对象,在找到这个observe中的dep,调用dep的notify方法。更改完数组的特殊方法之后,遍历数组的每一个成员,对每一个成员再去调用observe,如果这个成员是对象的话,也会把这个对象转换成响应式对象。

对象的响应式处理:如果当前的value是对象的话,此时会调用walk()方法。Walk方法里面会遍历这个对象的所有属性,对每一个属性调用defineReactive()。

在defineReactive中,会为每一个属性创建dep对象,让dep去收集依赖。如果当前属性的值是对象,则会调用observe,把这个对象也转换成响应式对象。

在defineReactive里最核心的事情就是定义getter和setter。

在getter中去收集依赖,收集依赖时要为每一个属性收集依赖,如果这个属性的值是对象,他也要为这个子对象收集依赖,在getter中最终返回这个属性的值。

在setter中首先要把新的值保存下来,如果新的值是对象,就调用observe,把我们新设置的值也转换成响应式对象。在setter中,数据发生了变化,所以要发送通知,其实就是调用dep.notify()。

收集依赖的过程:

在收集依赖时,首先要调用watcher对象的get方法,在get方法中调用pushTarget,在pushTarget中会把当前的watcher对象记录到Dep.target属性中。

在访问data中成员的时候去收集依赖,当我们访问这个属性的值的时候,就会去触发defineReactive中的getter,在getter中去收集依赖。他会把我们属性对应的watcher对象添加到dep的subs数组中,也就是为属性收集依赖。如果这个属性的值也是对象,此时要创建一个childOb对象,要为我们这个子对象收集依赖。目的是将来子对象发生变化时可以发送通知。(其实数组中内容发生变化时,就用到了这个childOb)。

Wacher:当数据发生变化时,会调用dep.notify()发送通知,他会调用wacher的update方法,在wacher的update方法中,会去调用queueWatcher函数去判断wacher是否被处理了,如果这个wacher对象没有被处理,则会被添加到queue队列中,并且调用flushSchedulerQueue去刷新任务队列。

在flushSchedulerQueue函数中会触发beforeUpdate钩子函数,然后调用wacher.run()方法,在wacher.run方法中去调用wacher的get方法去调用getter方法,而getter中存储的其实就是updateComponent(此处针对渲染wacher来说的)。在wacher.run运行完成后就已经将数据更新到了视图上,我们就可以再页面上看见变化了,剩下一些清理工作。

他会去清空我们上一次的依赖,重置wacher中的状态,接下来去触发actived钩子函数,最后触发updated钩子函数。

这就是整个响应式的处理过程。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Vue 如何关掉响应式问题

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

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

猜你喜欢
  • Vue 如何关掉响应式问题
    目录Vue如何关掉响应式例子v-onceVue响应式的处理过程Vue如何关掉响应式 大家都知道Vue有双向数据绑定 ,但是很少人知道怎样把它这个功能关掉 比如想要让某个值的改变不改变...
    99+
    2024-04-02
  • 关于vue2响应式缺陷的问题
    目录vue2响应式缺陷1.对象新增的属性没有响应式2.数组的部分操作没有响应式vue2与vue3的响应式原理vue2响应式vue3响应式雏形vue3的响应式相较于vue2的优势vue...
    99+
    2024-04-02
  • 关于vue3vuex4store的响应式取值问题解决
    场景: 在页面中点击按钮,数量增加,值是存在store中的,点击事件,值没变。 <script setup lang="ts"> import { useStore } ...
    99+
    2024-04-02
  • 关于springboot响应式编程整合webFlux的问题
    在servlet3.0标准之前,是每一个请求对应一个线程。如果此时一个线程出现了高延迟,就会产生阻塞问题,从而导致整个服务出现严重的性能情况,因为一旦要调用第三方接口,就有可能出现这...
    99+
    2024-04-02
  • 面试中如何响应关于Go和Linux的问题?
    在当今互联网行业中,Go语言和Linux操作系统已经成为了非常热门的技术。因此,在面试时,面试官通常会问到与这两个技术相关的问题。本文将为大家总结一些面试中常见的与Go和Linux相关的问题,并提供一些解决方案和演示代码。 Go语言的特...
    99+
    2023-08-22
    linux 响应 面试
  • 如何解决pos.baidu.com的响应问题
    本篇内容主要讲解“如何解决pos.baidu.com的响应问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决pos.baidu.com的响应问题”吧!最近很多人反应 编程网打不开,其实都...
    99+
    2023-06-10
  • vue中provide inject的响应式监听问题怎么解决
    这篇文章主要介绍“vue中provide inject的响应式监听问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中provide inject的响应式监听问题怎...
    99+
    2023-06-30
  • 如何分析springboot响应式编程整合webFlux的问题
    这期内容当中小编将会给大家带来有关如何分析springboot响应式编程整合webFlux的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在servlet3.0标准之前,是每一个请求对应一个线程。如果...
    99+
    2023-06-29
  • 如何解决vue在ios端下点击响应延时的问题
    这篇文章主要为大家展示了“如何解决vue在ios端下点击响应延时的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决vue在ios端下点击响应延时的问题...
    99+
    2024-04-02
  • vue中数据不响应的问题及解决
    目录vue数据不响应问题vue数据响应不及时问题vue数据不响应问题 将本来要新增的属性提前在data中定义好 我可以提前在userInfo里面定义好,这样就不是新增属性了,就像下面...
    99+
    2024-04-02
  • vue给对象添加属性没有响应式的问题及解决
    目录vue给对象添加属性没有响应式给已创建的vue添加响应式属性怎么才能添加响应式的属性呢?总结vue给对象添加属性没有响应式 vue2的响应式原理使用的是对象代理去实现的,对象代理...
    99+
    2023-05-17
    vue对象添加属性 vue响应式 vue对象
  • 如何解决Centos7中Vscode无响应的问题
    小编给大家分享一下如何解决Centos7中Vscode无响应的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!版本信息虚拟机版本:VMware&reg;...
    99+
    2023-06-20
  • 如何解决DNS服务器未响应问题
    小编给大家分享一下如何解决DNS服务器未响应问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!DNS服务器未响应的解决方法/步骤:打开电脑中的网络和共享中心,在界...
    99+
    2023-06-27
  • vue如何使用媒体查询实现响应式
    目录使用媒体查询实现响应式的两种方式前提1.在每个组件中为其使用媒体查询2.写n套页面,在使用这些页面的组件中进行一次媒体查询vue中的媒体查询语法使用媒体查询实现响应式的两种方式 ...
    99+
    2024-04-02
  • Vue响应式原理与虚拟DOM如何实现
    本篇内容介绍了“Vue响应式原理与虚拟DOM如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是响应式系统在Vue中,我们可以使...
    99+
    2023-07-05
  • Windows10应用加载失败不响应问题如何解决
      使用Windows10系统的过程中,如果一个应用经常出现不响应的情况,那么就说明这个应用加载失败了。出现加载失败的原因有很多,通过重置可以有效解决Windows10应用加载失败问题。   那么如何重置全部Win10应...
    99+
    2023-06-16
    Win10 应用 加载失败 问题 Windows10
  • 如何解决服务器响应过慢的问题
    解决服务器响应过慢的方法:1、使用服务器的Gzip压缩功能,对网站程序的代码以及图片大小进行简化压缩,从而减少网站程序整体大小提高网站速度;2、使用服务器搭建网站程序时,需要减少http请求数,从而提高网站响应速度;3、给服务器配置进行升级...
    99+
    2024-04-02
  • Vue源码学习之响应式是如何实现的
    目录前言一、一个响应式系统的关键要素1、如何监听数据变化2、如何进行依赖收集——实现 Dep 类3、数据变化时如何更新——实现 Watcher 类二、虚拟 DOM 和 diff1、虚...
    99+
    2024-04-02
  • 如何设计响应式WEB
    本篇内容主要讲解“如何设计响应式WEB”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何设计响应式WEB”吧!1、为什么需要响应式web设计 由于目前移动设备的大量使用,以及PC显示器的尺寸逐渐...
    99+
    2023-06-08
  • Vue3中reactive丢失响应式问题怎么解决
    本篇内容主要讲解“Vue3中reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中reactive丢失响应式问题怎么解决”吧!问题描述:使用 reacti...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作