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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...