【问题标题】:How to use child <template> tags per directive/component invocation to create dynamic templates?如何在每个指令/组件调用中使用子 <template> 标签来创建动态模板?
【发布时间】:2019-03-20 20:10:26
【问题描述】:

我正在尝试将 AngularJS 指令移植到 VueJS,但我无法破解这个特殊的问题...

简单地说,我有一个“通用”列表指令。在指令的每次调用下都有一个&lt;template&gt; 标记,它定义了tbody 的呈现方式。在 AngularJS 中,我能够通过在每次调用 &lt;my-directive&gt; 时将 #myDirectiveBaseTemplate 中的 tbody[target='true'] DOM 替换为 my-directive &gt; template 的内容来实现这一点(加上一点 $compile 服务majic 混合以使其顺利进行-去)。

VueJS 似乎没有让我访问这个低级功能,或者当它(有点)它没有给我对当前_element 的引用所以我无权访问每个调用的&lt;template&gt; 标签。

简化的 AngularJS 指令代码定义如下:

<my-directive data="some.list" mapping="[ 'property', 'property2' ]">
    <template>
        <tbody>
            <tr ng-repeat="item in data">
                <td>{{item.property}}</td>
                <td>{{item.property2}}</td>
            </tr>
        </tbody>
    </template>
</my-directive>

myDirective 首先拉入基础text/ng-template,看起来像这样:

<script type="text/ng-template" id="myDirectiveBaseTemplate">
    <table>
        <thead>
            <tr ng-repeat="prop in mapping" ng-click="doSort(prop)">
                {{prop}}
            </tr>
        </thead>
        <tbody target="true"></tbody>
    </table>
</script>

在渲染期间,#myDirectiveBaseTemplate 中的 tbody[target='true'] 被 DOM 替换为每个调用的 my-directive &gt; template,从而基于每个嵌入的 templatemy-directeive 的每个调用创建自定义 HTML。

那么...我到底要如何在 VueJs 中完成这个任务?!?

编辑 1:

my-directive 的第二次调用可能如下所示:

<my-directive data="some.list" mapping="[ 'order.delivered', 'person.name', 'person.dob' ]">
    <template>
        <tbody>
            <tr ng-repeat="item in data">
                <td>{{item.order.delivered ? 'Delivered' : ''}}</td>
                <td>{{item.person.name}}</td>
                <td>{{item.person.dob | format:'yyyy-mm-dd'}}</td>
            </tr>
        </tbody>
    </template>
</my-directive>

请注意,上面的示例已经过简化。 my-directive 实际上可以在自己内部定义多达 5 个不同的 &lt;template&gt;s 来修改“通用”列表的各个部分(例如 &lt;template type='row'&gt;&lt;template type='help'&gt; 等)。然而,所有的目的都是一样的;修改/添加到底层指令 HTML 的 DOM 的各个部分。

【问题讨论】:

  • 您能否添加一个示例,说明my-directive &gt; tbody template 将如何为my-directive 的每次调用定制/不同,除了显示不同的项目?
  • 看来您正在寻找作用域插槽
  • @StephenThomas 也许,但我遇到的问题是访问&lt;template&gt;s 以进行操作。 DOM。我倾向于能够在渲染中的给定点访问一个或另一个(主要的 template_elements &lt;template&gt; 标签,但不能同时访问两者):( 或者 VueJS 已经删除了 &lt;template&gt; 标签( binding) 甚至在生命周期的早期。
  • 'DOM 操作' 表述不够清楚,因为 Vue.js 有很多工具可以将 DOM 绑定到组件状态。 Vue 允许您通过以下方式访问 DOM 本身:vuejs.org/v2/guide/… 但最佳实践是首先寻找更多框架式的方式来实现所需的结果

标签: vuejs2 vue-directives


【解决方案1】:

我无法理解您的&lt;template&gt; 是否存在这种情况 将为my-directive 的每次调用创建“自定义 HTML”,除了在每个表行显示不同的项目属性。 如果这只是调用之间的区别,那么您的 Vue.js 组件模板可能看起来像:

Vue.js ChildTbodyComponent.vue 模板:

<tbody>
    <tr v-for="item in items" :key="item.id">
        <td>{{item.property}}</td>
        <td>{{item.property2}}</td>
    </tr>
</tbody>

Vue.js ParentTableComponent.vue 模板:

<table>
    <thead>
        <tr v-for="header in headers" :key="header.name" @click="doSort(header)">
            {{header.name}}
        </tr>
    </thead>
    <child-tbody-component :items="arrayOfDataForRows"></child-tbody-component>
</table>

【讨论】:

  • 上面的例子已经被简化了很多。我实际上有 5 个不同的&lt;template&gt;,它们定义了表/指令的各个部分;标题栏控件 Left 和 Right、TBODY、Tooltip 和 Help(但它们都提供相同的通用用途,小部分被集成到更大的列表控件中)。
猜你喜欢
  • 2017-10-11
  • 2013-01-29
  • 2015-03-17
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多