美文网首页
通过vNode实现给列表字段打标签

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

作者: 甜点cc | 来源:发表于2022-09-23 10:49 被阅读0次

问题

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

思路

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

实现

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>

效果展示


我是 甜点cc

热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。主要致力于分享实用技术干货,希望可以给一小部分人一些微小帮助。

我排斥“新人迷茫,老人看戏”的现象,希望能和大家一起努力破局。营造一个良好的技术氛围,为了个人、为了我国的数字化转型、互联网物联网技术、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

相关文章

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

    问题 如何给列表数据打标签?类似下面这种样子? 思路 数模转化(对接口请求回来的数据进行过滤标记,返回新的数据) ...

  • 帝国CMS首页 封面页 列表页调用当前栏目自定义字段

    帝国CMS首页、封面页、列表页是无法调用栏目自定义字段,今天给大家带来灵动标签调用当前栏目自定义字段标签 SQL调...

  • dedecms用array调用多个自定义字段并判断

    首页、列表页增加多字段判断用[field:array runphp='yes']标签,这个标签可以获取任意字段的值...

  • 表单字段排序的实现

    在table的 加上 标签实现根据字段的排序,给 标签url一个参数 o ,在视图中调用排序方法根据参数o得到字段...

  • 2-9. 定义列表

    1、作用 给一堆数据添加列表语义 先通过dt标签定义列表中的所有标题, 然后再通过dd标签给每个标题添加描述信息 ...

  • 认识html---定义列表的练习

    回顾一下定义列表的的作用: 1.给一堆数据添加列表语义。 2.先通过dt标签定义列表中所有标题,然后再通过dd标签...

  • HTML基础知识点-表单

    Form标签中,以下标签实现表单元素的添加 标签描述 表单输入标签 菜单和列表标签 菜单和列表项目标签 文字域标签...

  • MySQL查询某个字段包含某个值--FIND_IN_SET

    情景: 文章中有标签字段(label),存的是标签ID字符串。 现在想在文章列表进行筛选,根据标签筛选出对应标签的...

  • checklist

    打标签: 1、给互联网企业打一二三级行业标签 2、给企业打目标用户标签 3、给供需打内容标签 4、给供需打用户群体...

  • 如何在python3下使用TextGrocery

    TextGrocery是一款高效的短文本分类工具,后期我们会通过该工具训练文本规则实现给作品内容自动打标签; 该项...

网友评论

      本文标题:通过vNode实现给列表字段打标签

      本文链接:https://www.haomeiwen.com/subject/qbqnortx.html