iView/View UI tabs可关闭标签,跳跃关闭会关闭后续所有标签问题。

文章讲述了在使用Iview2.0的Tabs组件时遇到的问题,即在循环中添加删除按钮会导致多标签被错误关闭。作者尝试了手动添加按钮和使用官方的closable属性,但都存在问题。最后,通过:before-remove事件结合Promise.reject()解决了删除标签时的bug,尽管这会导致控制台出现错误提示。

 序言

        在使用iview2.0/View UI设计页面时发现需要使用tabs标签进行切换,但是在标签for循环内添加关闭按钮会给用户一种不是同级的感觉,所以打算采用官网的关闭方法,发现点击中间某个标签关闭会联通中间到结尾所有的标签都关闭的bug。

0.手动添加按钮方法

<Tabs ref="taskBeforeTabsSel" type="card">
  <TabPane v-for="(item, index) in taskBeforeStepData" :key="index" :label="'步骤'+(index+1)">
    <Button type="error" icon=" iconfont icon-trash" @click="delBeforeStep(index)">删除当前步骤</Button>
    <!-- 内容 -->
  </TabPane>
</Tabs>
// 作业前删除步骤
delBeforeStep(index) {
  this.taskBeforeStepData.splice(index, 1)
  if (this.taskBeforeStepData.length === index) {
    this.$refs.taskBeforeTabsSel.activeKey = index-1
    this.$refs.taskBeforeTabsSel.focusedKey = index-1
  }
  this.$forceUpdate() // 强制刷新
},

效果:

        因为添加步骤的内部还有一个3级表单,给人的感觉很容易误解为删除的不是上面的步骤而是下面的3级表单行。

 

1.结合官方代码问题

<Tabs ref="taskBeforeTabsSel" type="card" closable @on-tab-remove="delBeforeStep">
  <TabPane v-for="(item, index) in taskBeforeStepData" :key="index" :label="'步骤'+(index+1)">
    <!-- 内容 -->
  </TabPane>
</Tabs>

        js内容同上不变

效果:

 

        但实际打印参数却发现参数还在!并且还有白屏问题!

 2.寻找解决方案

        在度娘的帮助下在思否的一篇文章给我提供了迷津,机票

        在结合他文章后大佬给出答案,我做了尝试,发现并没有改观,但是题主却采纳了,经过仔细代码对比,我发现虽然都是在原标签dom节点进行关闭,但是关闭的方法却不一样。

        这里采用的是:before-remove,在官网api确实有该属性,但没有任何案例!坑啊!

        这个方法 + closable + 前面大佬给的return Promise.reject() = 问题解决!

3.最终代码

<Tabs ref="taskBeforeTabsSel" type="card" closable :before-remove="delBeforeStep">
  <TabPane v-for="(item, index) in taskBeforeStepData" :key="index" :label="'步骤'+(index+1)">
    <Button type="error" icon=" iconfont icon-trash" @click="delBeforeStep(index)">删除当前步骤</Button>
    <!-- 内容 -->
  </TabPane>
</Tabs>
// 作业前删除步骤
delBeforeStep(index) {
  this.taskBeforeStepData.splice(index, 1)
  if (this.taskBeforeStepData.length === index) {
    this.$refs.taskBeforeTabsSel.activeKey = index-1
    this.$refs.taskBeforeTabsSel.focusedKey = index-1
  }
  this.$forceUpdate() // 强制刷新
  return Promise.reject()
},

 效果:

 

        不过并不完美~ 因为使用Promise.reject() ,虽然原生iview删除被打断了,但控制台却有个报错提示,有解决方案的欢迎评论区指出~

 

<think> 我们使用iViewView UI)的Tabs组件,并通过render函数来自定义tab的内容,包括背景颜色。 在iView中,Tabs组件的每个TabPane可以通过设置其label属性的render函数来自定义标签头。 同时,我们需要根据数据动态设置单个tab的自定义背景,比如根据数据中的某个字段来设置不同的背景颜色。 步骤: 1. 在Tabs组件中,对于每个TabPane,我们可以使用scopedSlots来自定义label,但在render函数中,我们需要使用scopedSlots选项。 2. 在render函数中,我们可以通过给标签元素(如div)设置行内样式(style)来动态改变背景颜色。 假设我们有一个数据数组,每个元素代表一个tab,其中包含背景颜色的字段(例如bgColor)和标题等。 注意:在render函数中,我们使用`h`(即createElement)来创建虚拟节点。 示例代码如下: </think> 在 iView 中使用 render 函数动态设置 Tab 背景色的实现方法如下: ### 核心实现步骤 1. **数据结构准备**:每个 tab 包含背景色字段(如 `bgColor`) ```javascript const tabData = [ { title: 'Tab1', bgColor: '#f0f9eb' }, { title: 'Tab2', bgColor: '#fdf6ec' }, { title: 'Tab3', bgColor: '#ecf5ff' } ] ``` 2. **使用 render 函数创建 Tabs**: ```jsx render(h) { return h('Tabs', { props: { value: this.activeTab }, on: { 'on-click': this.handleTabChange } }, [ ...this.tabData.map(item => h('TabPane', { key: item.title, scopedSlots: { // 关键点:自定义 label 渲染 label: () => h('div', { style: { backgroundColor: item.bgColor, // 动态背景色 padding: '0 16px', borderRadius: '4px 4px 0 0' } }, item.title) } }) ) ]) } ``` ### 完整组件示例 ```jsx export default { data() { return { activeTab: 'Tab1', tabData: [ { title: 'Tab1', bgColor: '#f0f9eb' }, { title: 'Tab2', bgColor: '#fdf6ec' }, { title: 'Tab3', bgColor: '#ecf5ff' } ] } }, methods: { handleTabChange(name) { this.activeTab = name; } }, render(h) { return h('Tabs', { props: { value: this.activeTab }, on: { 'on-click': this.handleTabChange } }, [ ...this.tabData.map(item => h('TabPane', { key: item.title, props: { label: item.title, name: item.title }, scopedSlots: { label: () => h('div', { style: { backgroundColor: item.bgColor, padding: '0 16px', lineHeight: '38px', borderRadius: '4px 4px 0 0', marginRight: '2px' } }, item.title) } }) ) ]); } } ``` ### 关键说明 1. **scopedSlots.label**:通过该插槽自定义标签头渲染 2. **动态样式**:`style: { backgroundColor: item.bgColor }` 实现背景色绑定 3. **样式优化**:添加内边距/圆角等样式增强视觉效果 4. **事件处理**:`on-click` 事件处理标签切换 ### 效果说明 - 每个 Tab 标签头将显示自定义背景色 - 支持动态数据源驱动,修改 `tabData` 自动更新 - 保持 iView 原生功能(切换动画、响应式等) > **注意事项**: > 1. 为保证渲染性能,建议给每个 `TabPane` 设置唯一的 `key` > 2. 背景色值需考虑与文字颜色的对比度确保可读性 > 3. 可通过添加 `class` 实现更复杂的样式定制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值