【踩坑记】ElementUI 常用组件tab/table/pagination等避坑注意事项!

145 阅读2分钟

1.el-autocomplete组件

注意:如果输入框进行了输入限制,但queryString的值还是限制前的值,所以进行联想查询时,用联想组件双向绑定的字段,才会所见即所得,否则联想结果将有可能不正确。

 querySearch(queryString, cb) {
     // 在输入框有输入限制时,用v-model绑定的字段,而非queryString
     if(this.formData.name) {
         // 请求接口获取数据
     }
}

2.el-tabs组件

注意1:即使没进行for循环,如果tab是根据场景动态渲染的,也需要加上key属性,防止报错和产生渲染问题,写法如下:

 <el-tabs v-model="activeName">
     <el-tab-pane key="1"></el-tab-pane>
     <el-tab-pane key="2"></el-tab-pane>
     <el-tab-pane v-if="flag === 3" key="3"></el-tab-pane>
 </el-tabs>       

如果不加上key,则会产生如下报错或渲染问题。

Vue warn: Duplicate keys detected:“tab-XXX“. This may cause an update error.

1.png

注意2: el-tabs显示时有时会出现蓝框,解决如下:

/deep/.el-tabs__item:focus.is-active.is-focus {
    box-shadow: none;
  }

3.el-table组件

注意:当table有复选框时,row-key属性必须绑定列表数据的唯一key,否则,在翻页时,会把上一页的选中状态带到下一页,如下:

2.png

4.el-pagination组件

注意:当用户输入搜索条件或改变搜索条件但未触发搜索,转而直接切换页码到m时,带入搜索条件及当前点击的页码m请求接口,若当前页码m超过接口数据返回的最大页数n,则el-pagination组件自动改变页码,跳到n。

但此时因接口传参的是页码m,该页码下无数据的,就会造成如下图问题:172页实际是有数据的,但是页面显示的是无数据。

3.png

针对此问题,有两种处理方式:

1)仍然带入搜索条件及当前点击的页码m请求接口,但加入如下逻辑:

即先判断当前点击的页码m是否大于接口返回数据的页码n,若大于,则将页码传参改为接口返回数据的页码n,然后递归调用loadData函数。

 loadData() {
     // ...
    // 关键代码
    const m = that.ipagination.current
    const n =  res.data.pages
    if(m > n) {
        this.ipagination.current = res.data.pages
        this.loadData()
     } else {
        this.dataSource = res.data.records
        this.ipagination.total = res.data.total
        this.loading = false
     }
 }

弊端:当m>n时,需要多请求一次接口。

2)因用户未触发搜索,所以不带搜索条件,只带当前点击的页码m请求接口。

弊端:用户可能不记得自己未触发搜索,所以可能会觉得接口返回的数据没有带入搜索条件从而觉得系统有bug。

如果有更好的处理方式,欢迎大家评论区补充。