element-ui 实记问题记录

主要是记录一些在使用Element-ui 组件时,耗费时间去解决的一些问题。

1. 表格渲染出现列项数据重叠,错位的现象

请添加图片描述

偶尔出现,没有报错,搞了好久,然后问了朋友说你设置一下row-key

<el-table
  :row-key="id" 
  ></el-table>

确实是解决了,没有再出现,但是有的表格我也没设置也没出现过。不知道是什么诱发导致的。

2. 实现el-select 的数据懒加载

通常会遇到某些下拉数据时某个模块的列表数据,会有很大的数据量,则需要实现分页懒加载选项数据。

之前也有写过 , 对于更详细的说明,请移步这里 vue 实现 el-select 下拉选项的懒加载

实现了自定义指令lazy-load , 这边给一个参考示例,用于某个模块数据的下拉选项数据懒加载

<template>
    <div class="lazy-select">
        <el-select :value="value"
            v-lazy-load="lazyOption"
            filterable
            remote
            :remote-method="handleSearchData"
            clearable
            @clear="handleSearchData"
            @change="handleSelectData">
            <el-option v-for="item in data" :key="item.id" :label="item.name" :value="item.id"></el-option>
        </el-select>
    </div>
</template>
<script>
  import { queryDataList } from '@/ajax'
  export default {
    name: 'select-group',
    data () {
      let $this = this
      return {
        data: [],
        pageOptions: {
          pageSize: 10,
          pageNo: 1,
          total: 0,
          totalPage: 99
        },
        lazyOption: {
          loadData: () => {
            $this.queryDataList(false, { pageNo: $this.pageOptions.pageNo + 1 })
            $this.pageOptions.pageNo++
          },
          distance: 20,
          scrollBody: '.el-scrollbar__wrap',
          fn: (fn) => {
            // 这里是在组件销毁前, 移除监听事件.
            $this.$once('hook:beforeDestroy', () => fn())
          }
        },
        initLoad: true,
        searchParams: {
          name: ''
        }
      }
    },
    model: {
      prop: 'value',
      event: 'change'
    },
    props: {
      value: {
        type: [String, Array],
        default: ''
      }
    },
    mounted () {
      // 初始请求数据
      this.queryDataList()
    },
    methods: {
      async queryDataList (reload = false) {
        const { pageNo, pageSize } = this.pageOptions
        const query = {
          pageNo: pageNo,
          pageSize: pageSize,
          ...this.searchParams
        }
        if (!reload && !this.initLoad && pageNo * pageSize >= this.pageOptions.total) {
          return
        }
        const res = await queryDataList(query)
        const { totalList, total } = res
        // this.data.push(...totalList)
        if (reload) {
          this.data = [...totalList]
        } else {
          this.data.push(...totalList)
        }
        this.pageOptions.total = total
        this.initLoad = false
      },
      /**
       * 远程搜索
       */
      handleSearchData (name) {
        //
        this.searchParams.name = name
        this.pageOptions.pageNo = 1
        this.queryDataList(true)
      },
      /**
       * 下拉选择值
       */
      handleSelectData (value) {
        this.$emit('change', value)
      }
    }
  }
</script>

在处理分页数据的时候,主要考虑了几个点:

  1. 初始加载后,后续触发的加载逻辑则需要合并之前的数据initLoad标识
  2. 不是第一次加载,则需要判定,触发滚动加载是不是已经加载完了pageNo * pageSize >= this.pageOptions.total;所以在滚动加载时,需要手动传递当前页码参数
  3. 另一个就是我们开启了搜索,则在搜索的时候,需要重新从第一页加载 this.pageOptions.pageNo = 1 获取的数据不做合并

3. 自定义el-form表单校验

这个之前也写过一篇文章 v-model自定义组件结合el-form做表单校验

使用【2】的实例,可以作为el-form的自定义组件。要需要配合做校验

// 事件emit
import emitter from 'element-ui/src/mixins/emitter'
export default {
    data () {},
    model: {
      prop: 'value',
      event: 'change'
    },
    mixins: [emitter],
    props: {
      value: {
        type: [String, Array],
        default: ''
      }
    },
    watch: {
      value (val) {
        // 转发当前组件值的数据传递给 el-form-item 
        // 当然你的 el-form-item 的prop设置正确
        this.dispatch('ElFormItem', 'el.form.change', [val])
      }
    },
}

4. el-table初始化渲染,同时默认选中行时,不生效

async queryTableFields () {
    const query = {
      tableId: this.tableId,
      roleCode: this.roleCode
    }
    const data = await queryDataTableFields(query)
    if (data && Array.isArray(data)) {
      this.tableOption.data = [].concat(data)
      // 默认选中项
      let checked = data.filter(item => item.right === 1)
      
      // 同步设置表格选中数据,不生效
      // this.$refs.table.toggleRowSelection(checkedData, true)
      
      // 此处需要延时处理默认的选中
      // 或者使用setTimout 也行
      this.$nextTick(() => {
        this.$refs.table.toggleRowSelection(checkedData, true)
      })
    }
},

起因就是已经拿到了当前列表选择的数据,然后在获取到列表数据后就行默认选中。

5. el-table 实现合并列、行

这个之前没做过,以为也就看个文档,几下就做出来了,高估了自己,花了三个小时才整明白。

列、行合并主要是通过span-method 方法来处理某一行、某一列的展示与否(仔细品这句话)

<el-table
  :span-method="tableSpanMethod"
  ></el-table>

先看一下该方法的传参

const tableSpanMethod = ({row, column, rowIndex, columnIndex}) => {
    // 给了行下标、列下标
    // 是不是就确定了当前cell单元格的位置
    // 通过返回值控制是不是要渲染这个单元格 [1,1] 渲染行、列,[0,1] 只渲染列,[0,0] 行列不渲染
}

知道主要的参数含义,来实际处理一下。注意参数是对象,解析的定义;

请添加图片描述

如上图,我们要合并第一、二行的第一列。可以简单的写一下如下代码

tableSpanMethod ({row, column, rowIndex, columnIndex}) {
      // 首先是第一行、第一列需要渲染,而且要合并两行
      if (rowIndex === 0 && columnIndex === 0) {
        return [2, 1]
      }
      // 第一行第一列已经合并,所以不需要在渲染第二行第一列
      if (rowIndex === 1 && columnIndex === 0) {
        return [1, 0]
      }
}

实现展示效果:

请添加图片描述

合并的关键在于找准你要合并行、列的规则。然后合并初始列、行进行合并,return [n, m] , 在后续的行、列中则需要处理n - 1时,返回return [0, 1] 控制行或者return [1, 0] 控制列

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容