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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...