Table案例-组件、插槽、自定义指令

1.请求商品列表的数据

//商品列表数据
const goodslist = ref([]);
const getGoodsList = async () => {
  const res = await axios.get("https://www.escook.cn/api/goods");
  // console.log(res);
  if (res.status !== 200) return console.log("获取商品列表数据失败!");
  goodslist.value = res.data.data;
};
watchEffect(() => {
  getGoodsList();
});

2.封装MyTable组件

//1.用户通过defineProps为MyTable.vue组件指定数据源
//2.在MyTable组件中,预留名称为header的具名插槽
//3.在MyTable.vue中,预留名称为body的作用域插槽

<script setup>
defineProps({
  data: Array,
  default: [],
});
</script>

<template>
  <div class="home container">
    <table class="table table-bordered table-striped">
      <!-- 标题区域 -->
      <thead>
        <tr>
            <!-- 具名插槽 -->
          <slot name="header"></slot>          
        </tr>
      </thead>
      <!-- 内容主体区域 -->
      <tbody>
        <!-- 作用域插槽 -->
        <tr v-for="item in data" :key="item.id">
          <slot name="body" :row="item"></slot>
        </tr>       
      </tbody>
    </table>
  </div>
</template>
//在App.vue中
// v-slot:header  等价于#header
<template>  
  <MyTable :data="goodslist">
    <template #header>
      <th>序号</th>
      <th>商品名称</th>
      <th>价格</th>
      <th>标签</th>
      <th>操作</th>
    </template>
    
    <template #body="{ row }">
      <td>{{ row.id }}</td>
      <td>{{ row.goods_name }}</td>
      <td>{{ row.goods_price }}</td>
      <td>{{row.tags}}</td>        
      <td>
        <button
          type="button"
          class="btn btn-danger btn-sm">       
         删除
        </button>
      </td>         
    </template>
  </MyTable>
</template>

在这里插入图片描述

3.实现删除功能

<template>
  <MyTable :data="goodslist">
    <template #header>
      <th>序号</th>
      <th>商品名称</th>
      <th>价格</th>
      <th>标签</th>
      <th>操作</th>
    </template>

    <template #body="{ row }">
      <td>{{ row.id }}</td>
      <td>{{ row.goods_name }}</td>
      <td>{{ row.goods_price }}</td>
      <td>{{ row.tags }}</td>
      <td>
        <button
          type="button"
          class="btn btn-danger btn-sm"
          @click="onRemove(row.id)"
        >
          删除
        </button>
      </td>
    </template>
  </MyTable>
</template>

//根据id删除商品
const onRemove = (id) => {
  // console.log(id);
  //过滤出来(要显示的)数据的id不等于要删除的id
  goodslist.value = goodslist.value.filter((x) => x.id !== id);
};

4.循环渲染tag标签

<td>  
       <!-- 循环渲染标签信息 -->
        <el-tag
          type="warning"
          class="mx-1"
          effect="dark"
          v-for="item in row.tags"
          :key="item"
        >
          {{ item }}
        </el-tag>       
</td>

在这里插入图片描述

5.在标签中实现input和button

//v-if="row.inputVisible"则展示输入框,默认情况下为false,即展示 +tag,而不出现输入框
//v-model.trim="row.inputValue" 输入框中的值
//@blur="onInputConfirm(row)" 失去焦点时,触发此事件

const onInputConfirm = (row) => {
  const val = row.inputValue;
  row.inputValue = "";
  row.inputVisible = false;//失去焦点之后,自动隐藏输入框
  // 当val为空且值已经存在  row.tags.indexOf(val) ===-1说明不存在
  if (!val || row.tags.indexOf(val) !== -1) return;
  row.tags.push(val);
};

<el-input v-model.trim="row.inputValue" placeholder="Please input" v-if="row.inputVisible" @blur="onInputConfirm(row)" @keyup.enter="onInputConfirm(row)" @keyup.esc="row.inputValue=''"/>
<el-button type="success" size="small" v-else @click="row.inputVisible=true">+tag</el-button>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-table和el-table-column是Element UI库中的两个组件,用于展示表格数据。自定义指令可以用于对el-table和el-table-column进行扩展和定制。 对于el-table,可以使用自定义指令来实现一些特定的功能,比如自定义排序、拖拽列宽、固定表头等。通过自定义指令,可以在el-table上添加一些额外的行为或样式。 对于el-table-column,可以使用自定义指令来实现一些特定的列样式或行为。比如,可以通过自定义指令来实现某一列的特殊渲染、列宽自适应等功能。 下面是一个示例,展示如何使用自定义指令来扩展el-table和el-table-column: 1. 创建一个自定义指令: ```javascript Vue.directive('my-directive', { bind: function (el, binding, vnode) { // 在绑定时执行的逻辑 // 可以在这里修改el-table或el-table-column的行为或样式 }, inserted: function (el, binding, vnode) { // 在元素插入到DOM时执行的逻辑 }, update: function (el, binding, vnode, oldVnode) { // 在组件更新时执行的逻辑 }, componentUpdated: function (el, binding, vnode, oldVnode) { // 在组件更新完成后执行的逻辑 }, unbind: function (el, binding, vnode) { // 在解绑时执行的逻辑 } }); ``` 2. 在el-table或el-table-column上使用自定义指令: ```html <el-table v-my-directive> <!-- 表格内容 --> </el-table> <el-table-column v-my-directive> <!-- 列内容 --> </el-table-column> ``` 通过上述方式,你可以根据自己的需求来扩展和定制el-table和el-table-column的行为和样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值