vue中this.$refs有值,但无法获取ref的值问题及解决

 更新时间:2023年01月23日 12:27:39   作者:阿挪呐~  
这篇文章主要介绍了vue中this.$refs有值,但无法获取ref的值问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue中this.$refs有值,但无法获取ref的值

vue报错Cannot read property ‘addEventListener’ of null"

在这里插入图片描述

解决方法

查看当前div或者父级div是否存在v-if,如果存在,请改为 v-show

ant-design-vue中this.$refs使用笔记

笔者是后端开发,因为工作需要开始接触前端的一些东西,边学习边总结,如有描述错误的地方还请大家多多指教。

关于 ref 的用法,个人理解它像是简洁版的通过id获取控件元素的工具,其本意就是将拥有该属性的控件注册到父元素上进行统一管理。

下面用几个例子具体看下。

           <a-col :span="6">
			   <a-form-item label="测试控件A">
				   <DicSelect allowClear dicType="GROUP_ROLE_TYPE" v-decorator="['A']"  @select="selectDemo" />
			   </a-form-item>
		   </a-col>
			<a-col :span="6">
            	<a-form-item label="测试控件B" >
	                <DicSelect dicType="GROUP_ROLE_TYPE" ref="refTest1" :allowClear="true" v-decorator="['B']"/>
                </a-form-item>
			</a-col>
			<a-col :span="6">
            	<a-form-item label="测试控件C" >
					<a-input type="text" ref="refTest2" v-decorator="['C']"/>
				</a-form-item>
          </a-col>

首先做了三个控件,其中两个是双击下拉A和B,key-value码值为:[{"01":"组长"},{"02":"副组长"},{"03":"组员"}]。

最后一个是文本框C。然后我们再B和C上分别加上了ref属性,分别标记为refTest1和refTest2,在A控件上增加选定触发的函数selectDemo。

下面开始编辑函数内容:

selectDemo (value) {
			if (value === '01') {
				this.$refs.refTest1.disabledItem(['02', '03'])
				this.$refs.refTest2.value = "已选择01,02、03失效"
			} else if (value === '02') {
				this.$refs.refTest1.disabledItem(['01', '03'])
				this.$refs.refTest2.value = "已选择02,01、03失效"
			} else if (value === '03') {
				this.$refs.refTest1.disabledItem(['01', '02'])
				this.$refs.refTest2.value = "已选择03,01、02失效"
			} else {
				this.$refs.refTest1.disabledItem([])
				this.$refs.refTest2.value = "已选择04,无限制"
			}
		}

函数内容很简单,根据A控件选择内容,控制B控件可选内容,并且在C控件上展示具体提示,接下来我们看具体效果。

当我们选定控件A为组长时,根据上述jS逻辑会将控件B的02、03码值置为失效不可用,仅让选择01,并且在控件C展示文本说明。实际效果和我们预想一致。

关于利用ref赋值早有很多前辈进行介绍,笔者主要说一下  this.$refs.refTest1.disabledItem(['02', '03'])  的用法,工作中还是经常见到这样的场景,只不过我们都用了别的方式去实现,要么隐藏,要么替换码值类型等等,个人认为这样的用法更贴近用户,操作起来更容易理解其业务背景。

对于文章开头我理解的ref是将子元素注册到父元素的说法也在这里有验证,在操作为控件C赋值时,控制台会有错误提醒:

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"

大体意思是:避免直接改变属性值,因为每当父组件重新渲染时,该值将被覆盖。

也就是说直接赋值可能会导致属性值被覆盖的问题,很可能酿造一桩新的 “ Web悬案 ” ,大家在具体使用的时候要多多留意。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue组件跨层级获取组件操作

    Vue组件跨层级获取组件操作

    这篇文章主要介绍了Vue组件跨层级获取组件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue实现获取剪切板内容的两种方法

    Vue实现获取剪切板内容的两种方法

    这篇文章主要为大家详细介绍了Vue实现获取剪切板内容的两种方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-02-02
  • Vue3+vant+ts 上滑加载解决上滑调用多次数据的问题(推荐)

    Vue3+vant+ts 上滑加载解决上滑调用多次数据的问题(推荐)

    这篇文章主要介绍了Vue3+vant+ts 上滑加载解决上滑调用多次数据的问题,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具

    vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具

    这篇文章主要为大家介绍了vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具的踩坑分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Vue3实现跨标签页通信的四种方式

    Vue3实现跨标签页通信的四种方式

    在Vue应用中,跨标签页的通信通常涉及到两个或多个浏览器标签页之间的信息共享,由于每个标签页或窗口都是独立的JavaScript执行环境,它们不能直接通过Vue或其他JavaScript库来直接相互通信,但是,有一些方法可以实现这种跨标签页的通信,以下是一些常用的跨标签页通信方法
    2025-03-03
  • vue单个组件实现无限层级多选菜单功能

    vue单个组件实现无限层级多选菜单功能

    这篇文章主要介绍了vue单个组件实现无限层级多选菜单的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • vue.js动画中的js钩子函数的实现

    vue.js动画中的js钩子函数的实现

    这篇文章主要介绍了vue.js动画中的js钩子函数的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 前端Vue设置cookie、删除cookie,获取cookie方式

    前端Vue设置cookie、删除cookie,获取cookie方式

    这篇文章主要介绍了前端Vue设置cookie、删除cookie,获取cookie方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue2项目导出操作实现方法(后端接口导出、前端直接做导出)

    vue2项目导出操作实现方法(后端接口导出、前端直接做导出)

    这篇文章主要给大家介绍了关于vue2项目导出操作实现方法的相关资料,文中介绍的是后端接口导出、前端直接做导出,通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-05-05
  • vue实现右键菜单栏

    vue实现右键菜单栏

    这篇文章主要为大家详细介绍了vue实现右键菜单栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论