Vue3.0父子組件傳值詳解

一、Vue父子組件傳值屬性

在Vue中,父組件向子組件傳值是一種很基礎的要求,下面我們來看一個簡單的例子,通過props屬性實現父組件向子組件傳遞數據:

// Parent.vue
<template>
  <Child :message="hello"></Child>
</template>
<script>
  import Child from './Child.vue'
  export default {
    name: 'Parent',
    components: {
      Child
    },
    data() {
      return {
        hello: 'Hello, child!'
      }
    }
  }
</script>

// Child.vue
<template>
  <div>{{ message }}</div>
</template>
<script>
  export default {
    name: 'Child',
    props: {
      message: String
    }
  }
</script>

上述代碼中,我們在父組件中定義了一個名為hello的數據,並將其通過:綁定到子組件的message屬性上。在子組件中,我們通過props屬性定義了一個名為message的屬性,並指定其類型為String。

需要注意的是,在Vue中,使用props屬性定義的屬性都是單向綁定的,也就是說,當父組件更新了這個屬性的值時,子組件的值也會更新,但是反過來是不行的。如果需要實現雙向數據綁定,需要使用v-model指令或者自定義事件。

二、Vue父組件向子組件傳值

在Vue3.0中,父組件向子組件傳值的方法與Vue2.x相同,可以使用props屬性來實現。

三、Vue子傳父組件傳值

1、通過$emit自定義事件

在Vue中,子組件向父組件傳值可以通過自定義事件實現。具體步驟如下:

  1. 在子組件中,通過$emit方法觸發一個自定義事件,並將需要傳遞的數據作為參數傳入。
  2. 在父組件中,通過v-on指令監聽子組件觸發的自定義事件,同時在事件處理函數中獲取子組件傳遞的數據。

下面我們來看一個簡單的例子:

// Parent.vue
<template>
  <div>
    <Child @myEvent="handleMyEvent"></Child>
    <p>{{ message }}</p>
  </div>
</template>
<script>
  import Child from './Child.vue'
  export default {
    name: 'Parent',
    components: {
      Child
    },
    data() {
      return {
        message: ''
      }
    },
    methods: {
      handleMyEvent(data) {
        this.message = data
      }
    }
  }
</script>

// Child.vue
<template>
  <div>
    <button @click="$emit('myEvent', 'Hello, parent!')">傳遞數據給父組件</button>
  </div>
</template>
<script>
  export default {
    name: 'Child'
  }
</script>

上述代碼中,我們在子組件中定義了一個名為myEvent的自定義事件,並在點擊按鈕時通過$emit方法觸發了這個事件,並將字元串’Hello, parent!’作為參數傳遞給了父組件。在父組件中,我們通過v-on指令監聽了子組件觸發的myEvent事件,同時在事件處理函數handleMyEvent中獲取了子組件傳遞的數據,並將其賦值給了message。

2、通過$attrs和$listeners實現

在Vue3.0中,除了使用$emit方法觸發自定義事件,還可以通過$attrs和$listeners來實現子組件向父組件傳遞數據。

$attrs是一個包含了父作用域中不作為prop被識別(且獲取)的特性綁定(class和style除外)的對象。當一個組件沒有聲明任何prop時,這裡會包含所有父作用域的綁定(class和style除外),並且可以通過v-bind=”$attrs”傳遞給一個內部組件。例如:

// Parent.vue
<template>
  <div>
    <Child v-bind="$attrs" v-on="$listeners"></Child>
    <p>{{ message }}</p>
  </div>
</template>
<script>
  import Child from './Child.vue'
  export default {
    name: 'Parent',
    components: {
      Child
    },
    data() {
      return {
        message: ''
      }
    },
    methods: {
      handleMyEvent(data) {
        this.message = data
      }
    }
  }
</script>

// Child.vue
<template>
  <div>
    <button @click="$emit('myEvent', 'Hello, parent!')">傳遞數據給父組件</button>
  </div>
</template>
<script>
  export default {
    name: 'Child'
  }
</script>

上述代碼中,我們在子組件中定義了一個名為myEvent的自定義事件,並在點擊按鈕時通過$emit方法觸發了這個事件,並將字元串’Hello, parent!’作為參數傳遞給了父組件。在父組件中,我們通過v-on指令監聽了子組件觸發的myEvent事件,同時在事件處理函數handleMyEvent中獲取了子組件傳遞的數據,並將其賦值給了message。

