vue 组件同页面多次调用 props 传值无效

项目场景:

在同一个编辑页面使用了同一个Vue组件,导致props 传值无效


问题描述:

在做一个文章编辑的页面,需要通过切换文章类型 ( 音频 / 视频) 显示隐藏上传不同类型的按钮给用户上传 , 例如以下代码会出现一个奇怪的问题, 当我从article_mode 从音频 切换到 视频 的时候 filters的改变无效:

// 音频组件
<upload-component
    v-if="article_mode ==10"
   :value.sync="article_audio"
   :filters="{
    
    
     mime_types : [
       {
    
    title : 'Mp3 files', extensions : 'mp3' }
     ],
     max_file_size : '20mb'
   }"
 />
}
// 视频组件
<upload-component
   v-if="article_mode ==20"
   :value.sync="article_video"
   :filters="{
    
    
     mime_types : [
       {
    
    title : 'Mp4 files', extensions : 'mp4' }
     ],
     max_file_size : '30mb'
   }"
 />
}

解决方案:

增加一个:key 作用域

key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改、复用相同类型元素的算法,而使用key时,它会基于key的变化重新排列元素顺序,并且会移除key不存在的元素。此外有相同父元素的子元素必须有独特的key,重复的key会造成渲染错误。

// 音频组件
<upload-component
    v-if="article_mode ==10"
   :key="0" // 新增
   :value.sync="article_audio"
   :filters="{
    
    
     mime_types : [
       {
    
    title : 'Mp3 files', extensions : 'mp3' }
     ],
     max_file_size : '20mb'
   }"
 />
}
// 视频组件
<upload-component
   v-if="article_mode ==20"
   :key="1" // 新增
   :value.sync="article_video"
   :filters="{
    
    
     mime_types : [
       {
    
    title : 'Mp4 files', extensions : 'mp4' }
     ],
     max_file_size : '30mb'
   }"
 />
}

猜你喜欢

转载自blog.csdn.net/abc564643122/article/details/112838082