• vue组件的重新渲染的问题


    目录

    1.方式1

    2.方式2


    1.方式1

    修改组件上的key属性

    Vue是通过diffing算法比较虚拟DOM和真实DOM,来判断新旧 DOM 的变化。key是虚拟DOM对象的标识,在更新显示时key表示着DOM的唯一性。
    DOM是否变化的核心是通过判断新旧DOM的key值是否变化,如果key发生改变,则重新渲染该DOM,如果key没变,则不会重新DOM。

    如果想让组件重新渲染,只需要给组件加上key属性,然后在需要重新渲染的时候,将组件绑定的key值更改就可以。

    1. <div class="item" v-for="(item, index) in list" :key="item.id">
    2. <child :id="item" :key="key"></child>
    3. </div>

    比如常见的v-for指令会经常使用到key属性,key属性内容一般使用id,因为id是唯一的。当list的内容发生变化时,vue会进行比较,key值没有变化的则不会渲染,只有key值变换的才会进行局部的渲染,这样避免了list发生了变化,整个列表都要重新渲染的问题,所有通过key属性的使用提高了性能。

    所以说,如果想重新渲染组件时,只需要改变key属性即可。

    例如对话框中的上传组件,每次打开需要重新渲染,避免保留上次上传的文件信息。

    1. <template>
    2. <a-modal :visible="visiable" :title="title" @ok="handleOk" @cancel="handleCancel" :ok-loading="okLoad" >
    3. <a-upload draggable accept=".xlsx" :custom-request="customRequest" :limit='1' :key="KeyInfo"/>
    4. </a-modal>
    5. </template>
    6. <script lang="ts" setup>
    7. import {importInfo, dowload} from '@/api/upload';
    8. import {Message} from '@arco-design/web-vue';
    9. import moment from "moment"
    10. import {ref} from 'vue'
    11. const prop = defineProps({
    12. title: String,
    13. params: String,
    14. })
    15. const visiable = ref(false);
    16. const okLoad = ref(false)
    17. const KeyInfo = ref(Math.random());
    18. let fileInfo:any = {}
    19. // 自定义上传事件
    20. const customRequest = (option: any) => {
    21. const {onProgress, onError, onSuccess, fileItem, name} = option
    22. fileInfo = fileItem;
    23. onSuccess()
    24. console.log("上传文件信息:" + JSON.stringify(fileInfo))
    25. }
    26. const emit = defineEmits(['handleQuery'])
    27. const open = () => {
    28. visiable.value = true
    29. KeyInfo.value = Math.random()
    30. }
    31. // 导出方法在父组件中进行使用
    32. defineExpose({open});
    33. // 关闭弹框
    34. const handleCancel = () => {
    35. visiable.value = false
    36. KeyInfo.value = Math.random()
    37. }
    38. // 确定事件
    39. const handleOk = async () => {
    40. okLoad.value = true;
    41. // 上传文件不能为空
    42. if(!fileInfo.name){
    43. Message.error({content:'上传的文件不能为空',position:'top'})
    44. okLoad.value = false;
    45. return
    46. }
    47. try {
    48. let formData = new FormData()
    49. formData.set('file', fileInfo.file)
    50. formData.set('data', prop.params ? prop.params : '')
    51. const res = await importInfo(formData)
    52. if (res == '1') {
    53. Message.success({content: '操作成功', position: 'top'});
    54. } else {
    55. Message.error({content: '导入的文件中存在重复,重复的地点信息请参照下载的文件', position: 'top'});
    56. await dowload('/em/file/mb1002', '', `地点信息_${moment().format('yyyyMMDDHHmmss')}.xlsx`, {})
    57. }
    58. visiable.value = false
    59. emit('handleQuery')
    60. fileInfo = {}
    61. KeyInfo.value = Math.random()
    62. } catch (e) {
    63. console.log(e)
    64. } finally {
    65. okLoad.value = false;
    66. }
    67. }
    68. </script>

    在upload组件中追加了key属性, 组件第一次加载时,key的内容为随机数,打开时设置为随机数。这样每次打开时,key变化了,所以upload组件会重新渲染。

    2.方式2

    使用v-if指令

    当DOM设置为false的时候,当前条件块中的DOM会被销毁。如果条件块包含的是组件,则组件对应的生命周期函数(beforeDestroy、destroyed等)会执行。
    当DOM设置为true的时候,当前条件块中的DOM会被重建。如果条件块包含的是组件,则组件对应的生命周期函数(created、mounted等),计算属性,watch等都会执行,相当于重新渲染。

    参照:

    Vue - 组件重新渲染的两种方式_vue重新渲染dom-CSDN博客

    Vue 中 强制组件重新渲染的正确方法_forceupdate-CSDN博客

  • 相关阅读:
    docker容器启动后修改或添加端口
    源码分析:Transport 开发
    编程小白的自学笔记十四(python办公自动化创建、复制、移动文件和文件夹)
    项目上线计划表
    TCP三次握手以及UDP相关知识
    Chapter9:Simulink建模与仿真
    【Vue2】VantUI项目-基础入门03
    光传输系统中宽带光纤放大技术的频谱拓展方案
    Spring Security 如何维持单点状态
    关于栈帧的一些知识点与理解
  • 原文地址:https://blog.csdn.net/m0_72167535/article/details/136380065