Vue組件傳值(父組件使用屬性傳遞給子組件、子組件通過自定義事件傳遞給父組件、同級組件通過共用狀態)

来源:https://www.cnblogs.com/Z-Hyi/archive/2022/08/08/16555003.html
-Advertisement-
Play Games

我們在開發中,會自定義大量的組件,我們應該如何在兩個組件之間進行“值”的傳遞呢? 父子組件傳值 我們使用上一文中App.vue和HelloComp.vue組件來舉例 首先我們還是需要在APP.vue中引入HelloComp.vue <template> <div id="app"> <hello-c ...


我們在開發中,會自定義大量的組件,我們應該如何在兩個組件之間進行“值”的傳遞呢?

父子組件傳值

我們使用上一文中App.vue和HelloComp.vue組件來舉例

首先我們還是需要在APP.vue中引入HelloComp.vue

<template>
  <div id="app">
   <hello-comp></hello-comp>
  </div>
</template>
<script>
import HelloComp from "@/components/HelloComp.vue"
export default {
  components:{
  HelloComp
},
data() {
    return{
      message: "app.Vue data 我是父組件"
    }
  }
}
<style>
</style>

這樣一來,關係就成為了
父組件是APP.vue,子組件是HelloComp.vue

父組件向子組件傳值(屬性)

使用屬性進行傳遞
我們想將App.vue中的message通過HelloComp組件顯示出來,應該怎麼辦呢?

  • 首先在App.vue中的HelloComp標簽自定義一個屬性
    <Hello-comp :msg="message"></Hello-comp>
  • HelloComp組件如何獲取呢?
    需要在HelloComp.vue中的export default中寫上如下,這樣子組件就拿到了父組件的數據
<script>
export default {
  props:['msg']        //父級定義的屬性
}
</script>

一下是父組件向子組件傳遞數據的完整代碼示例:

App.vue

<template>
  <div id="app">
  <Hello-comp :msg="message"></Hello-comp>
  </div>
</template>

<script>
import HelloComp from "@/components/HelloComp.vue"
export default {
  components:{
    HelloComp
},
  data() {
    return{
      message: "app.Vue data 我是父組件"
    }
  }
}
</script>

<style>
</style>

HelloComp.vue

<template>
  <div>
    <h1>{{msg}}</h1>
  </div>
</template>

<script>
export default {
  props:['msg']        //父級定義的屬性
}
</script>
<style>
</style>

頁面呈現效果:
image

子級向父級傳遞數據(使用自定義事件)

通過自定義事件進行傳遞
需求:子組件中有一個按鈕,當我們點擊按鈕時,將子組件中的數據傳遞給父組件,然後在父組件中展示子組件傳遞過來的數據
簡單的說:子組件不能直接改變父組建的值,只能通過調用父組件的自定義事件間接改

  • 在App.vue組件中的HelloComp標簽,綁定一個自定義事件
    myevent就是我們自定義的事件名稱,changeData為methods中定義的事件
    <Hello-comp @myevent="changData" :msg="message"></Hello-comp>
  • 父組件App.vue中,設置一個childDate變數,先給他賦空值,一會兒我們從子集裡面取數據
<template>
  <div id="app">
    <h1>{{childData}}</h1>
  <Hello-comp @myevent="changDate" :msg="message"></Hello-comp>
  </div>
</template>

<script>
import HelloComp from "@/components/HelloComp.vue"
export default {
  components:{
    HelloComp
},
  data() {
    return{
      message: "app.Vue data 我是父組件",
      childData:""
    }
  },
    methods: {
      changDate() {
      }
    }
  }
</script>

<style>
</style>
  • 現在我們來操作HelloComp.vue子組件,我們在子組件裡面寫一個button,定義一個點擊事件
    <button @click="sendData">傳遞數據</button>
  • 然後我們在子組件的data中,定義一個數據,
