广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中 $forceUpdate的使用解析
  • 711
分享到

vue中 $forceUpdate的使用解析

2024-04-02 19:04:59 711人浏览 独家记忆
摘要

目录方案分析forceUpdate本质实现原理分析刷新页面使用v-if标记key-changing在Vue的开发过程中,数据的绑定通常来说都不用我们操心,例如在​​data

Vue开发过程中,数据的绑定通常来说都不用我们操心,例如在​​data​​中有一个​​msg​​的变量,只要修改它,那么在页面上,​​msg​​的内容就会自动发生变化。但是如果对于一个复杂的对象,例如一个对象数组,直接去给数组上某一个元素增加属性,或者直接把数组的​​length​​变成0,vue可能就无法知道发生了改变。这个其实就是考验对于双向绑定的更进一步的理解应用了。
在Vue中,双向绑定属于自动档,然而在特定的情况下,需要手动触发“刷新”操作,目前有四种方案可以选择:

  • 刷新整个页面
  • 使用v-if标记
  • 使用内置的forceUpdate方法
  • 使用key-changing优化组件

方案分析

本次文章主要重点在于分析​​forceUpdate​​这个方法,后续有机会再来分析​​key-changing​​。

forceUpdate

该方案是比较好的一种方式,比如说我们尝试直接给某个​​object​​增加一个属性,发现页面上没有效果;直接将length变成0来清空数组,也没有效果,

关键代码如下:

change: function(index) {
// 增加性格属性
this.girls[idx].character = 'lovely';
},
clear: function() {
// 清空数组
this.girls.length = 0;
}

按照上面的写法没有产生想要的效果,是因为没有按照vue的规范去写,因为文档里面写了,对于深层的,最好用$set方法,这样vue就可以知道发生了变化,同时vue也不建议直接修改length,而是给一个空数组来置空。
如果我们按照vue的规范去写的,是可以实现变化的,

关键代码如下:

change: function(index) {
// 增加性格属性
this.$set(this.girls[idx],'character','lovely')
},
clear: function() {
// 清空数组
this.girls = [];
}

如果我们不想利用​​$set​​去设置,非要按照我们第一种方式去写,可以实现么?可以的,就是利用​​$forceUpdate​​,此时修改了数据,然而页面层没有变动,之后通过日志打印的方式确认数据是否有修改过,之后再确认有没有监听到,用​​$forceUpdate​​就相当于按照最新数据给渲染一下。

关键代码如下:

change: function(index) {
this.girls[idx].character = '男';
this.$forceUpdate();
},
clear: function() {
this.girls.length = 0;
this.$forceUpdate();
}

这种做法实际上并不推荐,官方说如果你现在的场景需要用​​forceUpdate​​方法 ,那么99%是你的操作有问题,如上data里不显示声明对象的属性,之后添加属性时正确的做法时用 ​​$set()​​方法,所以​​forceUpdate​​请慎用。
该同等效果的:window.location.reload()

本质

在vue的官方文档中有说明到这个是一个强制刷新的api,但很少用到,除非是遇到了需要实时响应组件状态的时候

Force the component instance to re-render.

This should be rarely needed given Vue's fully automatic Reactivity system. The only cases where you may need it is when you have explicitly created non-reactive component state using advanced reactivity APIs.

实现原理

Vue.prototype.$forceUpdate = function () {
const vm: Component = this
if (vm._watcher) {
vm._watcher.update()
}
}

实例需要重新渲染是在依赖发生变化的时候会通知​​watcher​​,然后通知​​watcher​​来调用​​update​​方法,就是这么简单。

分析

forceUpdate就是重新render

  • 有些变量不在​​ state​​上,但是你又想达到这个变量更新的时候,重新(render),从而渲染虚拟DOM。
  • 注意到这个时候并不是重新加载组件。
  • 结合vue的生命周期,调用​​$forceUpdate​​后只会触发​​beforeUpdate​​和​​updated​​这两个钩子函数,不会触发其他的钩子函数。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件,即强制更新因某些原因并未渲染到页面的,已经改变的,应该被渲染到页面的数据
  • ​state​​里的某个变量层次太深,更新的时候没有自动触发​​ render​​。

这些时候都可以手动调用 forceUpdate 自动触发 render 。所以建议使用​​ immutable​​来操作​​ state​​ ,​​redux​​ 等​​ flux​架构来管理​​ state​​。

刷新页面

这个方案是挺low的,本质上是刷新页面

this.$router.Go(0)

使用v-if标记

如果是刷新某个子组件,则可以通过​​v-if​​指令实现。我们知道,当​​v-if​​的值发生变化时,组件都会被重新渲染一遍。因此,利用​​v-if​​指令的特性,可以达到强制刷新组件的目的。

<template>
<compare v-if="refresh"></compare>
<el-button @click="refreshComp()">刷新comp组件</el-button>
</template>
<script>
import compare from '@/views/compare.vue'
export default {
name: 'parentComp',
data() {
return {
refresh: true
}
},
methods: {
refreshComp() {
// 移除组件
this.refresh = false
// 在组件移除后,重新渲染组件
// this.$nextTick可实现在DOM 状态更新后,执行传入的方法。
this.$nextTick(() => {
this.refresh = true
})
}
}
}
</script>

