vue中 ref、$refs、$emit、$on、$bus、$off 詳解和使用

来源:https://www.cnblogs.com/Steal-cha-of-Melon/archive/2023/04/07/walon_fourth_title.html
-Advertisement-
Play Games

1.ref 和 $refs ref 被用來給元素或子組件註冊引用信息, 引用信息將會註冊在父組件的 $refs 對象上,如果是在普通的DOM元素上使用,引用指向的就是DOM元素,如果是在子組件上,引用就指向組件的實例。 $refs 是一個對象,持有已註冊過 ref 的所有的子組件。 ref用法: r ...


1.ref 和 $refs

ref 被用來給元素或子組件註冊引用信息, 引用信息將會註冊在父組件的 $refs 對象上,如果是在普通的DOM元素上使用,引用指向的就是DOM元素,如果是在子組件上,引用就指向組件的實例。

$refs 是一個對象,持有已註冊過 ref 的所有的子組件。

 ref用法:

  • ref 加在普通的元素上,用 this.$refs.(ref值) 獲取到的是 dom 元素;
  • ref 加在子組件上,用 this.$refs.(ref值) 獲取到的是組件實例,可以使用組件的所有方法;
  • 如果利用 v-for 和 ref 獲取一組數據或 dom 節點
  •   當 v-for 用於元素或者組件的時候,引用信息將是包含 dom 節點或組件實例的數組;
  •   如果 ref 是迴圈出來的,有多個重名,那麼 ref 的值會是一個數組 ,此時要拿到單個的 ref 只需要迴圈就可以了。
  •   關於 ref 註冊時間的重要說明:因為 ref 本身是作為渲染結果被創建的,需要在dom渲染完成後才會有,在使用的時候要確保dom已經渲染完成。比如在生命周期 mounted(){} 鉤子中調用,或者在 this.$nextTick(()=>{}) 中調用。
  •   $refs 也不是響應式的,因此不應該用它在模板中做數據綁定。(指Vue.js中的refs屬性)不是響應式的,它不能像data或props一樣自動更新視圖,因此在模板中不能通過數據綁定的方式來使用它。refs主要用於訪問組件或DOM元素的引用,例如在組件中獲取子組件的引用或獲取某個DOM元素的引用,但是它的更新需要手動觸發。因此,在使用$refs時,需要註意它的局限性,不能將它用作數據綁定的一種方式。

ref 加在普通的元素上 代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div v-for="(item,index) in list" :key="index" ref="nnd">{{ item }}</div>
    </div>
</body>
<script src="vue.js"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            list: ["細狗", "八嘎狗", "土狗"]
        },
        mounted() {
            console.log(this.$refs.nnd)
        },
    })
</script>

</html>

效果如下:

 

 ref 加在子組件上 代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 父組件 -->
    <div id="app">
        <div v-for="(item,index) in list" :key="index">{{ item }}</div>
        <!-- 子組件 -->
        <vm-app ref="nnd">
        </vm-app>
    </div>


    <template id="son">
        <div>
            <p ref="xg">你好,修狗!</p>
        </div>
    </template>
</body>
<script src="vue.js"></script>
<script>
    var vmApp = {
        template: '#son',
        data() {
            return {
                message: 'hello world!'
            }
        },
        methods: {
            showMsg() {
                this.$refs.xg.innerHTML = "修狗,你好!"
            }
        }
    }

    var app = new Vue({
        el: '#app',
        //定義組件
        components: {
            vmApp
        },
        data: {
            list: ["細狗", "八嘎狗", "土狗"]
        },
        mounted() {
            this.getElement()
        },
        methods: {
            getElement() {
                console.log(this.$refs.nnd)
                this.$refs.nnd.showMsg()
            }
        },
    })
</script>

</html>

效果如下:

 

vue中父子組件通過ref傳值【dialog組件】、父子傳值

1.父組件中點擊按鈕吊起模態框 dialog 進行內容設置,並傳遞 id 給子組件

this.$nextTick(() => {   //此函數執行時所有的DOM掛載和渲染都已完成
      this.$refs.dialogRef.init(this.fatherId);    //獲取子組件中init方法並將父組件id傳遞給子組件
});

或父組件可以單個向子組件傳值-------------------------------------------------------------------

this.$refs.dialogRef.name1=this.fatherName1;
this.$refs.dialogRef.name2=this.fatherName2;

2.子組件接收 id 並查詢內容詳情

init (val) {
      this.activityId = val   //接收父組件傳遞的id值
}

3.子組件 dialog 內容編輯後將數據通過 $emit 傳遞給父組件

this.$emit("setOverBtn", this.SetForm);   //setOverBtn為父組件接收的方法,將參數傳給父組件

//子組件中可以通過數組的形式向父組件傳遞多個參數

this.$emit("setOverBtn", [this.SetForm1,this.SetForm2]);