export default {
  props:['msg'],        //父級定義的屬性
  data ()
  {
    return {
      childData: "I'm Child"
    }
  },
  • 現在我們如何將childData傳送給父組件呢?需要使用this.$emit("父級的方法名",子級要傳的參)方法
 methods: {
    sendData() {
        this.$emit("myevent",this.childData)        //emit方法就可以觸發父級組件的方法
    }
  }

-最後,我們在父組件的methods定義的changDate方法中,就可以取到子組件傳過來的childData,我們在父組件中使用 this.childData=childData來將父組件中的變數複製,這時父組件中就獲得了子組件的值

    methods: {
      changData(childData) {
        this.childData = childData
      } 
    }
  • 最後,我們就可以在父組件中顯示出來
    <h1>{{childData}}</h1>
    以下是在父組件中,點擊按鈕後,就收到子組件的值並顯示出來
    image

完整代碼:
App.vue

<template>
  <div id="app">
    <h1>{{childData}}</h1>
  <Hello-comp @myevent="changData" :msg="message"></Hello-comp>
  </div>
</template>

<script>
import HelloComp from "@/components/HelloComp.vue"
export default {
  components:{
    HelloComp
},
  data() {
    return{
      message: "app.Vue data 我是父組件",
      childData:""
    }
  },
    methods: {
      changData(childData) {            //獲取到的數據為,childData
        this.childData = childData
      }
    }
  }
</script>

<style>
</style>

HelloComp.vue

<template>
  <div>
    <h1>{{msg}}</h1>
    <button @click="sendData">傳遞數據</button>
  </div>
</template>

<script>
export default {
  props:['msg'],        //父級定義的屬性
  data () 
  {
    return {
      childData: "I'm Child"
    }
  },
  methods: {
    sendData() {  
        this.$emit("myevent",this.childData)        //emit方法就可以觸發父級組件的方法
    }
  }
}
</script>
<style>
</style>

非父子集傳遞數據

定義一個共用數據狀態來進行兄弟組件之間的“值”的傳遞

我們創建一個了兩個組件 Brother.vue、Sister.vue,他們兩個是同級的關係,都被引入了App.vue中使用,同時創建一個store.js文件來共用數據狀態

  • 首先,我們創建好組件,併在App.vue中進行引用和註冊
<template>
  <div id="app">
    <BrotherCon></BrotherCon>
    <SisterCon></SisterCon>
  </div>
</template>

<script>
import BrotherCon from "@/components/BrotherCon.vue"
import SisterCon from "@/components/SisterCon.vue"
export default {
  components:{
    BrotherCon,
    SisterCon
},
  data() {
    return{
      
    }
  }
  }
</script>

<style>
</style>

  • 創建store.js
export default {
    //狀態
    state: {
        message:"hello vue"
    },
    setStateMessage(str) {
        this.state.message = str
    }
}
  • 在Brother.vue、Sister.vue引用store.js文件,就可以直接獲取數據了
    Brother.vue
    <div>
        <h1>Brother</h1>
        <!-- 這裡的state其實就是下麵data中的store.state -->
        <p>{{state.message}}</p>    
    </div>
</template>
<script>
import store from "../store"
export default {
    data() {
        return {
            state:store.state
        }
    }
}
</script>

Sister.vue

<template>
    <div>
        <h1>Sister</h1>
        <!-- 這裡的state其實就是下麵data中的store.state -->
        <p>{{state.message}}</p>    
    </div>
</template>

<script>
import store from "../store"
export default {
    data() {
        return {
            state:store.state
        }
    }
}
</script>

在App.vue中引用並註冊

<template>
  <div id="app">
    <BrotherCon></BrotherCon>
    <SisterCon></SisterCon>
  </div>
</template>

<script>
import BrotherCon from "@/components/BrotherCon.vue"
import SisterCon from "@/components/SisterCon.vue"
export default {
  components:{
    BrotherCon,
    SisterCon
},
  data() {
    return{
      
    }
  }
  }
</script>
<style>
</style>

結果展示
image

  • 傳遞事件,比如在Brother中點擊一個按鈕,就可以改變sister中的數據

我們在Brother添加一個按鈕,並定義事件,點擊後改變他們共用的store中的state.message中的值

<template>
    <div>
        <h1>Brother</h1>
        <!-- 這裡的state其實就是下麵data中的store.state -->
        <p>{{state.message}}</p>    
        <button @click="changDate">改變數據</button>
    </div>
</template>

<script>
import store from "../store"
export default {
    data() {
        return {
            state:store.state
        }
    },
    methods: {
        changeDate(){
            store.setStateMessage("brother data") //這裡的store值得就是我們引入的那個
        }
    } 
}
</script>

展示效果:
image


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

-Advertisement-
Play Games
更多相關文章
  • 前言: 在iOS中,使用引用計數來管理OC對象記憶體 一個新創建的OC對象引用計數預設是1,當引用計數減為0,OC對象就會銷毀,釋放其占用的記憶體空間。 調用retain會讓OC對象的引用計數+1,調用release會讓OC對象的引用計數-1。 記憶體管理的經驗總結 當調用alloc、new、copy、m ...
  • HMS Core分析服務智能運營6.5.1版本上線,三大“更”新,助力開發者提升運營體驗。 1、活動效果更前置:支持受眾預估,提前判斷活動效果; 2、活動流程更規範:新增活動審核功能,規範運營節奏及活動內容; 3、活動創建更便捷:支持同步活動文案數據,一鍵帶入歷史文案;流程畫布增加滑鼠懸浮詳情展示, ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .box1 { width: 200px; height: 200px; background-color: bl ...
  • 插槽就是子組件中的提供給父組件使用的一個占位符,用<slot></slot> 表示,父組件可以在這個占位符中填充任何模板代碼,如 HTML、組件等,填充的內容會替換子組件的<slot></slot>標簽。 1 匿名插槽 (1) 在子組件放置一個插槽,mytest.vue <template> <di ...
  • 在頁面載入時,主動執行某些程式。 模擬場景:當頁面載入完成之後,像是後臺載入數據 new Vue()就是初始化一個Vue實例。 Vue實例額生命周期鉤子(函數):每個Vue實例在被創建時(new Vue)都要經過一系列的初始化過程 例如:created() 組件初始化完成 mouted() 模板已創 ...
  • 計算屬性(computed) date屬性和computed屬性定義的值都可以直接綁定在表達式中,如果某些值需要通過計算才能得到,那使用計算屬性就再合適不過了 如果頁面中需要顯示的值是兩個表達式計算才能得到,並且還有一些比較複雜的邏輯關係,我們寫在頁面上就不太合適了 如果我們直接在頁面上是這樣的: ...
  • 在之前我們已經使用用 / 來進行計算,但如下情況不一樣 例如 p{ font: 16px/30px Arial, Helvetica, sans-serif; } 如果需要使用變數,同時又要確保 / 不做除法運算,而是完整地編譯到 CSS 文件中,這種情況怎麼辦???可以使用 #{} 插值語句將變數 ...
  • ElementUI table無縫迴圈滾動 恰好實習的時候遇到了這個需求,而且網上的代碼有點僵硬,所以我改了改,順手水一篇博客出來。 部分思路來源:https://blog.csdn.net/qq_38543537/article/details/122842943 但是來源的代碼,在滾動到底部時會 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...