通过vNode实现给列表字段打标签

简介: 通过vNode实现给列表字段打标签

问题


如何给列表数据打标签?类似下面这种样子👇

image.png


思路


  1. 数模转换(对接口请求回来的数据进行过滤标记,返回新的数据)


  1. 渲染新的数据模型


实现


1、过滤数据,需要打标签的采用jsx写法


业务数据的处理我封装在 mixins 里面


// 存放全局的mixin, 可拆分到模块独享
import { mapGetters } from 'vuex'
import { fetchListData } from '@/api/global/api.js'
export default {
  data() {
    return {
      p_category: [],
      listdata: [],
      p_total: 0,
      p_loading: false,
    }
  },
  computed: {
    // ...mapGetters(['productLevel', 'productLevelInfo']),
    p_listdata() {
      const data = this.listdata;
      data.forEach((item) => {
        // ...
        // jsx 方式,打标签
        if (item.status === 2 || item.status === 3) {
          item.status = <span style={{color: '#999'}}>停售</span>
        } else {
          item.status = item.status
        }
        if (item.age <= 25) {
          item.age = <span class="badge_info">{item.age}</span>
        }
        if (item.sex === 'Man') {
          item.sex = <span class="badge_default">{item.sex}</span>
        }
      })
      return data;
    }
  },
  methods: {
    async getProductList(params = {}) {
      try {
        this.p_loading = true
        this.listdata = []
        const res = await fetchListData(params)
        if (res.code === 0) {
          const { data = [], total = 0 } = res || {}
          if (Array.isArray(data)) {
            this.listdata = [...data]
            this.p_total = total
          } else {
            this.listdata = []
            this.p_total = 0
          }
        } else {
          this.listdata = []
          this.p_total = 0
          this.$message.error(res.message || '出错了')
        }
        this.p_loading = false;
      } catch (err) {
        this.p_loading = false
        this.listdata = []
        this.p_total = 0
        console.log(err);
      }
    }
  }
}


base.less 定义标签样式


.badge_info {
  color: #4760f0;
  background: #1C84C6;
  padding: 5px 8px;
  color: #fff;
  border-radius: 5px;
}
.badge_default {
  color: #4760f0;
  background: #4760f0;
  padding: 5px 8px;
  color: #fff;
  border-radius: 5px;
}


2、封装列表渲染组件


<template>
  <ul class="listV2">
    <li class="listV2_row-title">
      <span v-for="(col, index) in fieldList" :key="index" class="listV2_cell ellipsis" :name="col.fieldName">
        {{col.fieldLabel}}
      </span>
    </li>
    <!-- 行 -->
    <div v-if="tableData.length === 0" class="nodata">暂无数据</div>
    <li v-for="(row, index) in tableData" :key="index" class="listV2_row pointer" @click="rowClickToDetail(row)">
      <!-- 单元格-列 -->
      <span v-for="(col, index) in fieldList" :key="index" class="listV2_cell ellipsis" :name="col.fieldName">
        <RenderDom :vNode="row[col.fieldName] || '-'"></RenderDom>
      </span>
    </li>
  </ul>
</template>
<script>
  import RenderDom from "./renderDom";
  export default {
    name: 'TableList',
    props: {
      tableData: {
        type: Array,
        required: true,
      },
      fieldList: {
        type: Array,
        required: true,
      },
      align: {
        type: String,
        default: 'left',
      },
    },
    components: {
      RenderDom,
    },
    data() {
      return {}
    },
    computed: {},
    watch: {},
    created() { },
    mounted() { },
    methods: {},
    updated() { },
    beforeDestroy() { },
  }
</script>
<style lang='less' rel='stylesheet/less' scoped>
  @import "./index.less";
</style>


3、封装渲染vNode的方法


const renderDom = {
  props: {
    vNode: {
      type: [Array, String, Object,Number],
    },
  },
  render(h) {
    // jsx - vNode 直接返回,交给框架处理(js语法带来很多可能,列表打标签功能)
    if (typeof this.vNode === 'object') {
      return this.vNode;
    }
    // 普通数据,直接包一层div,然后返回给页面
    return h(
      'div',
      {
        class: 'ellipsis',
      },
      this.vNode
    )
  }
}


4、页面组件调用


<template>
  <div class="customer">
    <table-list v-loading="p_loading" :tableData="p_listdata" :fieldList="fieldList"></table-list>
  </div>
