使用Ant-design-vue处理嵌套子表格中有关展开额外行的图标问题

 关于我最近被Ant-design-vue的各种属性搞疯了这件事

一. 如果是想保留+号,只是想单纯的换个位置,比如说换到和某某列并一起的话

<a-table
   // 其他属性已省略
   :expandIconColumnIndex="3"
>

使用 expandIconColumnIndex 来修改即可,比如说要插在第 3 列就设成 3 就好了,可能第 3 列还有其他的数据比如说88,就会变成:+ 88  ,逻辑还是正常的自己调好就行了

此时适用于你想把 + 号放在操作的那一列中

 

二. 如果是想保留+号,想给上面空空的地方加个列标题的话

<a-table :columns="columns" :data-source="data" :scroll="{ x: 2000 }" :expand-column-width="100">
  <template #bodyCell="{ column }">
    <template v-if="column.key === 'action'">
      <a>Delete</a>
    </template>
  </template>
  <template #expandedRowRender="{ record }">
    <p style="margin: 0">
      {{ record.description }}
    </p>
  </template>
  
  /// 看这里,加这个!!!
  <template #expandColumnTitle>
    <span style="color: red">More</span>
  </template>
  ///
</a-table>

加代码中提到的那部分即可,还可以自由更改字体的样式

三. 如果是不想保留+号,改为其他的图标类型的话,或者是改为:V 展开/收起的话

没错,就是我遇到的问题,还是如往常一样找了很多文章,发现他们都出奇的一致使用

methods : {
    customExpandIcon(props){
        console.log(props)
        if (props.expanded) {
           return <a style={{ color: 'black',marginRight:8 }} onClick={e => {
               props.onExpand(props.record, e);
        }}><a-button type="link">关闭详情</a-button></a>
        } else {
           return <a style={{ color: 'black' ,marginRight:8 }} onClick={e => {
               props.onExpand(props.record, e);
           }}><a-button type="link">查看详情</a-button></a>
        }
    }
}

我的vue3+ts+vite不支持我这么做,但是偏偏网上全是这种,没有办法,只能换种思路了(可恶)

先附个样式图

首先先把 + 号去掉,就是直接把 expandIconColumnIndex="-1"

<a-table
     :columns="columns"
     :data-source="templateTable"
     :scroll="{ x: 1200, y: undefined, scrollToFirstRowOnChange: true }"
     class="components-table-demo-nested"
     @expand="getInnerData"

     /// 关键点
     :expandIconColumnIndex="-1"
     :expandIconAsCell="false"
     ///

     :pagination="false"
     :expandedRowKeys="expandedRowKeys"
     :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
>

接着直接封装两个按钮,赋予逻辑,因为我们展开/关闭其实都是调用了某一个函数,只要我们点击的时候让他们再去调一次,带着不一样的值即可,又因为是响应式,所以会及时渲染不需要担心 

<template v-if="column.key === 'operation'">
            <a-button
              type="link"
              size="small"
              style="font-size: 14px"
              @click="getInnerData(false, record)"
              v-if="judgeInclude(record)"
            >
              <UpOutlined />
              收起
            </a-button>
            <a-button
              type="link"
              size="small"
              style="font-size: 14px"
              @click="getInnerData(true, record)"
              v-if="!judgeInclude(record)"
              ><DownOutlined />展开</a-button
            >
            <a-button type="link" class="btn-manager" size="small" style="font-size: 14px">编辑</a-button>
            <a-popconfirm title="确认删除吗?" @confirm="onDelete(record.templateId)" ok-text="确定" cancel-text="取消">
              <a-button type="link" danger size="small" style="font-size: 14px; margin-left: -5px">删除</a-button>
            </a-popconfirm>
          </template>
const innertemplatedata: UnwrapRef<messageTemplate[]> = reactive([])

const expandedRowKeys: number[] = reactive([])

const getInnerData = (expanded, record): void => {
  // 判断是否点开
  console.log('chufal')
  expandedRowKeys.length = 0
  if (expanded === true) {
    const b = record.key.toString()
    expandedRowKeys.push(Number(b.slice(-1)))
    innertemplatedata.length = 0
    innertemplatedata.push(record)
  } else {
    expandedRowKeys.length = 0
    innertemplatedata.length = 0
  }
}

const judgeInclude = (record): boolean => {
  console.log(innertemplatedata.includes(record))
  return innertemplatedata.includes(record)
}

 另附完整表格代码

<!-- 表格部分 -->
      <a-table
        :columns="columns"
        :data-source="templateTable"
        :scroll="{ x: 1200, y: undefined, scrollToFirstRowOnChange: true }"
        class="components-table-demo-nested"
        @expand="getInnerData"
        :expandIconColumnIndex="-1"
        :expandIconAsCell="false"
        :pagination="false"
        :expandedRowKeys="expandedRowKeys"
        :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
      >
        >
        <template #bodyCell="{ column, record }">
          <template v-if="column.key === 'templateStatus'">
            <span>
              <a-switch
                v-model:checked="record.templateStatus"
                checked-children="启用"
                un-checked-children="禁用"
                @change="changeStatus(record.templateId, record.templateStatus)"
              />
            </span>
          </template>
          <template v-if="column.key === 'operation'">
            <a-button
              type="link"
              size="small"
              style="font-size: 14px"
              @click="getInnerData(false, record)"
              v-if="judgeInclude(record)"
            >
              <UpOutlined />
              收起
            </a-button>
            <a-button
              type="link"
              size="small"
              style="font-size: 14px"
              @click="getInnerData(true, record)"
              v-if="!judgeInclude(record)"
              ><DownOutlined />展开</a-button
            >
            <a-button type="link" class="btn-manager" size="small" style="font-size: 14px">编辑</a-button>
            <a-popconfirm title="确认删除吗?" @confirm="onDelete(record.templateId)" ok-text="确定" cancel-text="取消">
              <a-button type="link" danger size="small" style="font-size: 14px; margin-left: -5px">删除</a-button>
            </a-popconfirm>
          </template>
        </template>
        <template #expandedRowRender>
          <a-table :columns="innerColumns" :data-source="innertemplatedata" :pagination="false">
            <template #bodyCell></template>
          </a-table>
        </template>
      </a-table>

