问题

列表数据打标签
类似下面这种样子

image.png

思路

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

    实现

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

    业务数据的处理我封装在 mixins 里面 ```javascript // 存放全局的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 = 停售 } else { item.status = item.status } if (item.age <= 25) { item.age = {item.age} } if (item.sex === ‘Man’) { item.sex = {item.sex} } }) 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); } } } }

  1. <a name="oPbnH"></a>
  2. #### base.less 定义标签样式
  3. ```less
  4. .badge_info {
  5. color: #4760f0;
  6. background: #1C84C6;
  7. padding: 5px 8px;
  8. color: #fff;
  9. border-radius: 5px;
  10. }
  11. .badge_default {
  12. color: #4760f0;
  13. background: #4760f0;
  14. padding: 5px 8px;
  15. color: #fff;
  16. border-radius: 5px;
  17. }

2、封装列表渲染组件

  1. <template>
  2. <ul class="listV2">
  3. <li class="listV2_row-title">
  4. <span v-for="(col, index) in fieldList" :key="index" class="listV2_cell ellipsis" :name="col.fieldName">
  5. {{col.fieldLabel}}
  6. </span>
  7. </li>
  8. <!-- 行 -->
  9. <div v-if="tableData.length === 0" class="nodata">暂无数据</div>
  10. <li v-for="(row, index) in tableData" :key="index" class="listV2_row pointer" @click="rowClickToDetail(row)">
  11. <!-- 单元格-列 -->
  12. <span v-for="(col, index) in fieldList" :key="index" class="listV2_cell ellipsis" :name="col.fieldName">
  13. <RenderDom :vNode="row[col.fieldName] || '-'"></RenderDom>
  14. </span>
  15. </li>
  16. </ul>
  17. </template>
  18. <script>
  19. import RenderDom from "./renderDom";
  20. export default {
  21. name: 'TableList',
  22. props: {
  23. tableData: {
  24. type: Array,
  25. required: true,
  26. },
  27. fieldList: {
  28. type: Array,
  29. required: true,
  30. },
  31. align: {
  32. type: String,
  33. default: 'left',
  34. },
  35. },
  36. components: {
  37. RenderDom,
  38. },
  39. data() {
  40. return {}
  41. },
  42. computed: {},
  43. watch: {},
  44. created() { },
  45. mounted() { },
  46. methods: {},
  47. updated() { },
  48. beforeDestroy() { },
  49. }
  50. </script>
  51. <style lang='less' rel='stylesheet/less' scoped>
  52. @import "./index.less";
  53. </style>

3、封装渲染vNode的方法

  1. const renderDom = {
  2. props: {
  3. vNode: {
  4. type: [Array, String, Object,Number],
  5. },
  6. },
  7. render(h) {
  8. // jsx - vNode 直接返回,交给框架处理(js语法带来很多可能,列表打标签功能)
  9. if (typeof this.vNode === 'object') {
  10. return this.vNode;
  11. }
  12. // 普通数据,直接包一层div,然后返回给页面
  13. return h(
  14. 'div',
  15. {
  16. class: 'ellipsis',
  17. },
  18. this.vNode
  19. )
  20. }
  21. }

4、页面组件调用

  1. <template>
  2. <div class="customer">
  3. <table-list v-loading="p_loading" :tableData="p_listdata" :fieldList="fieldList"></table-list>
  4. </div>
  5. </template>
  6. <script>
  7. import TableList from '@/basecomponents/TableList/index'
  8. import $_pMixins from "@/mixins/product.js";
  9. import enums from './enum.js'
  10. export default {
  11. name: 'Customer',
  12. props: {},
  13. components: {
  14. 'table-list': TableList,
  15. },
  16. mixins: [$_pMixins],
  17. data() {
  18. return {
  19. tableData: [],
  20. fieldList: Object.freeze(enums.Enum_customerFieldList),
  21. }
  22. },
  23. computed: {},
  24. watch: {},
  25. created() {
  26. },
  27. mounted() {
  28. this.initData()
  29. },
  30. methods: {
  31. initData() {
  32. this.getProductList()
  33. }
  34. },
  35. updated() { },
  36. beforeDestroy() { },
  37. }
  38. </script>
  39. <style lang='less' rel='stylesheet/less' scoped>
  40. @import "./index.less";
  41. </style>

效果展示

image.png