详解vue如何给特殊字段设置插槽

 更新时间:2023年09月13日 10:50:15   作者:明思齐  
这篇文章主要为大家详细介绍了vue如何实现给特殊字段设置插槽,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以学习一下

大纲:

<template>
  <div>
    <div>
      <span>卡号</span>
      <el-input type="text" v-model="cardNo" clearable placeholder="请输入卡号" />
      <el-button type="primary" plain icon="el-icon-search" @click="search">搜索</el-button>
    </div>
    <!-- 表格 -->
    <el-table class="fontTextStyle" border :header-cell-style="{background:'#f0f9eb'}" :data="data" style="width: 100%">
      <el-table-column align="center" prop="staffName" label="姓名"></el-table-column>
      <el-table-column align="center" prop="deptName" label="部门"></el-table-column>
      <el-table-column align="center" prop="cardNo" label="卡号" :show-overflow-tooltip="true"></el-table-column>
      <el-table-column align="center" prop="termNo" label="设备号"></el-table-column>
      <el-table-column align="center" prop="datails" label="菜品">
        <template slot-scope="scope">
          <el-popover placement="top-start" trigger="click">
            <el-tag size="small" style="margin-right: 10px;" v-for="item in scope.row.details" :key="item.pid">
              {{ item.name }} X {{ item.qty }}份
            </el-tag>
            <el-button type="text" slot="reference"> {{scope.row.details.length}}个菜品</el-button>
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column align="center" prop="amt" label="消费金额"></el-table-column>
      <el-table-column align="center" prop="balance" label="余额"></el-table-column>
      <el-table-column align="center" prop="payTime" label="支付时间" :show-overflow-tooltip="true"></el-table-column>
    </el-table>
  </div>
</template>
<script>
  import API from '@/components/common/Api'
  export default {
    data() {
      return {
        //查询参数
        pn: 1,
        ps: 10,
        count: 0,
        data: [],
        form: {},
        cardNo: '',//搜索键值
        datails: '',
      }
    },
    mounted() {
      this.getList()
    },
    methods: {
      search() {
        this.getList();
      },
      //获取智盘支付记录列表
      getList() {
        let params = {
          cardNo: this.cardNo,
        }
        API.getPosPayLog(params).then(result => {
          if (result.data && result.data.code == 0) {
            this.data = result.data.data.list || [];
            //循环遍历菜品
            this.data.forEach(item => {
              item.details = JSON.parse(item.details)
            })
            this.count = result.data.data.total
          }
        });
      },
    },
  }
</script>
<style></style>

代码详解:

代码中使用了 Element UI 的组件,包括 el-input (输入框)、 el-button (按钮)、 el-table (表格)、 el-table-column (表格列)和 el-popover (气泡弹出框)等等。

第一步: 在页面初始化时,通过 mounted 钩子函数调用 getList 方法获取支付记录列表,并将结果保存在 data 数组中。当点击搜索按钮时,会触发 search 方法,该方法再次调用 getList 方法进行搜索。

第二步: getList 方法发送请求到后端接口,传递卡号作为参数。当接口返回数据后,将数据赋值给 data 数组,并使用 JSON.parse 将菜品详情从字符串解析为对象数组

第三步:通过循环遍历 data 数组中的每一项,将菜品详情 item.details 解析为对象数组,以便在表格中展示。

注意:具体的接口返回的数据类型可能会有所不同,可以根据实际需求进行调整。

类型:字符串json

<template>
  <div>
    <avue-crud ref="crud" v-model="form" :data="data" :option="option">
      <!-- 消费商品 -->
      <template slot-scope="scope" slot="payOrder">
        <el-popover trigger="click" title="" v-if="scope.row.payOrder.length">
          <div>
            <el-tag size="small" v-for="(item,index) in viewList" :key="index">
              {{ item.name }}X{{ item.num }}份
            </el-tag>
          </div>
          <el-button slot="reference" type="text" size="small" @click="getmenu(scope.row.payOrder)">
            {{ scope.row.payOrder.length }}个菜品
          </el-button>
        </el-popover>
        <div v-else>无</div>
      </template>
    </avue-crud>
  </div>
</template>
<script>
  import API from '@/components/common/Api';
  export default {
    data() {
      return {
        /* data:[]后端获取到的数据列表。option表格配置项.form 表单*/
        data: [],
        form: {},
        query: {}, //搜索键值
        viewList: [],
        option: {
          size: 'mini', //表格大小 medium/small/mini
          border: true,
          align: 'center',
          viewBtn: false, //查看详情按钮
          editBtn: false, //编辑修改按钮
          delBtn: false, //删除按钮
          addBtn: false,
          menu: false,
          column: [{
              label: '消费商品', //表头
              prop: 'payOrder', //键值
              slot: true,
            }]
        },
      }
    },
    mounted() {
      this.onLoad()
    },
    methods: {
      // 根据接口获取data数据
      onLoad() {
        let params = {
          data: this.query,
        }
        API.yktPosPayLogAll(params).then(res => {
          if (res.data.code == 0) {
            this.data = res.data.data.list;
            //循环遍历商品
            this.data.forEach(item => {
              item.payOrder = JSON.parse(item.payOrder);
            })
          }
        })
      },
      getmenu(arr) {
        this.viewList = arr;
      },
    }
  }
