首页前端开发VUEvue中$refs的三种用法解读

vue中$refs的三种用法解读

时间2024-02-11 03:06:02发布访客分类VUE浏览154
导读:收集整理的这篇文章主要介绍了vue中$refs的三种用法解读,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录vue $refs的三种用法1、vue2中2、vue3中3、vue3的...
收集整理的这篇文章主要介绍了vue中$refs的三种用法解读,觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
  • vue $refs的三种用法
    • 1、vue2中
    • 2、vue3中
    • 3、vue3的组合API(composition-api)
  • 对vue中$refs的理解
    • 描述
  • 总结

    vue $refs的三种用法

    我们都知道,在vue2中获取DOM元素,可以直接在元素上绑定ref属性,然后获取到DOM元素的属性值,这种方法在vue3 中仍然可以使用,但也会有一些问题。

    下面就介绍$refs的三种用法:

    1、vue2中

    在vue2中,我们可以直接使用ref获取元素,也就是直接在元素上绑定ref属性,在直接使用this.$refs[‘自定义属性名’] 就能直接获取。

    但是这样也是有一定风险的。因为ref绑定的在元素上,所以当元素没有进行渲染时,是不能通过ref获取到元素的。

    template>
          div>
            div ref="BTn">
        我是一个按钮/div>
          /div>
        /template>
         script>
     export default {
      name: 'App',  created() {
            //直接使用this.$refs获取DOM元素    console.LOG(this.$refs.btn);
         // undefined    this.$nextTick(() =>
     {
            console.log(this.$refs.btn)  //获取到正确元素    }
    )  }
    ,  mounted() {
            console.log(this.$refs.btn);
     //获取到正确元素  }
    }
        /script>
        

    需要注意的是,在于vue2中使用这种方法获取v-for的元素时,获取到的是一个数组。

    template>
          div>
            div ref="btn" v-for="(ITem , index) in 3" :key="index">
        我是一个按钮/div>
          /div>
        /template>
         script>
     export default {
      name: 'App',  mounted() {
            //获取到的是一个元素数组     console.log(this.$refs.btn);
       }
    }
        /script>
        

    2、vue3中

    在一般情况下,vue2的获取元素的方法在vue3也完全适用。

    但是,有时候可能会遇到无法获取这个节点,原因是生命周期的问题,在vue3中原来的created没有了,而 @R_777_1315@ 充当了原来的 created。

    所以在 setup 的时候,dom元素还没有被创建,只有setup完毕了之后HTML才能构建,这时才能真正访问到value值,所以自然就无法获取到dom节点,要想解决这个问题,就要配合钩子函数 onMounted ,在dom挂载完毕后再进行获取。

    template>
            div id="ref">
                !--在元素上用 ref="butRef" 绑定-->
                button tyPE="button" ref="butRef" >
        按钮元素/button>
            /div>
        /template>
         script>
        //引入ref    import {
    ref, onMounted}
     From 'vue'    export default {
            setup() {
                     //需要先定义butRef            let butRef = ref(null)            onMounted(()=>
    {
                      //使用的时候为 butRef.value(需要加点value获取DOM元素值)              console.log(butRef.value);
                }
    )            return {
                    butRef            }
            }
        }
        /script>
        

    3、vue3的组合API(composition-api)

    最后一种方法就是从上下文 Ctx(context)中解构构出 refs,虽然这里refs可能会提示已经被弃用,但是在这里仍然是可以用的。

    template>
            div id="ref">
                button type="button" ref="butRef" >
        按钮元素/button>
            /div>
        /template>
         script lang="ts">
    import {
     definecomponent, ref, watch }
         from '@vue/composition-api';
     export default defineComponent({
        name: '',    components: {
    }
    ,    setup (PRops, ctx) {
            //从Ctx(context)中解构出 refs        const {
     emit, refs }
         = ctx;
                            watch(filterText, (val) =>
     {
                    //在使用的时候直接用 refs.butRef            //refs.butRef.filter(val);
                    (refs.butRef as Any).filter(val);
            }
        );
            return {
                butRef        }
        }
    }
        /script>
        

    对vue中$refs的理解

    $refs是一个对象,持有注册过ref attribute的所有DOM元素和组件实例。

    描述

    ref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上,

    如果在普通的DOM元素上使用,引用指向的就是DOM元素;

    如果用在子组件上,引用就指向组件实例,

    另外当v-for用于元素或组件的时候,引用信息将是包含DOM节点或组件实例的数组。

    !DOCTYPE html>
        html>
        head>
            title>
        Vue/title>
        /head>
        body>
            div id="app">
                div ref="node">
        Node/div>
                layout-div ref="layout">
        /layout-div>
                div v-for="i in 3" :key="i" ref="nodearr">
    {
    {
    i}
    }
        /div>
            /div>
        /body>
        script src="https://cdn.bootcss.COM/vue/2.4.2/vue.js">
        /script>
        script type="text/javascript">
        Vue.component("layout-div", {
          data: function(){
              return {
                count: 0          }
          }
        ,      template: `div>
                            div>
    {
    {
    count}
    }
        /div>
                        /div>
    `    }
    )     VAR vm = new Vue({
            el: '#app',        mounted: function(){
                    console.log(this.$refs.node);
         // div>
        Node/div>
         // DOM元素            console.log(this.$refs.layout);
     // VueComponent {
    _uid: 1, ...}
         // 组件实例            console.log(this.$refs.nodearr);
     // (3) [div, div, div] // DOM元素数组        }
        }
        )/script>
        /html>
        

    因为ref本身是作为渲染结果被创建的,在初始渲染的时候是不能访问的,因为其还不存在,而且$refs也不是响应式的,因此不应该试图用它在模板中做数据绑定,在初始化访问ref时,应该在其生命周期的mounted方法中调用,在数据更新之后,应该在$nextTick方法中传递回调操作来获取元素或实例,此外一般不推荐直接操作DOM元素,尽量使用数据绑定让MVVM的ViewModel去操作DOM。

    !DOCTYPE html>
        html>
        head>
            title>
        Vue/title>
        /head>
        body>
            div id="app">
        /div>
        /body>
        script src="https://cdn.bootcss.com/vue/2.4.2/vue.js">
        /script>
        script type="text/javascript">
         var vm = new Vue({
            el: '#app',        data: function(){
                return {
                    msg: 0            }
            }
        ,        template:  `div>
                               div ref="node">
    {
    {
    msg}
    }
        /div>
                               button @click="updateMsg">
        button/button>
                            /div>
    `,        beforeMount: function(){
                    console.log(this.$refs.node);
     // undefined        }
    ,        mounted: function(){
                    console.log(this.$refs.node);
         // div>
        0/div>
            }
    ,        methods: {
                updateMsg: function(){
                        this.msg = 1;
                        console.log(this.$refs.node.innerHTML);
         // 0                this.$nextTick(() =>
     {
                            console.log(this.$refs.node.innerHTML);
     // 1                }
    )            }
            }
        }
        )/script>
        /html>
        

    总结

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

    您可能感兴趣的文章:
    • vue中动态渲染数据时使用$refs无效的解决
    • vue 循环动态设置ref并获取$refs方式
    • Vue通过ref获取不到$refs问题
    • VUE中$refs的基本用法举例
    • vue如何在for循环中设置ref并获取$refs
    • Vue 实例中使用$refs的注意事项

    声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


    若转载请注明出处: vue中$refs的三种用法解读
    本文地址: https://pptw.com/jishu/609237.html
    vue多语言转换的几种方法总结 vue中动态渲染数据时使用$refs无效的解决

    游客 回复需填写必要信息