key-changing

原理很简单,vue使用key标记组件身份,当key改变时就是释放原始组件,重新加载新的组件。

<template>
<div>
<span :key="key"></span>
</div>
</template>
<script>
export default {
data() {
return {
key: 0
}
},
methods: {
handleUpdateClick() {
this.key += 1 // 或者 this.key = new Date();
}
}
}
</script>

到此这篇关于vue中 $forceUpdate的使用解析的文章就介绍到这了,更多相关$forceUpdate解析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue中 $forceUpdate的使用解析

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

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

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

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

下载Word文档
猜你喜欢
  • vue中 $forceUpdate的使用解析
    目录方案分析forceUpdate本质实现原理分析刷新页面使用v-if标记key-changing在vue的开发过程中,数据的绑定通常来说都不用我们操心,例如在​​data...
    99+
    2022-11-13
  • Vue中的$forceUpdate()怎么使用
    这篇文章主要讲解了“Vue中的$forceUpdate()怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中的$forceUpdate()怎么使用”吧!$forceUp...
    99+
    2023-06-29
  • Vue中$forceUpdate()的使用方式
    目录$forceUpdate()的使用有两种解决方法 方法一方法二关于$forceUpdate的一些理解$forceUpdate()的使用 在Vue官方文档中指出...
    99+
    2022-11-13
  • react中的forceupdate怎么用
    本文小编为大家详细介绍“react中的forceupdate怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中的forceupdate怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2022-10-19
  • vue中window.onresize的使用解析
    目录window.onresize的使用说下重点window.onresize笔记1.浏览器尺寸变化响应事件2.谷歌浏览器中3.页面尺寸变更事件window.onresize的使用 ...
    99+
    2022-11-13
  • Vue中Vue.extend()的使用及解析
    目录Vue Vue.extend()的使用应用场景简单实用使用Vue.extend()编写vue插件Vue.extend()如何编程式使用组件呢具体使用Vue Vue.extend(...
    99+
    2022-11-13
    Vue Vue.extend Vue.extend的使用 Vue使用Vue.extend()
  • vue中push()和splice()的使用解析
    目录vue push()和splice()的使用解析push()使用splice()使用使用splice()修改数据,动态渲染dom不更新vue push()和s...
    99+
    2022-11-13
  • vue3中vue-meta的使用方法解析
    目录vue-meta的使用方法1.安装2.一般使用方法3.与vuex,vue-route结合使用使用vue-meta处理元信息vue-meta有以下特点如何使用vue-meta的使用...
    99+
    2022-11-13
  • vue中使用jwt-decode解析token的方法
    安装: cnpm i -S jwt-decode 引入: import jwt_decode from "jwt-decode"; 使用: import jwt_decode f...
    99+
    2022-11-13
  • VUE中的exportdefault和export使用方法解析
    目录export default和export的区别export default简单示例注意:代码示例export default和export的区别 export主要用于对外输出本...
    99+
    2022-12-14
    VUE export default VUE export
  • vue中methods、mounted等的使用方法解析
    目录methods、mounted的使用方法vue生命周期(methods、mounted)1.什么是生命周期2.钩子函数3.Vue生命周期之初始化阶段methods、mounted...
    99+
    2022-11-13
  • vue项目中使用this.$confirm解析
    目录vue使用this.$confirmvue TypeError: this.$confirm is not a function错误解决方案vue使用this.$confirm ...
    99+
    2022-11-13
  • vue$attrs的使用全面解析
    目录$attrs的使用vue以下是$attrs的使用示例1.父组件(Father.vue)2.儿子组件(Child.vue)3.孙子组件(GrandChild.vue)$attrs到...
    99+
    2022-11-13
  • vue函数@click.prevent的使用解析
    目录@click.prevent的使用@click.prevent的作用是什么?@click.stop与@click.prevent@click.stop@click.prevent...
    99+
    2022-11-13
  • vue中.vue文件解析的示例分析
    这篇文章将为大家详细讲解有关vue中.vue文件解析的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。vue 提供了一个 compiler.parseCompone...
    99+
    2022-10-19
  • Vue中的路由配置项meta使用解析
    目录Vue路由配置项meta使用这里简单的举两个例子Vue路由中的meta问题meta (元数据)Vue路由配置项meta使用 meta简单来说就是路由元信息 也就是每个路由身上携带...
    99+
    2022-11-13
    Vue路由 Vue路由配置 Vue meta使用
  • vue绑定使用touchstarttouchmovetouchend解析
    目录绑定使用 touchstart touchmove touchend解决touchstart touchend事件无效失效绑定使用 touchstart touchmove to...
    99+
    2022-11-13
  • vue文件使用iconfont解析
    目录vue使用iconfont项目中正确使用iconfontvue使用iconfont 1、导入字体文件到assets中 2、main.js 导入 import '@/assets...
    99+
    2022-11-13
  • Vue透传Attributes使用解析
    透传是vue中一种特性,官方的解释是:“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribut...
    99+
    2023-02-01
    Vue透传Attributes Vue Attributes
  • vue中computed和watch的使用实例代码解析
    需求: 1.点击按钮实现天气的切换;2.用watch进行监视天气产生变化的数据; 实现代码(helloworld.vue实现代码): <template> <...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作