作用域插槽简单应用

作用域插槽简单应用

Parent.vue

<template>
  <div class="content">
    <Child
      :data="data"
      :columns="columns"
    >
      <template slot="name" slot-scope="{ row }">
        姓名:{{ row.name }}
      </template>

      <template slot="age" slot-scope="{ row }">
        {{ row.age }} -- {{ row.age }}
      </template>

      <template slot="action" slot-scope="{ row }">
        <a href="javascript:;" @click="edit(row)">编辑</a>
      </template>
    </Child>
  </div>
</template>

<script>
import Child from "@/components/Child";

export default {
  name: "Parent",

  components: {
    Child,
  },

  data() {
    return {
      data: [
        {
          name: "John Brown",
          age: 18,
          address: "New York No. 1 Lake Park",
        },
        {
          name: "Jim Green",
          age: 24,
          address: "London No. 1 Lake Park",
        },
        {
          name: "Joe Black",
          age: 30,
          address: "Sydney No. 1 Lake Park",
        },
        {
          name: "Jon Snow",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
        },
      ],
      columns: [
        {
          title: '姓名',
          key: 'name',
        },
        {
          title: '年龄',
          key: 'age',
        },
        {
          title: '地址',
          key: 'address',
        },
        {
          title: '操作',
          key: 'action',
        }
      ]
    };
  },

  methods: {
    edit(row) {
      console.log(row.name);
    }
  }
};
</script>

<style scoped>
.content {
  width: 800px;
}
</style>

Child.vue

<template>
  <table border class="table">
    <thead>
      <tr>
        <th
          v-for="(item, index) in columns"
          :key="index"
          class="th"
        >
          {{ item.title }}
        </th>
      </tr>
    </thead>
    <tbody>
      <tr
        class="data-item"
        v-for="(data_row, data_index) in data"
        :key="data_index"
      >
        <td
          v-for="(item, index) in columns"
          :key="index"
        >
          <template v-if="$scopedSlots[item.key]">
            <slot :name="item.key" :row="data_row"></slot>
          </template>
          <template v-else>{{ data_row[item.key] }}</template>
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
  name: 'Child',

  props: {
    data: {
      type: Array,
      required: true,
      default() {
        return []
      }
    },

    columns: {
      type: Array,
      required: true,
      default() {
        return []
      }
    }
  },
}
</script>

<style scoped>
.table {
  width: 100%;
}

.th {
  height: 40px;
  text-align: center;
}

.data-item {
  height: 48px;
}

td {
  text-align: center;
}
</style>

效果图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值