【问题标题】:Vue directive to compile custom directivesVue 指令编译自定义指令
【发布时间】:2019-11-06 17:04:39
【问题描述】:

我编写了一个使用 vue 的 Render 函数的包装器指令。 在渲染函数内部,它所做的只是:

render: function(createElement) {
    const compiled = Vue.compile(this.$props.template);
    return compiled.render.call(this, createElement);
}

我使用的是这样的:

<Render v-for="item in itemsToRender" :key="item.id" />

这适用于原生 html 元素:

const itemsToRender = ['<p>test</p>', '<h1>HELLO</h1>'];

但是,如果我传入我自己的自定义指令,例如

<my-directive></my-directive>

然后vue会抱怨未知组件。这可能是因为我没有在渲染指令的上下文中导入/需要自定义指令。有解决办法吗?我需要让这个包装器指令进行编译的原因是因为像 vue.Draggable 这样的库依赖于“v-for”来重新排序列表元素。但是,我希望能够让不同的组件可拖动,这就是为什么我只传递模板以编译到 v-for 中。

【问题讨论】:

    标签: vue.js vue-component vue-directives


    【解决方案1】:

    您可以使用组件标签。签出:https://vuejs.org/v2/guide/components.html#Dynamic-Components

    我这里做了一个例子:https://codepen.io/bergur/pen/jjwzEq

    流程大致是这样的:

    1. 我在我的应用程序中注册了组件
    2. 在 listItemsToRender 数据属性中列出它们
    3. 使用&lt;component&gt;标签来渲染它们

    这里是代码

    new Vue({
      name: 'main',
      el: '#main',  
      components: {
        CompA,
        CompB
      },
      data() {
        return {
          header: 'Multiple components',
          itemsToRender: [CompA, CompB]           
        }
      },  
      template: `
      <div>
         {{ header }}
         <component v-for="item in itemsToRender" :is="item" />
      </div>`
    })
    

    【讨论】:

    • 你是个救命的人!当&lt;component/&gt; 开箱即用时,我一直尝试制作这些包装器指令......如果itemsToRender 中的项目只是像&lt;p&gt;hi&lt;/p&gt; 这样的常规html 模板,这不会编译项目,对吧?如果我想让这个通用并接受任何东西。我是否会创建一个自定义指令,将某种类型传递给该 id 用于在 switch 语句中返回 &lt;component&gt; 或我现有的 Vue.Compile 代码?
    • 你是对的,它不会渲染

      Hi 除非它是一个组件。一种解决方案是制作一个只有

      hi

      作为模板的简单组件,将其注册并放入数组列表中。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2016-01-27
    • 1970-01-01
    • 2015-11-16
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多