vue救命技巧:如何强制更新组件?

简介: 【8月更文挑战第17天】vue救命技巧:如何强制更新组件?

需求背景

这几天开发项目,做了一个可滚动的表格,表格用的是公司的组件。正常情况下,一切滚动行为正常。
Untitled.gif
但,当我通过页面内的操作改变表格高度时,bug出现了!如图,可以清楚的发现,滚动条滚动异常了!有一部分超出了表格区域。
Untitled.gif
一番检查下来,我发现了问题:公司表格组件的内部滚动组件封装的有问题,当表格的高度变化时,它没有监听响应,依旧使用之前的容器高度作为滚动区域。因此,滚动条才会出现如此怪异的问题。
我尝试改变手动改变组件内的dom高度,但是滚动条依旧有问题,因为这里的滚动条高度是在组件内部计算的。

显然,要解决这个问题,最好的办法就是从源头出发,去更改组件库底层源码。但这不现实,公司底层组件的bug修复需要很久,还要求爷爷告奶奶,最后发版才能用。

于是,我想到了一个简单的办法:强制更新组件,让它的样式什么的全部重新加载!

如何强制更新组件

使用v-if

在vue中,我们通常会使用v-if或者v-show来控制组件的显示与隐藏,v-if会让组件销毁与重新渲染,显然,我可以使用v-if来强制重新渲染组件。

<template>
    <div>
        <header>
            <span @click="update">组件重新渲染</span>
        </header>
        <ControlTable v-if="show"></ControlTable>
    </div>
</template>
<script setup>
import ControlTable from './ControlTable.vue';

const show = ref(true);

const update = () => {
   
   
    show.value = false;
    setTimeout(() => {
   
   
        show.value = true;
    }, 500);
};
</script>

Untitled.gif
通过设置定时器及控制show的状态,我们实现了强制更新组件的目的。但是,由于定时器设置了500ms,导致页面有短暂的空白。其实,这个问题很好解决,我们将时间设置为0就可以了。

const update = () => {
   
   
    show.value = false;
    setTimeout(() => {
   
   
        show.value = true;
    }, 0);
};

如图,这样就解决了短暂白屏的问题。
Untitled.gif

你可能好奇为啥设置0也能实现,这其实和js的事件循环有关,setTimeout是宏任务,它会在所有微任务执行完后才继续执行。

使用v-bind:key

v-bind:key(通常简写为 :key)是我们非常熟悉的东西。它用于在渲染列表时为每个元素提供唯一标识,以便 Vue 能够高效地更新和重新渲染元素。
我们熟悉的它经常这么用

<template>
  <ul>
    <li v-for="user in users" :key="user.id">{
   
   {
   
    user.name }}</li>
  </ul>
</template>

它还有另一个作用:当它变化时,它会强制更新组件!

<template>
    <div>
        <header>
            <span @click="update">组件重新渲染</span>
        </header>
        <ControlTable :key='time'></ControlTable>
    </div>
</template>
<script setup>
import ControlTable from './ControlTable.vue';

const time = ref(0);

const update = () => {
   
   
    time.value++
};
</script>

上述代码中,当点击按钮时,key的值会变化,从而强制重新渲染子组件。
Untitled.gif
它的效果和v-if完全一致。

什么情况下还可以强制更新组件

除了解决样式问题,我们还可以使用强制更新组件的方式重置组件内的数据状态等内容。
假设我们接手了一个项目,项目要求我们点击某个按钮后,重新请求组件内的数据。
image.png
正常情况下,我们肯定是在组件外部调用组件内的初始化方法或者接口。

<template>
    <div>
        <header>
            <span @click="update">更新组件内数据</span>
        </header>
        <ControlTable ref='table'></ControlTable>
    </div>
</template>
<script setup>
import ControlTable from './ControlTable.vue';

const table = ref(null);

const update = () => {
   
   
    // 调用组件内的初始化方法
    table.value.init();
    // 调用组件内的某个数据请求
    table.value.fecth1();
    // 调用组件内的某个数据请求
    table.value.fecth2();
    // 调用组件内的某个数据请求
    table.value.fecth2(); 
};
</script>

基于这种方法,我们必须看别人的(shishan)代码,知道哪些方法用来更新数据,费时费力!
但是,我们如果强制更新组件,组件会重新加载,一切就会变得非常简单!

<template>
    <div>
        <header>
            <span @click="update">更新组件内数据</span>
        </header>
        <ControlTable :key='time'></ControlTable>
    </div>
</template>
<script setup>
import ControlTable from './ControlTable.vue';

 const time = ref(new Date().getTime());

const update = () => {
   
   
    time.value = new Date().getTime();
};
</script>

总结

在Vue中,通常不需要强制更新组件,因为Vue的响应式系统会自动追踪依赖并在数据变化时自动更新视图。然而,基于时间、条件等现实情况下,我们有时迫不得已需要强制更新组件,解决一些难以处理的问题。主要方法就是使用v-if或者更新组件的key值,实际开发中,大家还是仁者见仁,结合实际情况,尽量避免使用把。

相关文章
|
27天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
29天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
24天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
3天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
36 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
24天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
29 8
|
24天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
27天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
24 1
|
27天前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
29 1
下一篇
DataWorks