vue中$refs的基本用法

 一: $refs的说明

1、ref 加在普通的元素上,用this.$refs.(ref值) 获取到的是dom元素

2、ref 加在子组件上,用this.$refs.(ref值) 获取到的是组件实例,可以使用组件的所有方法。在使用方法的时候直接this.$refs.(ref值).方法() 就可以使用了。

3、如何利用 v-for 和 ref 获取一组数组或者dom 节点(:ref =某变量)

  • 说明:vm.$refs 一个对象,持有已注册过 ref 的所有子组件(或HTML元素)

  • 使用:在 HTML元素 中,添加ref属性,然后在JS中通过vm.$refs.属性来获取

  • 注意:如果获取的是一个子组件,那么通过ref就能获取到子组件中的data和methods

二: 代码 

        一般来讲,获取DOM元素,需document.querySelector(".input1")获取这个dom节点,然后在获取input1的值。

        但是用ref绑定之后,我们就不需要在获取dom节点了,直接在上面的input上绑定input1,然后$refs里面调用就行。

        然后在javascript里面这样调用:this.$refs.input1 这样就可以减少获取dom节点的消耗了。示例代码如下:

<-- 添加ref属性 -->
<div id="app">
	<input type="text" ref="input1"/>
    <button @click="add">添加</button>
</div>

// 获取注册过 ref 的所有组件或元素
<script>
    new Vue({
        el: "#app",
        methods:{
        add:function(){
            this.$refs.input1.value ="22"; //this.$refs.input1  减少获取dom节点的消耗
            }
        }
    })
</script>

三: 避坑补充

1、在开发过程中,经常会通过实例的vm.$refs(this.$refs)取得通过ref注册过的组件,并进行相应操作,但存在取不到元素的情况,其根本原因是因为$refs只能取得mounted(渲染)之后的元素。

        例如,在这种情况中,若flag从真值切换到假值取不到节点是正常的,因为v-if如果为假值,那么该节点不会被渲染。

        但如果从假值切换到真值时,也可能取不到节点,这是因为渲染需要时间,通常可以使用$nexttick()解决。

        但存在一个极特殊的情况,第一次页面渲染的时候,$refs也取不到值。这个时候就要考虑v-show进行组件元素的隐藏与展示。

        因为v-show是通过css的display:none进行隐藏控制,所以一开始就会渲染,肯定能够取到元素

2、如果通过v-for 遍历想加不同的ref时记得加 :号,即 :ref =某变量 ;

这点和其他属性一样,如果是固定值就不需要加 :号,如果是变量记得加 :号

3、通过 :ref =某变量 添加ref(即加了:号) ,如果想获取该ref时需要加 [0],如this.$refs[refsarrayitem] [0];如果不是:ref =某变量的方式而是 ref =某字符串时则不需要加,如this.$refs[refsarrayitem]

加和不加[0]的区别--未展开

加和不加[0]的区别--展开了

4、想在element ui 对话框打开后取dom时,应该使用$nexttick,而不是直接使用this.$refs. imglocal2:

5 、ref的使用方法

1、ref使用在外面的组件上

html 部分

js部分

2、ref使用在外面的元素上

html部分

js部分

3、ref使用在里面的元素上---局部注册组件

html部分

js部分

4、ref使用在里面的元素上---全局注册组件

html部分

js部分 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue 3,`$refs` 是一个用于访问组件或DOM元素的实例的特殊属性。它可以让你直接访问组件实例或DOM元素,以便进行操作或获取其属性。 使用 `$refs` 的一般步骤如下: 1. 在模板给组件或DOM元素添加 `ref` 特性: ```html <template> <div> <my-component ref="myRef"></my-component> <div ref="myDomRef">Hello, world!</div> </div> </template> ``` 2. 在组件的方法或生命周期钩子函数使用 `$refs` 来访问组件实例或DOM元素: ```javascript export default { mounted() { const componentInstance = this.$refs.myRef // 访问组件实例 const domElement = this.$refs.myDomRef // 访问DOM元素 // 对组件实例进行操作 componentInstance.doSomething() // 获取DOM元素的属性 const textContent = domElement.textContent console.log(textContent) } } ``` 在上面的代码,`ref="myRef"` 将组件实例存储在 `$refs` 对象的 `myRef` 属性,而 `ref="myDomRef"` 则将DOM元素存储在 `$refs` 对象的 `myDomRef` 属性。 需要注意的是,当在`mounted`钩子函数访问 `$refs` 时,确保目标组件已经挂载完成,否则可能会得到 `undefined` 值。如果需要在其他生命周期钩子函数访问 `$refs`,请确保在合适的时机。 总之,`$refs` 是一个方便的属性,可以让你直接访问组件实例或DOM元素。但是,尽量避免在模板过度使用 `ref`,因为过多的 `ref` 可能会导致代码难以维护和理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴怒的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值