4.父組件接收後提交

setOverBtn(data) { //獲取子組件傳來的值
     let params = data
},

父子傳值方法二:

在父組件中子組件模板上使用v-bind綁定傳遞數據,子組件中使用props接收,併在return中定義要改變傳給父組件的屬性

vue2 寫法:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 父組件 -->
    <div id="app">
        <p>早上好,{{ fasDog.dog }} -------- {{ fasDog.date }}</p>
        <!-- 子組件 -->
        <vm-app @re-back-data="backData" :fas-dog="fasDog"></vm-app>

        <p>回來的 -- {{ receiveData }}</p>
    </div>


    <template id="son">
        <div>
            <p>{{ name }}是在{{ time }}年從父組件過來的</p>
            <p>你好,修狗!</p>
            <button v-on:click='select()'>點擊傳值給父組件</button>
        </div>
    </template>
</body>
<script src="vue.js"></script>
<script>
    const vmApp = {
        template: '#son',
        props: {
            fasDog: {
                type: Object,
                // default () {   //dafault可修改傳遞的內容
                //     return {
                //         dog: "細狗兒",
                //         date: "2022"
                //     }
                // }
            }
        },
        data() {
            return {
                name: this.fasDog.dog,
                time: this.fasDog.date
            }
        },
        mounted() {},
        methods: {
            select() {
                this.$emit('re-back-data', {
                    dog: '哈哈',
                    date: '2023'
                });
            }
        }
    }

    var app = new Vue({
        el: '#app',
        //定義組件
        components: {
            vmApp
        },
        data: {
            fasDog: {
                'dog': "耶耶",
                'date': "2023",
            },
            receiveData: {}
        },
        mounted() {},
        methods: {
            backData(data) {
                console.log(data)
                this.receiveData = data
            }
        },
    })
</script>

</html>

效果:

 

 

 

 

下班了下班了

待續。。。。。。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們知道 Flink 有Table(表)、View(視圖)、Function(函數/運算元)、Database(資料庫)的概念,相對於這些耳熟能詳的概念,Flink 里還有一個 Catalog(目錄) 的概念。 本文將為大家帶來 Flink Catalog 的介紹以及 Flink Catalog 在 ...
  • Hadoop簡介安裝 狹義上Hadoop指的是Apache軟體基金會的一款開源軟體用java語言實現,開源允許用戶使用簡單的編程模型實現跨機器集群對海量數據進行分散式計算處理 Hadoop核心組件 Hadoop HDFS(分散式文件存儲系統):解決海量數據存儲 Hadoop YARN(集群資源管理和 ...
  • 摘要:本文主要通過實例講解如何通過gs_cpuwatcher.sh 腳本尋找CPU占用高語句。 本文分享自華為雲社區《GaussDB(DWS) gs_cpuwatcher.sh 腳本如何尋找CPU占用高語句》,作者:fighttingman。 【工具名稱】 gs_cpuwatcher 【功能描述】 ...
  • 為什麼要分庫分表 用戶請求量太大 單伺服器TPS、記憶體、IO都是有上限的,需要將請求打散分佈到多個伺服器 。 單庫數據量太大 單個資料庫處理能力有限;單庫所在伺服器的磁碟空間有限;單庫上的操作IO有瓶頸 。 單表數據量太大 查詢、插入、更新操作都會變慢,在加欄位、加索引、機器遷移都會產生高負載,影響 ...
  • Mysql 01 使用CMD連接資料庫 -- 在控制台連接資料庫(需將位置切換到mysql所在地址) mysql -u root -p password:12345 -- 修改mysql賬戶密碼及許可權,安裝配置完後慎用 update mysql.user set authentication_str ...
  • 前言 不同微信版本,關閉廣告的方式不一樣,今天嘗試關閉微信版本 8.0.33 廣告,但是發現最後還是關不掉,故寫下此文,希望對大家死了關閉廣告這條心! 操作如下 步驟一:點擊設置—>關於微信 步驟二:點擊進入《隱私保護指引》 步驟三:在第一大類中找到 1.34 小類,其中有個藍色字樣《個性化廣告》, ...
  • Flutter 是由 Google 創建的免費開源的移動應用程式開發框架。可以用它為 iOS、Android 和 Web 平臺,開發界面華麗、高性能、響應式的應用程式。Flutter 基於 Dart 編程語言,並使用 Skia 圖形庫來渲染其組件。 和很多其它框架一樣,Flutter 宣稱其主要特性 ...
  • 最近用 TypeScript 寫 npm 包,各種模塊、命名空間、全局定義等等擾得我睡不著覺。我苦心研究,總結了幾個比較冷門的,國內貌似基本上找不到資料的導入導出用法,順便在其中又插入一些不那麼冷門的用法,於是本篇文章來了。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...