vue3+ts二次封装element plus的el-table时使用row-class-name无法生效,或奇数行生效、偶数行不生效

先贴一张成品图

根据状态显示行颜色

一开始想看看怎么封装这个属性(未解决)

参考了:(实测用不了!!!)

二次封装组件调用row-class-name方法
二次封装el-table,调用row-class-name方法
都是把属性封装到方法了

看了下官方文档确实是可以传入一个方法
官方描述
我就试着写了下
table.vue

// 多余的代码删掉了
// script setup lang="ts"
const emit = defineEmits([
  'rowClassName'
])
function rowClassName({ row, rowIndex }: {row: any, rowIndex: number}) {
  let data = ''
  emit('rowClassName', { row: row, rowIndex: rowIndex }, (val: string) => { data = val })
  return data
}
// template
<ElTable
  ref="$table"
  v-bind="defaultAttr"
  :data="tableData"
  :row-class-name="tableRowClassName"
/>

引用的文件
index.vue

// 多余的代码删掉了
// script setup lang="ts"
const tableRowClassName = (obj, callback) => {
  if (obj.row.deviceState === 0) {
  console.log(obj.row.deviceState)
    callback('warning-row')
    // return 'danger-row'
  }
  else if (obj.row.deviceState === 1) {
    callback('success-row')
    // return 'danger-row'
  }
  else {
    callback('')
    // return 'success-row'
  }
}
// template
<base-table
  ref="$table"
  :api="getListApi"
  @row-class-name="tableRowClassName"
>
  <base-table-column prop="deviceName" label="名称" />
  <base-table-column prop="deviceNo" label="编号" />
  <base-table-column
    prop="deviceState"
    label="状态"
    :formatter="formatterState"
  />
  <base-table-column label="操作">
    <template #default="{ row }">
      <el-link @click="handleView(row)">
        查看
      </el-link>
    </template>
  </base-table-column>
</base-table>
// style
.el-table .warning-row {
  --el-table-tr-bg-color: var(--el-color-warning-light-9) !important;
}
.el-table .success-row {
  --el-table-tr-bg-color: var(--el-color-success-light-9) !important;
}

但是,这两个封装返回都是callback,结果就是一行有颜色然后后面都没有颜色了。
下两张图是上面链接里的👇
这个是callback
这个也是callback

官方文档是这样
官方文档是return
官方function是return一个string。被封装后属性变成了事件,我就在寻找事件可以get到返回值的方法找了好久……(根本没有!因为本身el-table的rowClassName是一个属性,需要用冒号写法才能获取值,用@写法返回的值无法赋值到属性上,因为那是一个事件啊)

但是我还是把代码贴到这里,有没有大佬看看这种写法能不能获取值啊

function rowClassName({ row, rowIndex }: { row: any; rowIndex: number }) {
  // let data = ''
  return emit('rowClassName', { row, rowIndex })
  // return data
}
// 引用的文件里直接用官方写的方法,然后 @row-class-name="tableRowClassName"

解决:后面我决定把属性穿透,直接引用官方的

prop定义的时候引入ElTableProps
直接使用官方写法。

然后问题来了,偶数行不生效,奇数行好的。(改了下样式解决了)

// 多余的代码删掉了
// script setup lang="ts"
const items = [
  { deviceName: '测试1', deviceNo: '0', deviceState: 0 },
  { deviceName: '测试2', deviceNo: '1', deviceState: 1 },
  { deviceName: '测试3', deviceNo: '2', deviceState: 2 },
]
const tableRowClassName = ({
  row,
  rowIndex,
}: {
  row: any
  rowIndex: number
}) => {
  if (row.deviceState === 0) {
    return 'warning-row'
  }
  else if (row.deviceState === 1) {
    return 'success-row'
  }
  else if (row.deviceState === 2) {
    return 'error-row'
  }
  return ''
}
// template
<base-table
  ref="$table"
  :api="getListApi"
  :row-class-name="tableRowClassName"
>
  <base-table-column prop="deviceName" label="名称" />
  <base-table-column prop="deviceNo" label="编号" />
  <base-table-column
    prop="deviceState"
    label="状态"
    :formatter="formatterState"
  />
  <base-table-column label="操作">
    <template #default="{ row }">
      <el-link @click="handleView(row)">
        查看
      </el-link>
    </template>
  </base-table-column>
</base-table>
<style>
.el-table .warning-row {
  --el-table-tr-bg-color: var(--el-color-warning-light-9);
}
.el-table .success-row {
  --el-table-tr-bg-color: var(--el-color-success-light-9);
}
.el-table .error-row {
  --el-table-tr-bg-color: var(--el-color-error-light-9);
}
.vp-doc tr:nth-child(2n) {
  background-color: var(--el-table-tr-bg-color);
}
</style>

重点是这个,我从控制台找出来的需要覆盖的样式

.vp-doc tr:nth-child(2n) {
  background-color: var(--el-table-tr-bg-color);
}

百度了好多说什么斑马纹stripe要删除,style不能使用scope属性,这些我都没用,还是样式问题。
导致不生效的样式
圈出来的是原来导致我偶数行不生效的样式,我写了代码覆盖掉就好了。

其他的评论区讨论

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为你提供一个基本的ElDialog封装,供你参考: ```vue <template> <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" :close-on-click-modal="false" :custom-class="customClass" :width="width" :lock-scroll="lockScroll" :modal-append-to-body="modalAppendToBody" :destroy-on-close="destroyOnClose" :center="center" @opened="handleOpen" @closed="handleClosed" v-bind="$attrs" v-on="$listeners" > <slot></slot> </el-dialog> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElDialog } from 'element-plus'; export default defineComponent({ name: 'MyDialog', props: { title: { type: String, default: '', }, dialogVisible: { type: Boolean, default: false, }, customClass: { type: String, default: '', }, width: { type: String, default: '50%', }, lockScroll: { type: Boolean, default: true, }, modalAppendToBody: { type: Boolean, default: true, }, destroyOnClose: { type: Boolean, default: false, }, center: { type: Boolean, default: true, }, }, emits: ['update:dialogVisible', 'opened', 'closed'], methods: { handleClose(done: () => void) { // 自定义关闭操作 done(); }, handleOpen() { this.$emit('opened'); }, handleClosed() { this.$emit('closed'); }, }, components: { ElDialog, }, }); </script> ``` 这里我们使用Vue3的Composition API,使用`defineComponent`定义了一个组件,并引入了Element Plus的ElDialog组件。 我们将ElDialog组件的属性和事件通过props和emits暴露出来,并在组件内部进了一些自定义操作,如自定义关闭操作和自定义事件触发。 你可以根据自己的需求对组件进进一步封装和定制化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值