当然,这个操作这一列我是固定了的,给了固定属性,如果说要固定的话,可以用这个属性

 

四. 如果是说我想另起一列放V 展开/收起呢

只需要在表格遍历的时候多加一列,然后还是一样放上这两个封装而成的函数,调同样的方法,就可以辽我的宝

这里xxx改成你对应的列名就好了
<template v-if="column.key === '(xxx)'">

最后祝大家都能写出没有bug的代码 (✿◕‿◕✿)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要在Vue3.0使用ant-design-vue,需要先安装ant-design-vueVue3.0。可以使用npm或yarn来安装这些依赖项。 安装完成后,需要在Vue应用程序引入ant-design-vue组件。可以在main.js文件导入ant-design-vue并注册组件,如下所示: ``` import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; const app = createApp(App); app.use(Antd); app.mount('#app'); ``` 在这个例,我们导入了App.vue组件和ant-design-vue库。我们还导入了ant-design-vue的CSS文件。然后,我们使用Vue的createApp方法创建了一个Vue应用程序实例,并使用Antd插件注册了所有的ant-design-vue组件。最后,我们将应用程序挂载到DOM元素上。 现在,您可以在Vue组件使用ant-design-vue组件了。例如,在App.vue组件,您可以添加一个Button组件,如下所示: ``` <template> <div> <a-button type="primary">Primary Button</a-button> </div> </template> ``` 这将在页面上显示一个蓝色的主要按钮。您可以使用其他ant-design-vue组件来构建您的Vue应用程序界面。 ### 回答2: Ant Design Vue是一个优秀的Vue UI组件库,具有丰富的组件和可定制性。在Vue3.0ant-design-vue一起使用时,需要遵循以下几个步骤: 1. 使用Vue CLI 5.0创建一个Vue3.0项目:可以使用Vue CLI 5.0创建一个新的Vue3.0项目,确保已安装Vue CLI 5.0,并在命令输入以下命令: ``` vue create my-project ``` 2. 安装ant-design-vue:在项目目录,可以通过npm或yarn安装ant-design-vue,输入以下命令: ``` npm install ant-design-vue --save ``` 或 ``` yarn add ant-design-vue ``` 安装完成后,需要在main.js引入并使用它,输入以下代码: ``` import { createApp } from 'vue' import App from './App.vue' import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; const app = createApp(App) app.use(Antd) app.mount('#app') ``` 3. 使用ant-design-vue组件:在Vue3.0,可以使用ant-design-vue组件来构建UI界面,例如: ``` <template> <a-button type="primary"> Primary Button </a-button> </template> <script> import { Button } from 'ant-design-vue'; export default { name: 'MyComponent', components: { 'a-button': Button } } </script> ``` 在代码导入Button组件,然后在模板通过自定义标签来使用Button组件。 除了以上步骤,还可以通过自定义主题和按需加载来进一步优化ant-design-vue使用。总之,在Vue3.0使用ant-design-vue可以帮助开发人员快速构建出美观、易用的Web应用程序。 ### 回答3: Vue3.0是目前最新的Vue框架版本,它与前几个版本相比,在性能和开发效率上都有了很大的提高。而Ant Design Vue是一个非常流的UI框架,也是许多Vue开发者所青睐的选择之一。在Vue3.0使用Ant Design Vue的方法如下: 1. 安装Ant Design Vue 在命令输入以下命令安装Ant Design Vue: ```bash npm install ant-design-vue --save ``` 2. 在Vue项目引入Ant Design Vue 在main.js文件导入Ant Design Vue: ```javascript import { createApp } from 'vue'; import Antd from 'ant-design-vue'; import App from './App.vue'; import 'ant-design-vue/dist/antd.css'; const app = createApp(App); app.use(Antd); app.mount('#app'); ``` 在上述代码,我们通过import语句将Ant Design Vue导入到了我们的Vue项目,并使用app.use(Antd)将其引入到了Vue实例。我们还通过import 'ant-design-vue/dist/antd.css'语句引入了Ant Design Vue的CSS样式文件,以便在项目使用Ant Design Vue的样式。 3. 使用Ant Design Vue组件 现在,我们已经可以在Vue项目使用Ant Design Vue组件啦!例如,我们可以在App.vue这样使用Button组件: ```vue <template> <div> <a-button type="primary">Primary Button</a-button> </div> </template> <script> export default { name: 'App', }; </script> ``` 最后,我们需要运npm run serve命令以启动Vue项目。在浏览器打开http://localhost:8080,应该就可以看到一个使用Ant Design Vue Button组件的页面啦! 总之,使用Ant Design Vue可以让我们快捷、高效地构建Vue项目。希望这篇回答能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值