【问题标题】:Vue.js dynamic components don't changeVue.js 动态组件不会改变
【发布时间】:2020-06-29 21:43:39
【问题描述】:

我正在构建一个基于 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 不同并且被正确渲染,但是过渡没有意识到发生了变化并且不会触发。

任何想法我可以如何解决这个问题 - 或者在过渡中组合模块的不同方法?

【问题讨论】:

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


    【解决方案1】:

    由于组件被重用,没有新的实例可以换入,也不会触发转换,因为实例/模板被重用了。这是默认行为。但是您可以通过使用独特的key 来改变它:

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

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

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

    【讨论】:

    • 谢谢@Dan,解决了这个问题。我之前尝试过一个键,但也许我使用了一个静态值。
    猜你喜欢
    • 2018-08-24
    • 2016-12-23
    • 2018-03-07
    • 2020-09-18
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2012-06-02
    • 2018-03-13
    相关资源
    最近更新 更多