javascript - Vue.js 动态组件不会改变

标签 javascript vue.js vuejs2 vue-component vue-transitions

我正在构建一个基于 Vue.js 的 SPA,我想在其中的多个内容部分之间进行转换:

<template>
    <transition name="fade">
        <component 
            :is="options[active].type" 
            v-bind="options[active].props"
        />
    </transition>
</template>

<script>
const content = [
    {type: 'ContentHeader', props: {...}},
    {type: 'ContentModule', props: {...}},
    {type: 'ContentModule', props: {...}}
];

import ContentHeader from '...';
import ContentModule from '...';

export default {
    components: {
        ContentHeader,
        ContentModule
    },

    data: () => ({
        active: 0,
        options: content
    })
};
</script>

当我将 active 属性从 0 更改为 1 时,动态组件会发生变化并触发转换。但是,切换到最后一个组件则不然 - 它具有与之前的元素类型相同的元素类型。组件的 props 不同并且渲染正确,但是转换没有意识到发生了变化并且不会触发。

有什么想法可以解决这个问题 - 或者在转换中使用不同的方法来组合模块吗?

最佳答案

由于组件被重用,因此没有新的实例可以交换,并且不会触发转换,因为实例/模板被重用。这是默认行为。但您可以通过使用唯一的来更改它:

<component 
    :is="options[active].type" 
    v-bind="options[active].props"
    :key="active"
/>

在这里,我使用 active 索引作为唯一标识符,告诉 Vue 对每个组件使用新的实例。

这个问题经常出现在具有使用同一组件的多个路由的路由器的上下文中,答案是也使用key

关于javascript - Vue.js 动态组件不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60745610/

相关文章:

javascript - 如何合并/推送 Javascript 数组中的重复值

javascript - JS - 如何匹配重叠的时间范围?

vue.js - Vue-cli 3组件库支持SSR

javascript - 使用 Javascript 调用外部 API

javascript - 如何通过 $.getScript() 获取脚本文件

javascript - 使用 jQuery 滚动浏览器窗口

javascript - 上传前获取图像的文件名 - JQuery

vue.js - vue-instagram : images showing as icons, 即使 src/url 是正确的

javascript - 使用谷歌地图的 Vue.js 单页组件中找不到模块错误

Vue.js/Vuex 登录 : [vuex] unknown action type: postLogin.