【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

这篇具有很好参考价值的文章主要介绍了【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题:获取this.$refs为空对象或者为undefined

原因一:在uniapp中,非H5端只能用于获取自定义组件,不能用于获取内置组件实例(如:view、text)

解决方法:ref在非H5端使用在自定义的组件

原因二:使用了版本过低的调试基础库

原因三:ref组件使用了条件渲染,即v-if、v-show,这些DOM节点在mounted无法被访问到,详细可以看 深入响应式原理-Vue.js

原因四:使用了v-for循环动态绑定ref(大部分时请求后端数据动态渲染DOM),this.$ref[name]获取的是数组,详情看ref属性-Vue.js

扩展场景:uni-app的H5/小程序实现锚点


问题:获取this.$refs为空对象或者为undefined

console.log(this.$refs) // {}

原因一:在uniapp中,非H5端只能用于获取自定义组件,不能用于获取内置组件实例(如:view、text)

<view ref="viewRef"></view>
<text ref="viewRef"></text>
// js
console.log(this.$refs) // n内置组件获取不到ref{}

解决方法:ref在非H5端使用在自定义的组件

<jz-loading ref="loading"></jz-loading>
//js
console.log(this.$refs['loading']) // 输出实例

原因二:使用了版本过低的调试基础库

解决办法:切换至高版本基础库即可

【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

原因三:ref组件使用了条件渲染,即v-if、v-show,这些DOM节点在mounted无法被访问到,详细可以看 深入响应式原理-Vue.js

解决办法:使用this.$nextTick(() => {})方法在渲染完成后获取ref

mounted() {
    // 操作数据.
    .......
    this.$nextTick(()=>{
        console.log(this.$refs[name]) // 输出实例
    })
}

原因四:使用了v-for循环动态绑定ref(大部分时请求后端数据动态渲染DOM),this.$ref[name]获取的是数组,详情看ref属性-Vue.js

【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

 解决办法:

由this.$refs[name]改为this.$refs[name][0]

扩展场景:uni-app的H5/小程序实现锚点

实现方法(H5端):H5实现方法比较简单,获取ref组件实例的$el的offsetTop属性

methods:{
    handleScrollTo(name){
        //H5
        uni.pageScrollTo({
            scrollTop: this.$refs[name][0].$el.offsetTop,
            duration: 100
        });
    }
}

实现方法(小程序端):小程序端使用this.$refs[name][0].$el.offsetTop会发现找不到$el属性

原因是$el只支持H5端 

【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

针对小程序我们可以用节点查询,使用uni.createSelectorQuery() 和uni.createSelectorQuery().selectViewport().scrollOffset()查询节点信息

【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

 【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)

附实现思路,拿到需要锚点组件的相对坐标top,再获取当前屏幕的滚动距离scrollTop 

scrollTop - Math.abs(top) 则得出需要滚动到锚点所需距离

const query = uni.createSelectorQuery().in(this)
query.select(`#${id}`).boundingClientRect(data => {
    console.log(data) // 返回节点的相对坐标信息top、bottom等
    //查询当前屏幕的滚动位置等信息
    uni.createSelectorQuery().selectViewport().scrollOffset(res => {
        uni.pageScrollTo({
            scrollTop: res.scrollTop - Math.abs(data.top),
             duration: 100
        });
    }).exec();
}).exec();
     

如果文章帮助到大家,可以点赞评论收藏~文章来源地址https://www.toymoban.com/news/detail-485766.html

到了这里,关于【Vue】Vue的$ref属性为空对象或者为undefined问题及解决办法(涵盖uniapp/H5/微信小程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3中ref获取不到组件实例&&数组中对象的属性值去重

    1、vue3中ref获取不到组件实例 原因 :使用语法糖的组件是默认关闭的,也即通过模板 ref 或者 $parent 链获取到的组件的公开实例,不会暴露任何在 script setup 中声明的绑定。 解决方法 : 为了在 语法糖组件中明确要暴露出去的属性,使用 defineExpose 编译器宏将需要暴露出去的变

    2024年02月11日
    浏览(31)
  • Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)

    \\\"cannot read property of undefined\\\" 是一个常见的 JavaScript 错误,包含我在内很多人都会遇到,表示你试图访问一个未定义(undefined)对象的属性。这通常是因为你在访问一个不存在的对象或者变量。为了解决这个问题,你需要检查你的代码,确保在访问对象属性之前,对象已经被正

    2024年04月09日
    浏览(36)
  • less中:export 无效问题,vue-cli中导出公共变量,js对象为空对象

    试例 解决方案 注:在vue-cli v5版本中requireModuleExtension是已经被移除了。在没有任何配置的情况下打印出来的就是一个空对象 通过阅读官方文档,发现可以根据约定将文件名改为.module.(css|scss|sass|less|styl(us)?)结尾,这样就可以识别出css module。 这里是将自己项目中的variables.le

    2024年02月13日
    浏览(52)
  • JavaScript技巧:解决document.getElementById为空或不是对象的问题

    在JavaScript开发中,经常会使用 document.getElementById 方法来获取HTML页面中的元素。然而,有时候我们可能会遇到 document.getElementById 返回 null 或者不是一个对象的情况。这种情况通常发生在以下几种情况下: 元素尚未加载完成:如果在页面加载完成之前就尝试获取元素, docume

    2024年01月18日
    浏览(33)
  • Mybatis-Plus不能更新对象字段为空值问题解决

    问题描述: 在使用Mybatis-Plus调用updateById方法进行数据更新默认情况下是不能更新空值字段的,而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况,该如何解决呢? 原因分析: Mybatis-Plus中字段的更新策略是通过FieldStrategy属性控制的。在实体字段上,如果不通

    2024年02月12日
    浏览(38)
  • ref拿到组件的实例对象或者原生html标签

    在组件中,或者html标签中写ref属性,就是在注册引用 可以通过ref拿到组件的实例对象 也可以通过ref拿到原生的html标签  

    2024年02月12日
    浏览(27)
  • uni-app使用vue3,在元素或组件实例上添加ref,用this.$refs显示undefined

    项目中引用了一个UI组件库,在表单上添加了`ref`属性,方便提交时验证。触发提交方法时显示不存在这个方法或this.$refs为undefined。 解决方法: 引入`getCurrentInstance`,t得到当前组件实例,然后用`ctx.$refs`代替`this.$refs`。这里的`ctx`相当于全局this。 ------------------ 2023/10/27更新-

    2024年02月07日
    浏览(40)
  • Vue(ref和$refs属性介绍与使用)

    在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现,本文我们就来详细的介绍下这个内容 除了自定义属性外,Vue实例还暴露一些有用的实例属性和方法,他们都有前缀$,以便和用户定义的属性和方法分开 常用的属性有

    2023年04月26日
    浏览(27)
  • 20230628----重返学习-自定义指令的玩法和作用-对象新增属性不能响应的问题-Vue组件中的data属性-Vue生命周

    面试题:自定义指令的玩法和作用 面试题:Vue怎么用 vm.$set() 解决对象新增属性不能响应的问题 ? 面试题:Vue 组件中的 data 为什么必须是函数? 面试题:谈谈你对 Vue2 生命周期的理解? 面试题:简单说一下 $nextTick 的作用及实现原理? 面试题:computed 和 watch 的区别和运用

    2024年02月11日
    浏览(42)
  • vue学习-03vue父子组件与ref属性

    本篇开始,我们将复习一下上篇的组件引入: App.vue components/ School.vue Student.vue main.js main.js App.vue,将最上边的App.vue调整为以下内容 school.vue student.vue

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包