</script>
<style></style>
<template>
    <avue-crud :option="option" :data="data" v-model="form" ref="crud">
      <template slot-scope="scope" slot="posFoodReserveDetail">
        <el-popover trigger="click" title="菜单">
          <div>
            <el-tag size="small" v-for="item in viewList" :key="item.foodId">
              {{ item.foodName }}X{{ item.reserveNum }}份
            </el-tag>
          </div>
          <el-button slot="reference" type="text" size="small" @click="getmenu(scope.row.posFoodReserveDetail)">
            {{ scope.row.posFoodReserveDetail.length }}个菜品
          </el-button>
        </el-popover>
      </template>
    </avue-crud>
</template>
<script>
  import API from '@/components/common/newApi';
  export default {
    data() {
      return {
        data: [],
        form: {},
        query: {},
        option: {
          border: true,
          column: [{
              label: '预定内容',
              prop: 'posFoodReserveDetail',
              slot: true,
              overHidden: true,
            }]
        },
        viewList: []
      };
    },
    mounted() {
      this.onLoad();
    },
    methods: {
      // 加载表格数据
      onLoad() {
        let param = {
          data: this.query
        };
        API.selectMyReserve(param).then(res => {
          if (res.data.code === 0) {
            this.data = res.data.data.list;
          }
        });
      },
      getmenu(arr) {
        this.viewList = arr;
      },
    }
  };
</script>
<style></style>

代码详解:

在这个插槽中,我使用了 el-popover 组件来显示菜单信息,并通过点击按钮触发了 getmenu 方法。根据我这边的业务需求,我将在点击按钮时调用 getmenu 方法,并将传入的 scope.row.posFoodReserveDetail 赋值给 viewList。

类型:数组

以上就是详解vue如何给特殊字段设置插槽的详细内容,更多关于vue插槽的资料请关注脚本之家其它相关文章!

相关文章

  • vue3使用xgPalyer实现截图功能的方法详解

    vue3使用xgPalyer实现截图功能的方法详解

    这篇文章主要为大家详细介绍了如何在vue3中使用xgPalyer截图功能,以及自定义插件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Vue替代marquee标签超出宽度文字横向滚动效果

    Vue替代marquee标签超出宽度文字横向滚动效果

    这篇文章主要介绍了Vue替代marquee标签超出宽度文字横向滚动效果,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Vue.js实现一个todo-list的上移下移删除功能

    Vue.js实现一个todo-list的上移下移删除功能

    这篇文章主要介绍了Vue.js实现一个todo-list的上移下移删除功能,需要的朋友可以参考下
    2017-06-06
  • vue router点击打开新的标签页的方法(最新推荐)

    vue router点击打开新的标签页的方法(最新推荐)

    vue router点击打开新的标签页的方法,只需要在router-link中加入target="_blank"即可在新的页面打开标签,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • VUE3基础学习之click事件详解

    VUE3基础学习之click事件详解

    由于vue是一个双向数据绑定的框架,它的点击事件与以前常用的还是有很大的差别的,下面这篇文章主要给大家介绍了关于VUE3基础学习之click事件的相关资料,需要的朋友可以参考下
    2022-01-01
  • Vue 实时监听窗口变化 windowresize的两种方法

    Vue 实时监听窗口变化 windowresize的两种方法

    这篇文章主要介绍了Vue 实时监听窗口变化 windowresize的两种方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • 基于Vue + Axios实现全局Loading自动显示关闭效果

    基于Vue + Axios实现全局Loading自动显示关闭效果

    在vue项目中,我们通常会使用Axios来与后台进行数据交互,而当我们发起请求时,常常需要在页面上显示一个加载框(Loading),然后等数据返回后自动将其隐藏,本文介绍了基于Vue + Axios实现全局Loading自动显示关闭效果,需要的朋友可以参考下
    2024-03-03
  • 源码剖析Vue3中如何进行错误处理

    源码剖析Vue3中如何进行错误处理

    错误处理是框架设计的核心要素之一,框架的错误处理好坏,直接决定用户应用程序的健壮性以及用户开发应用时处理错误的心智负担,本文将从源码入手,剖析一下Vue3中是如何进行错误处理的,需要的可以参考下
    2024-01-01
  • Vue数据代理的实现流程逐步讲解

    Vue数据代理的实现流程逐步讲解

    通过一个对象代理对另一个对象中的属性的操作(读/写),就是数据代理。要搞懂Vue数据代理这个概念,那我们就要从Object.defineProperty()入手,Object.defineProperty()是Vue中比较底层的一个方法,在数据劫持,数据代理以及计算属性等地方都或多或少的用到了本函数
    2023-01-01
  • vuepress打包部署踩坑及解决

    vuepress打包部署踩坑及解决

    这篇文章主要介绍了vuepress打包部署踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论