javascript - 在 vue.js 中使用动态组件

标签 javascript vue.js

我有一个简单的应用程序,需要动态渲染 2 个组件。

  • 组件 A - 需要有 onClick 事件。
  • 组件 B - 需要有 onChange 事件。

如何动态地将不同的事件附加到组件 A/B?

<template>
  <component v-bind:is="currentView">
  </component>
</template>

<script>
import A from '../components/a.vue'
import B from '../components/b.vue'

export default {
  data: function () {
    return {
      currentView: A
    }
  },
  components: { A, B }
}
</script>

最佳答案

这是针对更复杂和更现实的用例的解决方案。在此用例中,您必须使用 v-for 渲染多个不同的组件。

父组件将组件数组传递给create-componentscreate-components 将在此数组上使用 v-for,并显示具有正确事件的所有这些组件。

我使用自定义指令 custom-events 来实现此行为。

父级:

<template>
    <div class="parent">
        <create-components :components="components"></create-components>
    </div>
</template>

<script>
import CreateComponents from '@/components/CreateComponents'
import ComponentA from '@/components/ComponentA'
import ComponentB from '@/components/ComponentB'

export default {
    name: 'parent',
    data() {
        return {
            components: [
                {
                    is: ComponentA,
                    events: {
                        "change":this.componentA_onChange.bind(this)
                    }
                },
                {
                    is: ComponentB,
                    events: {
                        "click":this.componentB_onClick.bind(this)
                    }
                }
            ]
        }
    },
    methods: {
        componentA_onChange() {
            alert('componentA_onChange');
        },
        componentB_onClick() {
            alert('componentB_onClick');
        }
    },
    components: { CreateComponents }
};
</script>

创建组件:

<template>
    <div class="create-components">
        <div v-for="(component, componentIndex) in components">
            <component v-bind:is="component.is" v-custom-events="component.events"></component>
        </div>
    </div>
</template>

<script>
export default {
    name: 'create-components',
    props: {
        components: {
            type: Array
        }
    },
    directives: {
        CustomEvents: {
            bind: function (el, binding, vnode) {
                let allEvents = binding.value;
                if(typeof allEvents !== "undefined"){
                    let allEventsName = Object.keys(binding.value);
                    allEventsName.forEach(function(event) {
                        vnode.componentInstance.$on(event, (eventData) => {
                            allEvents[event](eventData);
                        });
                    });
                }
            },
            unbind: function (el, binding, vnode) {
                vnode.componentInstance.$off();
            }
        }
    }
  }
</script>

关于javascript - 在 vue.js 中使用动态组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029628/

相关文章:

javascript - RegExp 问题 - 字符限制和空白忽略

javascript - iframe 最初未完全加载,但刷新后可以工作

javascript - 使用ajax调用Action不显示页面

vue.js - 全局禁用对 vuetify 组件的链式 react

javascript - 我可以在回调函数中访问 jquery.data 吗?

vue.js - Vue 2.0.1和Electron-可视Flash

javascript - Vue 日期值,以 ISO 格式获取当前日期减去 1 天

vue.js - vue中输入失去焦点时如何执行函数

node.js - 将 VueJS 前端与 Express REST 后端结合起来?

javascript - Jquery ui slider 移动到下一个值