【问题标题】:vuejs - <slot> in repeating table rowvuejs - <slot> 在重复表行中
【发布时间】:2016-12-22 13:43:23
【问题描述】:

我正在使用此解决方案在 vuejs 组件中动态设置表格单元格:

http://forum.vuejs.org/topic/526/repeating-table-row-with-slot

这仅适用于 Vue.js v1.0.10,但不适用于当前版本 v1.0.26。

Jsfiddle:https://jsfiddle.net/peL8fuz3/

我正在尝试获取以下标记(项目对象应该在组件中可用)

<div id="vue">
    <basic-table>
        <table-cell>{{ item.id }}</table-cell>
        <table-cell>{{ item.title }}</table-cell>
    </basic-table>
</div>

Vue.js 组件(更多内容)

Vue.component('basic-table', {
    template: '<table><tbody><tr v-for="item in collection" v-slot></tr></tbody></table>',
    data: function () {
        return {
            collection: [
                {id: 1, title: 'Vue'},
                {id: 2, title: 'Vue 2'},
                {id: 3, title: 'Vue 3'},
                {id: 4, title: 'Vue 4'},
            ]
        }
    }
});

有人知道怎么解决吗?

编辑 还没有找到可行的解决方案 - 仍在寻找..

【问题讨论】:

  • 您不能使用插槽并将单元格数据作为道具传递给表格单元格组件。在当前版本的 vue 中,我认为 slot 指令只是 slot 而不是 v-slot 但两者都可能被接受
  • 检查 jsfiddle - 定义了一个 slot - 指令:)
  • VueJS 中的模板实际上不是 HTML,它代表了一个封装在语法糖中的渲染函数,与真正的 HTML 非常相似。这就是为什么你必须在 tr 里面有 td,在 ul 里面有 li。

标签: javascript components vue.js vue-component


【解决方案1】:

很难找出究竟出了什么问题,但该代码自 v1.0.18 以来已被破坏。我无法深入挖掘以消除确切的提交,但进行了一些优化,可能会影响$context._content 渲染。

解决方案

但是你可以通过改变来解决你的问题

var raw = host.$options._content; 

到

var raw = host._context._directives.filter(function (value) {
    return !(value.Component === undefined);
})[0].el;

该更改与 v1.0.26 兼容。您可以找到固定代码here。

免责声明

我未能找到使用公共 API 实现相同结果的方法。所以这个解决方案也依赖于非公共 API,因此可能会在未来的版本中中断。

【讨论】:

  • 谢谢!但是这个解决方案不够动态,没有工作例如。如果我有更多数据:/
  • @Aaroniker 你的意思是更多的指令吗?
  • @Aaroniker 似乎我知道哪里出了问题。我会更新我的答案
  • @Aaroniker 我猜这是因为私有 api 被 minifier 重命名了。我会看看是否有可能解决它
  • @Aaroniker 在这里相同 :( 问题不在于缩小器,而在于完整版本和缩小版本之间的不同行为。仍在寻找解决方案
【解决方案2】:

Aaron,我的回答可能对你的问题不满意,但你为什么不把它简化为下面的代码,但你必须使用指令和所有这些东西?

我仍在弄清楚为什么您的解决方案适用于以前的版本,而不是当前版本。 :D

new Vue({
  el: '#vue',
  data: {
    items: [{
      id: 1,
      title: 'Vue'
    }, {
      id: 2,
      title: 'Vue 2'
    }, {
      id: 3,
      title: 'Vue 3'
    }, {
      id: 4,
      title: 'Vue 4'
    }, ]
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<table border="1" class="table" id="vue">
  <tbody>
    <tr v-for="item in items">
      <td>{{item.id}}</td>
      <td>{{item.title}}</td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 因为组件“basic-table”在我的应用程序中更复杂——我只想动态定义表格单元格——所以项目对象应该在&lt;basic-table&gt;中可用
  • @trungk 如果有帮助,新版本上的 raw.children.length = 0 似乎
  • 抱歉 Aaron 我仍然没有找到解决方案,但 @vsminkov 似乎找到了。
猜你喜欢
  • 2021-02-27
  • 2017-06-10
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2020-04-22
  • 2020-08-13
  • 2019-06-28
  • 2018-05-18
相关资源
最近更新 更多