</template>
<script>
  import TableList from '@/basecomponents/TableList/index'
  import $_pMixins from "@/mixins/product.js";
  import enums from './enum.js'
  export default {
    name: 'Customer',
    props: {},
    components: {
      'table-list': TableList,
    },
    mixins: [$_pMixins],
    data() {
      return {
        tableData: [],
        fieldList: Object.freeze(enums.Enum_customerFieldList),
      }
    },
    computed: {},
    watch: {},
    created() {
    },
    mounted() {
      this.initData()
    },
    methods: {
      initData() {
        this.getProductList()
      }
    },
    updated() { },
    beforeDestroy() { },
  }
</script>
<style lang='less' rel='stylesheet/less' scoped>
  @import "./index.less";
</style>


效果展示


image.png

目录
相关文章
|
JSON 前端开发 JavaScript
Docusaurus框架——快速搭建markdown文档站点介绍sora
Docusaurus框架——快速搭建markdown文档站点介绍sora
532 0
|
JavaScript 测试技术 C#
【C#】【xUnit】【Moq】.NET单元测试Mock框架Moq初探!
在TDD开发模型中,经常是在编码的同时进行单元测试的编写,由于现代软件开发不可能是一个人完成的工作,所以在定义好接口的时候我们就可以进行自己功能的开发(接口不能经常变更),而我们调用他人的功能时只需要使用接口即可。
5650 0
|
8月前
|
消息中间件 数据采集 人工智能
体育直播网站如何实现实时数据
体育直播中的实时数据如何快速、准确地传递到用户手机上?本文揭秘了这一过程:数据来源包括官方合作伙伴和AI+人工双保险;传输借助WebSocket、MQTT协议及CDN加速;高并发通过Redis缓存、消息队列与自动扩容解决。未来,AI+5G将推动实时数据向更低延迟发展,甚至实现赛事预测。代码示例展示了比赛数据处理逻辑,确保用户获得精准信息。
481 33
|
9月前
|
云安全 安全 API
“安全体检”测评:安全自动化背后的隐忧与突破
本文围绕阿里云安全检查服务展开,从技术深度、场景适配和安全边界三个维度分析其价值与短板。该服务定位为自动化风险治理工具,涵盖漏洞扫描、合规基线和配置修复。体验中发现,其优势在于云原生体系耦合、资源拓扑感知及成本效益;不足则体现在量化指标缺失和攻击面覆盖有限。改进建议包括优化风险排序、引入AI分析及提供场景化助手。文章总结,该产品在基础风险治理和合规提效上表现良好,但需强化自动化修复与业务场景适配能力,以实现从工具到平台的跃迁。
389 65
|
缓存 安全 数据挖掘
阿里云服务器目前活动中各实例规格适用场景汇总,选择指南参考
本文将基于2025年阿里云服务器相关活动的最新内容,对各个实例规格的适用场景进行详细汇总,并提供选择指南参考,帮助用户轻松选购到最适合自己的云服务器实例。
|
安全 Linux iOS开发
ONLYOFFICE 桌面编辑器8.1---一个高效且强大的办公软件
ONLYOFFICE 桌面编辑器8.1---一个高效且强大的办公软件
304 2
|
机器学习/深度学习 运维 算法
利用机器学习进行异常检测的技术实践
【5月更文挑战第16天】本文探讨了利用机器学习进行异常检测的技术实践,强调了在大数据时代异常检测的重要性。机器学习通过无监督、有监督和半监督学习方法自动识别异常,常见算法包括KNN、LOF、K-means和GMM等。异常检测流程包括数据准备、特征工程、选择算法、训练模型、评估优化及部署。机器学习为异常检测提供了灵活性和准确性,但需结合具体问题选择合适方法。
|
机器学习/深度学习 搜索推荐 算法
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
登录注册 热门图书 图书分类 图书推荐 借阅图书 购物图书 个人中心 可视化大屏 后台管理
13468 2
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
|
存储 SQL 数据可视化
不惜血本、重金打造的数据平台为何效果平平?
较大规模的企业一般会选择自建数据平台,但从现状来看也并不是非常理想,很多互联网大厂不惜血本、投入重金打造数据化体系,成效却不显著,虽然看似功能强大,但流于表面,关键时候并不抗打。我们总能看到一些大厂朋友吐槽公司的数据基建平台接入成本太高,使用不太方便,有很多数据需求阻塞而难以快速实现,依然普遍存在一再被拖延的情况,究其原因在于企业对于数据需求的并行承载能力太差。而从企业层面来看研发数据基建的资源投入可谓非常巨大,而且后期维护成本也极为可观,如此庞大的投入,收益却并不显著,或者说与预期存在明显的差距,这甚至在一定程度上动摇了大厂对于基建价值的认同感和产生对数据化运营理念的怀疑态度。
417 21
|
运维 数据管理 数据库
数据管理DMS产品使用合集之如何实现跨库的数据同步
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
277 0