uniapp关于this.$refs.xxx获取组件出现undefined的解决方法

2 篇文章 0 订阅
1 篇文章 0 订阅

项目场景:

开发一个产品使用到比较复杂且独立的自定义组件,自定义组件是自定义复选框/单选框

问题描述:

用ref 注册子组件,父组件可以通过this.$refs.xx.fn调用子组件里的函数,但是有时会出现 undefined 未定义的情况。

vue代码

<view class="sg-checkbox">
	<helang-checkbox ref="checkbox" @change="onChange"></helang-checkbox>
</view>

js代码

this.$refs.checkbox.set({
	type:ctype,		// 类型:复选框
	column:column,	// 分列:2
	list:list_data	// 列表数据
});

原因分析:

vue 官网中ref 下有一段话 “关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定。”
意思就是需用ref之前,对于的组件必须先渲染成功,否则就不能使用ref


解决方案:

以下有三个方法可以解决这个问题

1、如果你在mounted里获取this. r e f s , 因 为 d o m 还 未 完 全 加 载 , 所 以 你 是 拿 不 到 的 , u p d a t e 阶 段 则 是 完 成 了 数 据 更 新 到 d o m 的 阶 段 ( 对 加 载 回 来 的 数 据 进 行 处 理 ) , 此 时 , 就 可 以 使 用 t h i s . refs,因为dom还未完全加载,所以你是拿不到的, update阶段则是完成了数据更新到 dom 的阶段(对加载回来的数据进行处理),此时,就可以使用this. refsdomupdatedom()使this.refs了

2、如果写在method中,那么可以使用 this.$nextTick(() => {}) 等页面渲染好再调用,这样就可以了

3、可以加个定时器延时加载this.$refs

this.$nextTick(()=>{
	this.$refs.checkbox.set({
		type:ctype,		// 类型:复选框
		column:column,	// 分列:2
		list:list_data	// 列表数据
	});
})
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用uni-app时,有时候可能会遇到使用 `this.$refs.xxx` 获取元素时出现 `undefined` 的情况。这通常是因为在组件渲染完成之前,尝试访问 `this.$refs.xxx`。 为了解决这个问题,你可以尝试以下几种方法: 1. 使用 `$nextTick` 方法:在 `this.$nextTick` 回调函数访问 `this.$refs.xxx`,确保组件已经完成渲染。示例代码如下: ```javascript this.$nextTick(() => { console.log(this.$refs.xxx); }); ``` 2. 使用 `v-if` 条件渲染:使用 `v-if` 条件渲染保证元素已经存在于 DOM 后再访问。示例代码如下: ```html <template> <div v-if="showElement" ref="xxx">Element</div> </template> <script> export default { data() { return { showElement: false }; }, mounted() { // 在适当的时机设置 showElement 为 true this.showElement = true; console.log(this.$refs.xxx); } }; </script> ``` 3. 使用 `this.$nextTick` 结合 `v-if`:结合上述两种方法,使用 `this.$nextTick` 确保组件渲染完成后再访问 `this.$refs.xxx`。示例代码如下: ```html <template> <div v-if="showElement" ref="xxx">Element</div> </template> <script> export default { data() { return { showElement: false }; }, mounted() { this.$nextTick(() => { this.showElement = true; console.log(this.$refs.xxx); }); } }; </script> ``` 以上是几种解决 `this.$refs.xxx` 获取元素出现 `undefined` 的方法,你可以根据实际情况选择适合你的方法解决问题。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值