el-radio-group中的area-hidden报错的问题解决

 更新时间:2025年04月03日 10:13:55   作者:新茶十九  
本文主要介绍了el-radio-group中的area-hidden报错的问题解决,下面就来介绍几种解决方法,具有一定的参考价值,感兴趣的可以了解一下

一、抛出问题:

在使用nuxt2 + element UI开发时,使用了el-radio-group组件,当点击radio时报错,如下:

image.png

二、问题分析

Element UI 的 el-radio 组件默认会将原生的 <input> 元素隐藏,用 <div> 或 <span> 模拟可视化样式。若需操作原生 input 元素,需通过组件 DOM 结构查找。

三、解决方法:

方法一:(vue2 和 vue3都适用)

<template>
  <el-radio-group v-model="selectedValue" ref="radioGroup">
    <el-radio :label="1">选项1</el-radio>
    <el-radio :label="2">选项2</el-radio>
    <el-radio :label="3">选项3</el-radio>
  </el-radio-group>
</template>

<script>
export default {
  data() {
    return {
      selectedValue: 1
    };
  },
  mounted() {
    // 确保 DOM 已渲染完成
    this.$nextTick(() => {
      this.setInputAriaHidden();
    });
  },
  methods: {
    setInputAriaHidden() {
      // 获取 el-radio-group 下所有 input 元素
      const inputs = this.$refs.radioGroup.$el.querySelectorAll('input[type="radio"]');
      inputs.forEach(input => {
        input.setAttribute('aria-hidden', 'false');
      });
    }
  }
};
</script>

关键步骤说明

添加 ref 引用
在 el-radio-group 上添加 ref="radioGroup",以便通过 Vue 实例访问 DOM

等待 DOM 渲染完成
在 mounted 生命周期钩子中使用 this.$nextTick(),确保组件渲染完毕后再操作 DOM

查找所有 input 元素
通过 querySelectorAll 选择 el-radio-group 内所有类型为 radio 的 input 元素。

设置 aria-hidden 属性
遍历每个 input 元素,通过 setAttribute 修改其 aria-hidden 属性。

若 el-radio-group 的内容是动态生成的,需在数据更新后重新调用setInputAriaHidden:

watch: {
  dynamicOptions() {
    this.$nextTick(this.setInputAriaHidden);
  }
}

方法二:

因为使用nuxt,所以在nuxt中可修改如下:

<template>
  <el-radio-group v-model="selectedValue" ref="radioGroupRef">
    <el-radio v-for="option in options" :key="option.value" :label="option.value">
      {{ option.label }}
    </el-radio>
  </el-radio-group>
</template>

<script>
export default {
  data() {
    return {
      selectedValue: 1,
      options: [
        { value: 1, label: '选项1' },
        { value: 2, label: '选项2' },
        { value: 3, label: '选项3' }
      ]
    }
  },
  watch: {
    options: {
    	handler() {
      	this.$nextTick(this.setInputAriaHidden)
    	},
      deep: true
    }
  },
  mounted() {
    // 确保在客户端执行且 DOM 已渲染
    if (process.client) {
      this.$nextTick(() => {
        this.setInputAriaHidden()
      })
    }
  },
  methods: {
    setInputAriaHidden() {
      const radioGroup = this.$refs.radioGroupRef?.$el
      if (!radioGroup) return

      // 获取所有原生 input 元素
      const inputs = radioGroup.querySelectorAll('input[type="radio"]')
      inputs.forEach(input => {
        input.setAttribute('aria-hidden', 'false')
      })
    }
  }
}
</script>

四、优化:可以将方法进行全局处理:

思路:通过 Nuxt 插件 + 全局混入(Mixin) 的方式,在所有 el-radio-group 组件挂载时自动操作其 DOM:

1. 创建 Nuxt 插件文件

在 plugins/ 目录下新建文件 element-aria-global.js

