element 官方文档vue
基于 vue2.0 的 element-ui 框架,使用起来仍是很方便的,很是适合快速开发,可是在作本身的项目中仍是会碰到这样那样的问题,有些问题官方文档并非很详尽,如下是我在使用 element-ui 过程当中一些经常使用的或碰到的一些问题笔记。git
<template> <div> <el-date-picker size="small" clearable type="daterange" v-model="dateRange" :picker-options="pickerOptions" value-format="yyyy-MM-dd" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker> </div> </template> <script> export default { data () { return { pickerOptions: { disabledDate (time) { return time.getTime() > Date.now() } }, dateRange: [] } } } </script>
项目中碰到的需求:type 为 daterange 的日期选择器所绑定的值 date 是一个数组,可是后端接收的参数开始日期和结束日期是分开的,回显时返回的数据也是分开的github
建立 arrayUtil.js 文件element-ui
// arrayUtil.js /** * @description 安全的获取数组对应下标数据 * @param { Array } arr * @param { int } index */ export const saveGet = (arr, index) => { if( arr & Array.isArray(arr)) { return arr[index]; } else { return undefined; } }
在 .vue 文件中引入并调用后端
// .vue 文件 import { saveGet } from './utils/arrayUtil'; <el-date-picker type="daterange" v-model="date" style="width: 100%;" format="yyyy-mm-dd" start-placeholder="开始日期" end-placeholder="结束日期" /> export default { data() { return { date: [] // 日期范围 } }, // 计算获得传递给后端的参数(拆分日期范围数组) computed: { queryParams() { return { fromDate: saveGet(this.form.date, 0), toDate: saveGet(this.form,date, 1), ... ... }; } }, }
回显的时候,后端返回的 fromDate 和 toDate 再拼成数组就能够了。数组
<el-select placeholder="请选择" style="width:100%" filterable v-model="info" clearable > <el-option v-for="item in infoList" :key="info.id" :label="`name: ${item.name} - idNo: ${item.idNo}`" :value="item.id"> <span style="float: left">{{ item.tableName }}</span> <span style="float: right; color: #8492a6; font-size: 13px">{{ item.level }}</span> </el-option> </el-select>
上述 v-model="info" 是从后端返回的选择用户 id,infoList 为全部用户的信息,label 拼接了 用户姓名 - 用户idNo,回显时要匹配过滤下而后再拼接显示就好了。显示以下:安全
// 方法一 <el-table-column label="序号" type="index" width="50" align="center"> <template v-slot="{ $index }"> <span>{{ $index + pageSize * ( currentPage - 1 ) + 1 }}</span> </template> </el-table-column> // $index 当前序号 pageSize 每页显示的条数 currentPage 当前页码
// 方法二 <el-table-column label="序号" type="index" width="50" align="center" :index="tableIndex"/> // 文档中index的类型能够是Function(index),这里绑定一个方法,将返回值赋给index, 即该行的索引 ... methods: { tableIndex(index) { return index + this.pageSize * ( this.currentPage - 1 ) + 1 } }
项目中的需求:后端返回的接口数据是从第0页开始的,el-pagination 中当前页数默认是从1开始的,也就是点击el-pagination的第1页传递给后端的页数是0,点击第2页传递1,点击第3页传递2 ... ...框架
<el-pagination background :current-page="currentPage" :page-size="pageSize" /> export default{ data() { return { currentPage: 1, // 当前页数 pageSize: 10, // 每页显示条目个数 } }, computed: { queryParams () { return { page: this.currentPage - 1, size: this.pageSize } } } } // 调用接口的时候把queryParams传递过去就能够了
在项目中按需引入element-ui的时候,使用 el-table 的v-loading 报错,以下:ui
github 上也有相关 issues,点这里查看this
解决方法很简单,在 main.js 中将 loading 引入 use 一下就行了,我是将 element 按需引入的组件单独抽离出来了,以下图
项目需求以下图:
而后要将选中数据 id 传递给后端 。具体代码以下:
<el-table> <el-table-column label="选择"> <template slot-scope="scope"> <el-radio v-model="radioStatus" :label="scope.$index" @change.native="getRowSelected(scope.$index, scope.row)" > </el-radio> </template> </el-table-column> ... ... </el-table> export defalut { data() { return { radioStatus: false, // 是否被选中,默认都是 false selectedId: '' //选中数据的id } }, methods: { // 获取选中数据 getRowSelected(index, row) { this.selectedId = row.id } } }
注意:radio 的 label 必定要设为不一样的值,不然点击一个 radio 会选中所有。若是不要显示 label,经过样式控制其隐藏就能够了。
表格中某一列的数值根据不一样等级展现不一样的背景色。具体需求以下:
经过table的cell-style属性,能够设置一个固定的 Object 或 Function({row, column, rowIndex, columnIndex}),这里用了回调的方法。实现代码以下:
<el-table :data="tableData" style="width: 100%" border :cell-stlye="set_cell_style"> <el-table-column label="选择"> ... ... </el-table-column> </el-table> ... ... methods: { set_cell_style({row, column, rowIndex, columnIndex}) { if(row.errorNum > 20 && column.label === '检测错误数') { return { // 返回对象 background: '#F56C6C', color: 'white' } } else if(row.errorNum > 10 && column.label === '检测错误数') { return { background: '#E6A23C', color: 'white' } } else if(row.errorNum > 0 && column.label === '检测错误数') { return 'background: #67C23A; color: white' // 返回字符串 } } } // row 行数据对象 column 列对象 // 上述 column.label === '检测错误数' 等价于 columnIndex === 4 // 用label主要是以避免表格展现顺序更换,columnIndex也得相应的更改
注意:使用 function 时 return 的返回值若是是 string 类型,在开发环境是能够生效的,可是打包上线后失效。因此若是使用 function,要返回 object 类型。
二次封装 el-dialog 时,关闭 dialog 出现以下错误
具体代码以下:
// 父组件 <el-button type="primary" size="mini" @click="dialogVisible=true">新 增</el-button> <com-dialog :dialogVisible.sync="dialogVisible" @closeDialog="closeDialog"></com-dialog> // 子组件 <template> <el-dialog title="新增" :visible.sync="dialogVisible" @close="closeDialog"> </template> <script> export default { props: { dialogVisible: { type: Boolean, default: false } }, methods:{ //关闭Dialog closeDialog(){ this.$emit('update:closeDialog', false); } }, }; </script>
出现错误的缘由是:子组件的关闭事件和父组件的关闭事件相冲突了,子组件的 props 属性要由父组件来控制,不能直接修改 visible 的值。此处的 sync 修饰符至关于 el-dialog 直接修改了父组件的值。因此把父组件和子组件的 .sync 去掉就能够了。
还有一种方法就是将 close 方法改为 before-close,具体代码以下:
// 父组件 <el-button type="primary" size="mini" @click="dialogVisible=true">新 增</el-button> <com-dialog :dialogVisible.sync="dialogVisible" @closeDialog="closeDialog"></com-dialog> // 子组件 <template> <el-dialog title="新增" :visible.sync="dialogVisible" :before-close="closeDialog"> </template> <script> export default { props: { dialogVisible: { type: Boolean, default: false } }, methods:{ //关闭Dialog closeDialog(){ this.$emit('closeDialog', false); } }, }; </script>
以上,还会继续更新哒 :) ~~