最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中實現(xiàn)父子組件雙向數(shù)據(jù)流的三種方案分享

 更新時間:2023年08月04日 10:46:23   作者:FEF前端團隊  
通常情況下,父子組件的通信都是單向的,或父組件使用props向子組件傳遞數(shù)據(jù),或子組件使用emit函數(shù)向父組件傳遞數(shù)據(jù),本文將嘗試講解Vue中常用的幾種雙向數(shù)據(jù)流的使用,需要的朋友可以參考下

1. 背景

通常情況下,父子組件的通信都是單向的,或父組件使用props向子組件傳遞數(shù)據(jù),或子組件使用emit函數(shù)向父組件傳遞數(shù)據(jù)。

但在有些場景下,免不了需要父子組件之間進行雙向數(shù)據(jù)流,從而讓我們的業(yè)務(wù)代碼更加簡潔。很常見的場景之一:父組件引入了一個子組件,子組件是個dialog彈窗,在父組件可以點擊某個按鈕顯示dialog,但是dialog組件的關(guān)閉操作是在組件里面的。這個時候使用雙向數(shù)據(jù)流管理dialog組件的顯隱狀態(tài),不僅讓代碼顯得優(yōu)雅,還能少寫不少業(yè)務(wù)。

那我們能不能直接在子組件修改props來實現(xiàn)上述功能呢?當然是不行的,因為在Vueprops屬性是只讀的。官方文檔給出的解釋如下:

所有的 props 都遵循著單向綁定原則,props 因父組件的更新而變化,自然地將新的狀態(tài)向下流往子組件,而不會逆向傳遞。這避免了子組件意外修改父組件的狀態(tài)的情況,不然應(yīng)用的數(shù)據(jù)流將很容易變得混亂而難以理解。本文將嘗試講解Vue中常用的幾種雙向數(shù)據(jù)流的使用。

2. 雙向數(shù)據(jù)流

2.1. 什么是雙向數(shù)據(jù)流

簡而言之,雙向數(shù)據(jù)流就是model的更新會觸發(fā)view的更新,view的更新會觸發(fā)model的更新,它們的作用是相互的。

tips: 這里只討論父子組件傳值時的雙向數(shù)據(jù)流,對框架數(shù)據(jù)的雙向數(shù)據(jù)流不做展開。

2.2. Vue提供的解決方案

2.2.1. 方案一:v-model

父組件代碼如下:

<template>
  <div class="container">
    <a-button type="primary" @click="handleClick">改變子組件的狀態(tài)</a-button>
    <p>父組件狀態(tài):{{ message }}</p>
    <!-- 子組件 -->
    <child-view v-model="message"></child-view>
		<!-- 也可以使用多個v-model,子組件里面用props正常接收就可以了 -->
		<!-- <child-view v-model:message="message" v-model:msg="msg"></child-view> -->
  </div>
</template>
<script>
import ChildView from '@/components/ChildView.vue'
export default {
  name: 'HomeView',
  components: {
    ChildView
  },
  data () {
    return {
      message: ''
    }
  },
  methods: {
    handleClick () {
      this.message = '我是用v-model修改的狀態(tài)'
    }
  }
}
</script>

子組件代碼如下:

<template>
  <div>
    <a-button type="primary" @click="handleClick">改變父組件的狀態(tài)</a-button>
    <p>子組件狀態(tài):{{ value }}</p>
  </div>
</template>
<script>
export default {
  props: {
    // 這里框架默認屬性名就是value
    value: {
      type: String,
      default: ''
    },
    // 接收多個props
    message: {
      type: String,
      default: ''
    },
    msg: {
      type: String,
      default: ''
    }
  },
  methods: {
    handleClick () {
      // 這里框架默認事件名就是input
      // 發(fā)送的數(shù)據(jù)會被父級v-model="message"接收到,再被value=message傳回來
      this.$emit('input', '我是在子組件里面修改父組件v-model的值')
    }
  }
}
</script>

自定義v-modelprops屬性:

Vue 允許一個自定義組件在使用 v-model 時定制 prop 和 event。默認情況下,一個組件上的 v-model 會把 value 用作 prop 且把 input 用作 event,但是一些輸入類型比如單選框和復(fù)選框按鈕可能想使用 value prop 來達到不同的目的。使用 model 選項可以回避這些情況產(chǎn)生的沖突。

<template>
  <div>
    <a-button type="primary" @click="handleClick">改變父組件的狀態(tài)</a-button>
    <p>子組件狀態(tài):{{ msg }}</p>
  </div>
</template>
<script>
export default {
  // 自定義prop名稱和事件
  model: {
    prop: 'msg',
    event: 'update'
  },
  props: {
    msg: {
      type: String,
      default: ''
    }
  },
  methods: {
    handleClick () {
      this.$emit('update', '我是在子組件里面修改父組件v-model的值')
    }
  }
}
</script>

瀏覽器運行效果:

2.2.2. 方案二:sync修飾符

父組件代碼如下:

<template>
  <div class="container">
    <a-button type="primary" @click="handleClick">改變子組件的狀態(tài)</a-button>
    <p>父組件狀態(tài):{{ message }}</p>
    <child-view :msg.sync="message"></child-view>
  </div>
</template>
<script>
import ChildView from '@/components/ChildView.vue'
export default {
  name: 'HomeView',
  components: {
    ChildView
  },
  data () {
    return {
      message: ''
    }
  },
  methods: {
    handleClick () {
      this.message = '十里平湖霜滿天'
    }
  }
}
</script>

子組件代碼如下:

<template>
  <div>
    <a-button type="primary" @click="handleClick">改變父組件的狀態(tài)</a-button>
    <p>子組件狀態(tài):{{ msg }}</p>
  </div>
</template>
<script>
export default {
  props: {
    msg: String
  },
  methods: {
    handleClick () {
      this.$emit('update:msg', '寸寸青絲愁華年')
    }
  }
}
</script>

瀏覽器運行效果:

2.2.3. 方案三:通過JS引用類型特性繞過props

父組件代碼如下:

<template>
  <div class="container">
    <a-button type="primary" @click="handleClick">改變子組件的狀態(tài)</a-button>
    <p>父組件狀態(tài):{{ config.message }}</p>
    <child-view :config="config"></child-view>
  </div>
</template>
<script>
import ChildView from '@/components/ChildView.vue'
export default {
  name: 'HomeView',
  components: {
    ChildView
  },
  data () {
    return {
      config: {
        message: ''
      }
    }
  },
  methods: {
    handleClick () {
      this.config.message = '我是用v-model修改的狀態(tài)'
    }
  }
}
</script>

子組件代碼如下:

通過JS引用類型特性繞過props

運行效果和v-model一樣,這里就不貼圖了。

3. 總結(jié)

Vue父子組件通信,都是單向的,在需要雙向通信的時候,我們有三種方式達到目的:

  1. 使用v-model
  2. 使用sync修飾符
  3. 通過JS引用類型特性繞過props單向數(shù)據(jù)流

以上就是Vue中實現(xiàn)父子組件雙向數(shù)據(jù)流的三種方案分享的詳細內(nèi)容,更多關(guān)于Vue實現(xiàn)父子組件雙向數(shù)據(jù)流的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3使用canvas的詳細指南

    vue3使用canvas的詳細指南

    這篇文章主要給大家介紹了關(guān)于vue3使用canvas的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用vue3具有一定的參考學習價值,需要的朋友可以參考下
    2023-04-04
  • 在Vue3中創(chuàng)建和使用自定義指令的實現(xiàn)方式

    在Vue3中創(chuàng)建和使用自定義指令的實現(xiàn)方式

    在現(xiàn)代前端開發(fā)中,Vue.js 是一個非常流行的框架,它提供了許多強大的功能來幫助開發(fā)者構(gòu)建高效的用戶界面,自定義指令是 Vue.js 的一個重要特性,它允許開發(fā)者擴展 HTML 元素的功能,本文將詳細介紹如何在 Vue3 中創(chuàng)建和使用自定義指令,并提供示例代碼來幫助理解
    2024-12-12
  • vue配置文件實現(xiàn)代理v2版本的方法

    vue配置文件實現(xiàn)代理v2版本的方法

    這篇文章主要介紹了vue配置文件實現(xiàn)代理v2版本的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • 前端vue3使用SSE、EventSource攜帶請求頭實例代碼

    前端vue3使用SSE、EventSource攜帶請求頭實例代碼

    這篇文章主要介紹了前端vue3使用SSE、EventSource攜帶請求頭的相關(guān)資料,SSE是基于HTTP的服務(wù)器向客戶端推送數(shù)據(jù)技術(shù),實現(xiàn)單向?qū)崟r通信,輕量級且支持跨域、自動重連,文中將實現(xiàn)的方法介紹的非常詳細,需要的朋友可以參考下
    2025-06-06
  • 如何在 Vue 表單中處理圖片

    如何在 Vue 表單中處理圖片

    這篇文章主要介紹了如何在 Vue 表單中處理圖片,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • vue實現(xiàn)列表拖拽排序的功能

    vue實現(xiàn)列表拖拽排序的功能

    這篇文章主要介紹了vue實現(xiàn)列表拖拽排序的功能,幫助大家更好的理解和學習vue,感興趣的朋友可以了解下
    2020-11-11
  • Vue3 keep-alive用法及說明

    Vue3 keep-alive用法及說明

    這篇文章主要介紹了Vue3 keep-alive用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • 詳解vue-cli@2.x項目遷移日志

    詳解vue-cli@2.x項目遷移日志

    這篇文章主要介紹了詳解vue-cli@2.x項目遷移日志,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • vue項目登錄頁面實現(xiàn)記住用戶名和密碼的示例代碼

    vue項目登錄頁面實現(xiàn)記住用戶名和密碼的示例代碼

    本文主要介紹了vue項目登錄頁面實現(xiàn)記住用戶名和密碼的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • WebStorm無法正確識別Vue3組合式API的解決方案

    WebStorm無法正確識別Vue3組合式API的解決方案

    這篇文章主要介紹了WebStorm無法正確識別Vue3組合式API的解決方案,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下
    2021-02-02

最新評論

张家川| 会同县| 凯里市| 榆中县| 蒲城县| 遵义县| 米泉市| 盐池县| 资溪县| 青河县| 忻城县| 西宁市| 兴山县| 同仁县| 和龙市| 贵港市| 石柱| 巧家县| 河西区| 望城县| 庄浪县| 昌图县| 敦化市| 钦州市| 新宁县| 思茅市| 郁南县| 祁连县| 海原县| 长宁县| 裕民县| 离岛区| 平乡县| 岐山县| 介休市| 肥东县| 五河县| 新闻| 伊通| 江油市| 苗栗市|