首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue嵌套自定义组件范围

Vue嵌套自定义组件范围
EN

Stack Overflow用户
提问于 2017-04-17 17:39:08
回答 1查看 1.2K关注 0票数 1

我想要创建一组可重用的实用程序/非ui组件,通过允许它成为:

  • 附加到http数据源
  • 已排序
  • 分页
  • 过滤等

我希望我在使用它时拥有的代码如下:

代码语言:javascript
复制
<my-app>
  <data-table :url="url">
    <table>
      <thead>
        <tr>
          <dt-th sort-key="name">Name</dt-th>
          <dt-th sort-key="surname">Surname</dt-th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="row in data">
          <td>{{ row.name }}</td>
          <td>{{ row.surname }}</td>
        </tr>
      </tbody>
    </table>
  </data-table>
</my-app>

上面的代码最大的问题是Vue在MyApp组件中查找,以解决dt-th元素、data表达式等问题。

你可以在这里找到我的伪应用程序:https://plnkr.co/edit/30Z7L3zrfrGmED17QrIh?p=preview

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-17 17:53:26

您的数据问题可以使用作用域槽解决。

代码语言:javascript
复制
const DataTable = {
  components: {
    'dt-th': DataTableHeaderCell
  },
  props: ['src'],
  data () {
    return {
      data: [
        { name: 'Gale', surname: 'Marlon' },
        { name: 'Corwin', surname: 'Hayden' }
      ]
    }
  },
  created () {
    EventBus.$on('sort', this.sort)
  },
  methods: {
    sort (sortKey) {
      console.log(`Sorting by ${sortKey}`)
    }
  },
  template: `
    <div><slot :rows="data"></slot></div>
  `
}

你的模板变成

代码语言:javascript
复制
<data-table :src="src">
  <template scope="{rows}">
    <table>
      <thead>
        <tr>
          <dt-th sort-key="name">Name</dt-th>
          <dt-th sort-key="surname">Surname</dt-th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="row in rows">
          <td>{{ row.name }}</td>
          <td>{{ row.surname }}</td>
        </tr>
      </tbody>
    </table>
  </template>
</data-table>

要解决您的dt-dh问题,可以将其公开给Vue。

代码语言:javascript
复制
const DataTableHeaderCell = {
  props: ['sort-key'],
  methods: {
    emit () {
      EventBus.$emit('sort', this.sortKey)
    }
  },
  template: `
    <th @click="emit"><slot></slot></th>
  `
}

Vue.component("dt-th", DataTableHeaderCell)

这是你的柱塞更新

另一种选择是通过作用域传递DataTableHeaderCell的定义。

代码语言:javascript
复制
const DataTable = {
  props: ['src'],
  data () {
    return {
      data: [
        { name: 'Gale', surname: 'Marlon' },
        { name: 'Corwin', surname: 'Hayden' }
      ], 
      DataTableHeaderCell
    }
  },
  created () {
    EventBus.$on('sort', this.sort)
  },
  methods: {
    sort (sortKey) {
      console.log(`Sorting by ${sortKey}`)
    }
  },
  template: `
    <div><slot :rows="data" :header="DataTableHeaderCell"></slot></div>
  `
}

在你的模板里

代码语言:javascript
复制
<data-table :src="src">
  <template scope="{rows, header}">
    <table>
      <thead>
        <tr>
          <th :is="header" sort-key="name">Name</th>
          <th :is="header" sort-key="surname">Surname</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="row in rows">
          <td>{{ row.name }}</td>
          <td>{{ row.surname }}</td>
        </tr>
      </tbody>
    </table>
  </template>
</data-table>

下面是这方面的示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43456481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档