Vue里ref ($refs)用法


ref 有三種用法:

  1、ref 加在普通的元素上,用this.ref.name 獲取到的是dom元素

  2、ref 加在子組件上,用this.ref.name 獲取到的是組件實例,可以使用組件的所有方法

  3、如何利用 v-for 和 ref 獲取一組數組或者dom 節點

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title>ref</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <ul>
                <li v-for="item in list" ref="refContent"> {{item}}</li>
            </ul>
        </div>
    </body>
</html>
<script type="text/javascript" charset="utf-8">
    var app = new Vue({
        el: "#app",
        data: {
            list: ['馬芸', '麻花藤', '王劍琳', '李佳成'],
        },
        created: function() {
            this.$nextTick(() => {
                console.log(this); // #app    vue實例
                console.log(this.$refs.refContent); //  <p>標簽dom元素 ref在外面的元素上</p>} )
            })
        },
    });
</script>

 

1、ref 需要在dom渲染完成后才會有,在使用的時候確保dom已經渲染完成。比如在生命周期 mounted(){} 鈎子中調用,或者在 this.$nextTick(()=>{}) 中調用

2、如果ref 是循環出來的,有多個重名,那么ref的值會是一個數組 ,此時要拿到單個的ref 只需要循環就可以了。

 

1.ref作用在外面元素上

在學習 jq 時,我們首要任務就是學習選擇的使用,因為選擇可以極其方便幫助我們獲取節點查找dom,因為我們要通過dom展示處理數據。而在Vue中,我們的編程理念發生了變化,變為了數據驅動dom;但有時我們因為某些情況不得不脫離數據操作dom,因此vue為我們提供了 ref 屬性獲取dom節點;

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title>ref</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app" v-on:click="consoleRef">
            <p ref="outsideDomRef">ref在外面的元素上</p>
        </div>
    </body>
</html>
<script type="text/javascript" charset="utf-8">
    var app = new Vue({
        el: "#app",
        methods: {
            //用來獲取具有ref屬性的節點對象
            consoleRef: function() {
                console.log(this); // #app    vue實例
                console.log(this.$refs.outsideDomRef); //  <p>標簽dom元素 ref在外面的元素上</p>
            }
        },
    });
</script>

 

2.ref作用在外面組件上

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title>ref</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app" v-on:click="consoleRef">
            <component-father ref="outsideComponentRef"></component-father>
        </div>
    </body>
</html>
<script type="text/javascript" charset="utf-8">
    var refoutsidecomponentTem = {
        template: "<div class='childComp'><p>ref在外面的組件上</p></div>"
    };

    var app = new Vue({
        el: "#app",
        components: {
            "component-father": refoutsidecomponentTem
        },
        methods: {
            consoleRef: function() {
                console.log(this); // #app     vue實例
                console.log(this.$refs.outsideComponentRef); // div.childComp vue實例,組件實例
            }
        }
    });
</script>

 

3.ref使用在里面的元素上--局部注冊組件

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title>ref</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <component-father></component-father>
        </div>
    </body>
</html>
<script type="text/javascript" charset="utf-8">
    var refinsidedomTem = {
        template: "<div class='childComp' v-on:click='consoleRef'>" +
            "<p ref='insideDomRef'>ref在組件里面的元素上,我是子組件</p>" +
            "</div>",
        methods: {
            consoleRef: function() {
                console.log(this); // div.childComp   vue實例 
                console.log(this.$refs.insideDomRef); // <p>ref在組件里面的元素上,我是子組件</p>
            }
        }
    };

    var app = new Vue({
        el: "#app",
        components: {
            "component-father": refinsidedomTem
        }
    });
</script>

 

4.ref使用在里面的元素上--全局注冊組件

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title>ref</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <ref-inside-dom></ref-inside-dom>
        </div>
    </body>
</html>
<script type="text/javascript" charset="utf-8">
    Vue.component("ref-inside-dom", {
        template: "<div class='insideFather'> " +
            "<input type='text' ref='insideDomRefAll' v-on:input='showinsideDomRef'>" +
            "<p>ref在里面的元素上--全局注冊 </p> " +
            "</div>",
        methods: {
            showinsideDomRef: function() {
                console.log(this); //這里的this其實還是div.insideFather
                console.log(this.$refs.insideDomRefAll); // <input type="text">
            }
        }
    });

    var app = new Vue({
        el: "#app",
    });
</script>

 

 

參考文章:https://www.cnblogs.com/goloving/p/9404099.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM