vue3利用v-model實(shí)現(xiàn)父子組件之間數(shù)據(jù)同步的代碼詳解
前言
作為現(xiàn)代前端開發(fā)中的重要框架之一,Vue.js
一直致力于提供更加方便、高效的數(shù)據(jù)管理方式。在Vue 3
中,v-model
這一指令也得到了升級(jí),使得父子組件之間的數(shù)據(jù)同步變得更加容易和靈活。本文將探討一下Vue 3
中如何利用v-model
來實(shí)現(xiàn)父子組件之間的數(shù)據(jù)同步
一、v-model實(shí)現(xiàn)父子組件之間的數(shù)據(jù)同步
在Vue 3中,可以在<script setup>中使用defineEmits和defineProps來定義props和event。使用v-model時(shí)需要定義一個(gè)名為modelValue的prop和一個(gè)update:modelValue的event,代碼示例如下:
- 子組件
<template> <div> <h3>子組件</h3> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </div> </template> <script setup> import { defineProps, defineEmits } from 'vue' const props = defineProps({ modelValue: { type: String, default: '' } }) const emits = defineEmits(['update:modelValue']) </script>
在父組件中使用v-model時(shí),可以通過v-model:propName
綁定子組件的modelValue
prop和update:modelValue
event。代碼示例如下:
- 父組件
<template> <div> <h3>父組件</h3> <ChildComponent v-model:modelValue="message" /> <p>子組件輸入的內(nèi)容:{{ message }}</p> </div> </template> <script setup> import ChildComponent from './ChildComponent.vue' let message = '' </script>
原理是,在子組件中,v-model會(huì)將modelValue
prop和update:modelValue
event綁定在一起,當(dāng)子組件的input事件觸發(fā)時(shí)會(huì)emit一個(gè)update:modelValue
event,從而更新父組件的message
。而在父組件中,v-model會(huì)將message
與modelValue
prop和update:modelValue
event綁定在一起,當(dāng)父組件更新message
時(shí),會(huì)通過modelValue
prop將message
傳遞給子組件,在子組件中輸入內(nèi)容時(shí),會(huì)通過update:modelValue
event將新的內(nèi)容傳遞給父組件更新message
。這樣就實(shí)現(xiàn)了父子組件之間的數(shù)據(jù)同步。
其中, v-model
相當(dāng)于以下代碼:
<template> <ChildComponent :modelValue="message" @update:modelValue="val => message= val"></Child> </template>
這樣就可以在父組件和子組件之間實(shí)現(xiàn)雙向數(shù)據(jù)綁定。當(dāng)子組件的值發(fā)生變化時(shí),會(huì)觸發(fā) update 事件傳遞給父組件,父組件接收到事件后會(huì)更新自己的值并重新渲染子組件。當(dāng)父組件的值發(fā)生變化時(shí),會(huì)通過 value prop 傳遞給子組件,子組件接收到 prop 后會(huì)更新自己的值并重新渲染。
二、v-model綁定多個(gè)值
1. 通過對(duì)象的方式
在Vue3的<script setup>
中,可以使用v-model
指令實(shí)現(xiàn)父子組件之間的雙向數(shù)據(jù)綁定。如果需要同時(shí)綁定多個(gè)值,可以使用一個(gè)對(duì)象來存儲(chǔ)這些值,然后在子組件中使用$emit
方法將這個(gè)對(duì)象作為參數(shù)傳遞給父組件。
舉個(gè)例子,假設(shè)有一個(gè)父組件Parent
和一個(gè)子組件Child
,需要同時(shí)綁定一個(gè)名字和年齡??梢栽诟附M件中定義一個(gè)對(duì)象person
,然后使用v-model
指令來綁定它:
<template> <Child v-model="person"/> </template> <script setup> import Child from './Child.vue' const person = { name: 'John', age: 20 } </script>
在子組件中,可以通過props
接收父組件傳遞過來的person
對(duì)象,并在模板中使用v-model
指令將每個(gè)屬性與輸入框綁定:
<template> <div> <label>Name:</label> <input v-model="person.name"> <label>Age:</label> <input v-model="person.age"> </div> </template> <script setup> props: { modelValue: Object } const person = ref(modelValue) watchEffect(() => { emit('update:modelValue', person.value) }) </script>
注意,在子組件中需要使用props
來接收modelValue
,這是v-model
指令默認(rèn)傳遞的值。然后將這個(gè)對(duì)象轉(zhuǎn)換為響應(yīng)式對(duì)象,并使用watchEffect
函數(shù)監(jiān)聽它的變化。調(diào)用emit('update:modelValue', person.value)
時(shí)會(huì)將新的person
對(duì)象作為參數(shù)傳遞給Parent
組件。Parent
組件會(huì)自動(dòng)將其更新到person
屬性中。
通過這種方式,可以同時(shí)綁定多個(gè)值,并實(shí)現(xiàn)父子組件之間的雙向數(shù)據(jù)綁定。
2. 使用多個(gè)v-model
在子組件中,可以使用$emit()
方法將綁定的值發(fā)送到父組件中,從而實(shí)現(xiàn)父子組件之間的雙向數(shù)據(jù)綁定。具體操作可以參考以下代碼示例:
父組件中使用方式:
<template> <h1>父組件中顯示v-model{{pageNo}}{{pageSize}}</h1> <Child v-model:pageNo="pageNo" v-model:pageSize="pageSize"></Child> </template> <script setup> import {ref} from 'vue' //父親的數(shù)據(jù) let pageNo = ref(1); let pageSize = ref(3); </script>
子組件中的代碼示例:
<template> <div> <p>當(dāng)前頁數(shù): {{ pageNo }}</p> <p>每頁數(shù)量: {{ pageSize }}</p> <button @click="increasePageNo">增加頁數(shù)</button> <button @click="increasePageSize">增加每頁數(shù)量</button> </div> </template> <script setup> let props = defineProps(["pageNo", "pageSize"]); let $emit = defineEmits(["update:pageNo", "update:pageSize"]); const increasePageNo = () => { const increasedPageNo = parseInt(pageNo) + 1 $emit('update:pageNo', increasedPageNo) } const increasePageSize = () => { const increasedPageSize = parseInt(pageSize) + 1 $emit('update:pageSize', increasedPageSize) } </script>
在子組件中,使用defineEmits()
函數(shù)定義了兩個(gè)事件,分別是update:pageNo
和update:pageSize
,用來在父組件中更新pageNo
和pageSize
的值。同時(shí),也定義了兩個(gè)方法increasePageNo
和increasePageSize
,用來修改當(dāng)前頁數(shù)和每頁數(shù)量。
在方法中,使用$emit()
方法觸發(fā)對(duì)應(yīng)的事件,傳遞修改后的值。父組件通過v-model
綁定子組件中的屬性,當(dāng)子組件修改值時(shí),會(huì)觸發(fā)相應(yīng)的事件,從而更新父組件中對(duì)應(yīng)的值。
三、總結(jié)
在Vue3
中,通過v-model
我們可以方便地實(shí)現(xiàn)父子組件之間的數(shù)據(jù)雙向綁定。在使用過程中,需要注意v-mode
的本質(zhì)是語法糖,實(shí)際上是通過props
和emit
來實(shí)現(xiàn)數(shù)據(jù)傳遞和事件的觸發(fā)。此外,我們還可以通過.sync
修飾符和自定義事件來實(shí)現(xiàn)類似于v-model
的效果??傊?,利用v-model
實(shí)現(xiàn)父子組件之間的數(shù)據(jù)同步是Vue3
中一個(gè)非常實(shí)用且易于上手的特性,值得我們?cè)趯?shí)際項(xiàng)目開發(fā)中多加利用。
以上就是vue3利用v-model實(shí)現(xiàn)父子組件之間數(shù)據(jù)同步的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于vue3 v-model父子組件數(shù)據(jù)同步的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- vue 2 實(shí)現(xiàn)自定義組件一到多個(gè)v-model雙向數(shù)據(jù)綁定的方法(最新推薦)
- vue3?中v-model語法糖示例詳解
- Vue3?使用v-model實(shí)現(xiàn)父子組件通信的方法(常用在組件封裝規(guī)范中)
- vue3的組件通信&v-model使用實(shí)例詳解
- Vue3.4中v-model雙向數(shù)據(jù)綁定新玩法詳解
- Vue3中v-model語法糖的三種寫法詳解
- vue3+Element?Plus?v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步的案例代碼
- vue3組件的v-model:value與v-model的區(qū)別解析
相關(guān)文章
vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例
今天小編就為大家分享一篇vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08關(guān)于vxe-table復(fù)選框翻頁選中問題及解決
這篇文章主要介紹了關(guān)于vxe-table復(fù)選框翻頁選中問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue實(shí)現(xiàn)三級(jí)頁面跳轉(zhuǎn)功能
這篇文章主要介紹了vue實(shí)現(xiàn)三級(jí)頁面跳轉(zhuǎn)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05vue-awesome-swiper 基于vue實(shí)現(xiàn)h5滑動(dòng)翻頁效果【推薦】
說到h5的翻頁,很定第一時(shí)間想到的是swiper。但是我當(dāng)時(shí)想到的卻是,vue里邊怎么用swiper。這篇文章主要介紹了vue-awesome-swiper - 基于vue實(shí)現(xiàn)h5滑動(dòng)翻頁效果 ,需要的朋友可以參考下2018-11-11基于Vue3實(shí)現(xiàn)一個(gè)小相冊(cè)詳解
這篇文章主要為大家詳細(xì)介紹了如何基于Vue3實(shí)現(xiàn)一個(gè)小相冊(cè)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12