ElementUI(Vue 2.x) 奇葩问题及解决方法

462 阅读1分钟

一、Switch 无法正常更新的问题

开发中,switch 的 v-model 需要绑定深层次的属性 inherit

const obj = [{
  name: 'xxx',
  children: [{
    inherit: false
  }] 
}]

问题:常规的写法并不会根据 switch 的动作实时更新开关状态(点击开关没反应,必须刷新才有效果)

<el-switch
  v-model="row.inherit"
</el-switch>

解决方法:需要使用 vue 中自带的 $set 函数来辅助更新数据

<el-switch
  v-model="row.inherit"
  @change="controlSwitch($event, row)">
  <!-- $event 传递的是更改的值 -->
</el-switch><script>
  export default {
    methods: {
      controlSwith(val, row) {
        // this.$set(target, key, value)
        this.$set(row, row.inherit, val)
      }
    }
  }
</script>

二、使用嵌套 Dialog 或者连续使用 Dialog 并嵌套 Select 时,Select 层级过低问题

<!-- 为每个 select 都设置以下属性 -->
<el-select :popper-append-to-body="false" popper-class="select-popper">
/* 解决 dialog 嵌套 select 显示层级不正常问题 */
.el-select /deep/ .select-popper {
  z-index: 8888 !important;
  top: auto !important;
  left: auto !important
}

三、el-table 仅修改一行更新 tableData 但无法更新 DOM?

<el-table
  :tableData="tableData"
  :key="refreshFlag">
</el-table>
​
<script>
data () {
  return {
    refreshFlag: false,
  }
},  
watch: {
  tableData: {
    handler (val) {
      if (val) {
        this.refreshFlag = !this.refreshFlag
      }
    },
    deep: true
  }
}
</script>

四、El-checkbox 点击两次才切换,或者点击根本不切换

使用 :value 而非 v-model

五、上传/下载文件(Excel 为例)

<el-upload
  drag
  action=""
  :show-file-list="false"
  :before-upload="isExcel"
  :http-request="importExcel">
</el-upload>
<el-button type="primary" icon="el-icon-download" @click="export2Excel(true)">下载模板</el-button>
// 判断是否是 Excel 文件(.xlsx 后缀)
isExcel (file) {
  if (file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
    this.excelFile = file
    return true
  } else {
    errorMsg('请上传 .xlsx 后缀的 excel 文档')
    return false
  }
},
    
/**
  * 导入 Excel
  * 1、请求头:multipart/form-data
  * 2、格式正确响应:response.data.type === 'application/json'
  * 3、格式错误响应:response.data.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  * 4、上传成功后需要等待几秒后再刷新
  */
async importExcel (event) {
  const formData = new FormData()
  formData.append('excelFile', event.file)
  await $http.post('api地址', formData, {
    headers: {
      'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryVCFSAonTuDbVCoAN'
    },
    responseType: 'blob'
  }).then(
    response => {
      if (response.data.type !== 'application/json') {
        warningMsg('上传失败啦!请接收失败原因')
        saveAs(
          new Blob([response.data],
            { type: 'application/octet-stream' }),
          'Excel 文件上传失败原因.xlsx'
        )
      } else {
        successMsg('上传成功!正在处理,请稍后刷新查看')
      }
    })
},
    
/**
  * 导出成员列表为 Excel
  * 1、响应类型:blob
  * 2、使用插件 { savaAs } = file-saver 解析 blob
  */
async export2Excel (template = false) {
  await $http.get('api地址', {
    responseType: 'blob'
  }).then(
    response => {
      saveAs(
        new Blob([response.data],
          { type: 'application/octet-stream' }),
        '下载文件名.xlsx'
      )
    },
    reject => {
      errorMsg(`导出 Excel 异常:${reject.message ?? '未知错误'}`)
    })
},