export default function (context) {
  if (process.client) { // 仅客户端执行
    const Vue = context.app

    // 全局混入
    Vue.mixin({
      mounted() {
        // 检查当前组件是否为 el-radio-group
        if (this.$options.name === 'ElRadioGroup') {
          this.$nextTick(() => {
            this.setInputAriaHidden()
          })
        }
      },
    // 如果需要支持动态生成的 el-radio(如异步数据),扩展 updated 生命周期:
     updated() {
        if (this.$options.name === 'ElRadioGroup') {
          this.$nextTick(() => {
            this.setInputAriaHidden()
          })
        }
      },
      methods: {
        setInputAriaHidden() {
          const inputs = this.$el?.querySelectorAll('input[type="radio"]')
          if (inputs) {
            inputs.forEach(input => {
              input.setAttribute('aria-hidden', 'false')
            })
          }
        }
      }
    })
  }
}

2. 配置 Nuxt 插件

在 nuxt.config.js 中添加插件配置(确保在 Element UI 插件之后加载):

export default {
  plugins: [
    '~/plugins/element-aria-global.js' // 添加此行
  ],
  // 若使用 @nuxtjs/element-ui 模块
  modules: [
    '@nuxtjs/element-ui'
  ],
  elementUI: {
    components: ['RadioGroup', 'Radio'] // 按需引入
  }
}

五、替代方案:自定义指令:

指令封装:

// plugins/directive-aria.js
export default function (context) {
  if (process.client) {
    const Vue = context.app

    Vue.directive('aria-radio', {
      inserted(el) {
        const inputs = el.querySelectorAll('input[type="radio"]')
        inputs.forEach(input => {
          input.setAttribute('aria-hidden', 'false')
        })
      }
    })
  }
}

组件中使用:

<template>
  <el-radio-group v-model="value" v-aria-radio>
    <!-- 选项 -->
  </el-radio-group>
</template>

到此这篇关于el-radio-group中的area-hidden报错的问题解决的文章就介绍到这了,更多相关el-radio-group area-hidden报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • element-vue实现网页锁屏功能(示例代码)

    element-vue实现网页锁屏功能(示例代码)

    这篇文章主要介绍了element-vue实现网页锁屏功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Vue中watch清除过期副作用的案例详解

    Vue中watch清除过期副作用的案例详解

    在这里就不过多说watch的用法了,这篇文章主要通过案例带大家了解一下如何清除过期的副作用。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-01-01
  • Vue打包为相对路径的具体实现方法

    Vue打包为相对路径的具体实现方法

    在Vue.js项目中,构建后的资源文件(如CSS、JavaScript文件、图片等)通常会被放置在指定的目录下,为了确保这些文件能够被正确加载,Vue CLI 提供了配置选项来指定这些文件的路径,本文给大家介绍了Vue打包为相对路径的具体实现方法,需要的朋友可以参考下
    2024-09-09
  • Vue Element前端应用开发之echarts图表

    Vue Element前端应用开发之echarts图表

    在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一
    2021-05-05
  • vue.js 实现评价五角星组件的实例代码

    vue.js 实现评价五角星组件的实例代码

    这篇文章主要介绍了vue.js 实现评价五角星组件的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • vue一直自动换行的问题及解决

    vue一直自动换行的问题及解决

    这篇文章主要介绍了vue一直自动换行的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑

    浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑

    这篇文章主要介绍了浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue内置组件Teleport的使用

    Vue内置组件Teleport的使用

    Teleport是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去,本文就来介绍一下如何使用,感兴趣的可以了解一下
    2023-05-05
  • 分析总结20道Vue高频面试题

    分析总结20道Vue高频面试题

    这篇文章主要为大家介绍了分析总结20道Vue高频面试题示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 前端面试之vue2和vue3的区别有哪些

    前端面试之vue2和vue3的区别有哪些

    这篇文章主要为大家介绍了前端面试之vue2和vue3的区别有哪些,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论