四、Vuex子組件向父組件能傳值

在Vue中,除了使用自定義事件或者$attrs和$listeners來實現子組件向父組件傳遞數據之外,還可以使用Vuex來實現這個功能。

Vuex是一個專為Vue.js應用程序開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,包括state、getters、mutations和actions等,使得不同組件之間可以共享狀態,從而實現更加有效的通信和協作。

下面我們來看一個簡單的例子,使用Vuex實現子組件向父組件傳遞數據:

// store.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message
    }
  }
})

// App.vue
<template>
  <div>
    <Child />
    <p>{{ message }}</p>
  </div>
</template>
<script>
  import Child from './Child.vue'
  import store from './store'
  
  export default {
    name: 'App',
    components: {
      Child
    },
    computed: {
      message() {
        return store.state.message
      }
    }
  }
</script>

// Child.vue
<template>
  <div>
    <button @click="setMessage">傳遞數據給父組件</button>
  </div>
</template>
<script>
  import store from './store'
  
  export default {
    name: 'Child',
    methods: {
      setMessage() {
        store.commit('setMessage', 'Hello, parent!')
      }
    }
  }
</script>

上述代碼中,我們首先創建了一個名為store的Vuex Store實例,並定義了一個名為message的狀態。在父組件中,我們通過computed屬性定義了一個名為message的計算屬性,並在模板中使用它來顯示message的值。在子組件中,我們通過import引入了store,然後在點擊按鈕時通過commit方法觸發了一個mutations,從而實現了修改message的值的功能。

五、Vue3父子組件傳值

在Vue3.0中,父子組件傳值的原理與Vue2.x是相同的,但是在語法上有所變化。需要注意的是,在Vue3.0中,props屬性的寫法與Vue2.x是不同的。

在Vue3.0中,我們可以使用defineProps函數來定義子組件的props屬性:

// Child.vue
<template>
  <div>{{ message }}</div>
</template>
<script>
  import { defineProps } from 'vue'
  
  export default {
    name: 'Child',
    setup(props) {
      const { message } = defineProps({
        message: String
      })
      
      return { message }
    }
  }
</script>

// Parent.vue
<template>
  <Child :message="hello"></Child>
</template>
<script>
  import Child from './Child.vue'
  
  export default {
    name: 'Parent',
    components: {
      Child
    },
    data() {
      return {
        hello: 'Hello, child!'
      }
    }
  }
</script>

上述代碼中,我們在子組件中使用defineProps函數來定義了一個名為message的屬性,並指定了它的類型為String。在父組件中,我們通過:綁定的方式將hello數據傳遞給子組件的message屬性。

需要注意的是,在Vue3.0中,props屬性是不可變的,也就是說,如果你嘗試在子組件中修改props屬性的值,程序會報錯。如果需要在子組件中修改父組件的數據,應該使用$emit方法觸發自定義事件或者通過Vuex實現。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249339.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:11
下一篇 2024-12-12 17:11

相關推薦

  • 如何修改ant組件的動效為中心

    當我們使用Ant Design時,其默認的組件動效可能不一定符合我們的需求,這時我們需要修改Ant Design組件動效,使其更加符合我們的UI設計。本文將從多個方面詳細闡述如何修…

    編程 2025-04-29
  • Ant Design組件的動效

    Ant Design是一個基於React技術棧的UI組件庫,其中動效是該組件庫中的一個重要特性之一。動效的使用可以讓用戶更清晰、更直觀地了解到UI交互的狀態變化,從而提高用戶的滿意…

    編程 2025-04-29
  • 用mdjs打造高效可復用的Web組件

    本文介紹了一個全能的編程開發工程師如何使用mdjs來打造高效可復用的Web組件。我們將會從多個方面對mdjs做詳細的闡述,讓您輕鬆學習並掌握mdjs的使用。 一、mdjs簡介 md…

    編程 2025-04-27
  • Spring MVC主要組件

    Spring MVC是一個基於Java語言的Web框架,是Spring Framework的一部分。它提供了用於構建Web應用程序的基本架構,通過與其他Spring框架組件集成,使…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論