溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

修飾符v-model與.sync有哪些區(qū)別

發(fā)布時(shí)間:2022-07-12 09:21:42 來源:億速云 閱讀:332 作者:iii 欄目:編程語言

這篇文章主要講解了“修飾符v-model與.sync有哪些區(qū)別”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“修飾符v-model與.sync有哪些區(qū)別”吧!

修飾符v-model與.sync有哪些區(qū)別

一、v-model

1. 作用

相信過使用過vue框架的朋友對這個(gè)指令不會(huì)感到陌生,v-model是用來進(jìn)行<input>、<textarea>、<select>元素上數(shù)據(jù)的雙向綁定的。

例如:

<template>
    <div >
        <input v-model="value" type="text"/>    //這里的v-model里面的value可以直接獲取到用戶的輸入值
    </div>
</template>

<script>

export default {
    components: {},
    data() {
        return {
            value:"",    //這里定義的value變量可以直接將上面獲取到的值進(jìn)行操作
        };
      }, 
    }
</script>
<style  scoped>

</style>

當(dāng)我們在input框里輸入了某個(gè)值的時(shí)候,下面data里的value就可以直接后去到我們輸入的值,而不需要操作dom元素進(jìn)行獲取。

1. 本質(zhì)

v-model本質(zhì)上來說是一個(gè)語法糖,我們習(xí)慣性的寫法是這樣的:

 <input v-model="value" type="text"/>

但是實(shí)際上完整的寫法是這樣的:

<input :value="value" @input="value=$event.target.value" type="text" />

通過對比語法糖和原始寫法可以得出: 再給<input/>元素添加v-model屬性時(shí),默認(rèn)會(huì)把value作為元素的屬性,然后把input事件作為實(shí)時(shí)傳遞value的觸發(fā)事件。

注意:不是所有能進(jìn)行雙向數(shù)據(jù)綁定的元素都是input事件!

3、特殊用法

一般情況下,我們使用v-model主要是用于數(shù)據(jù)的雙向綁定,可以十分方便的獲取到用戶輸入的值,但在某些特殊情況下,我們也可以將v-model用于父子組件之間數(shù)據(jù)的雙向綁定。

<template>
    <div class="father">
        <Son v-model="str"/>
    </div>
</template>

<script>

import Son from '@/components/Son.vue';    //引入子組件

export default {
    components: {Son},
    data() {
        return {
            str:"father"
        };
      },
    }
</script>

這里定義了一個(gè)father組件和son組件,并且將son組件引入到father組件中,給son組件綁定了v-model進(jìn)行了傳值。此時(shí)我們需要在son組件中接收并使用這個(gè)值:

<template>
    <div class="son">
        我是在son組件里接收到的值:{{value}}
    </div>
</template>
<script>
export default {
    components: {},
    props:{
        value:{
            type:String,
        },
      },
    }
</script>

注意:這里接受的值必須是value,寫成其他名字將會(huì)報(bào)錯(cuò)!

父組件向子組件傳值,子組件中是不能直接修修改數(shù)據(jù)的,直接修改的話就會(huì)報(bào)錯(cuò)

修飾符v-model與.sync有哪些區(qū)別

當(dāng)我們需要修改這個(gè)值時(shí),就需要再將其傳入到父組件中修改。

這就需要在父組件中的子組件上定義一個(gè)自定義事件,通過子組件$emit('自定義事件名稱','值')的方法將值傳入父組件。

但是在這里我們不能使用自定義事件,因?yàn)槲覀冇玫氖莢-model傳值,所以我們只能使用input事件進(jìn)行修改。

子組件中使用$emit()方法.調(diào)用父組件中的事件,并且進(jìn)行傳值

<template>
    <div class="son">
        我是在son組件里接收到的值:{{value}}
        <button @click="handleClick">click</button>
    </div>
</template>

<script>
export default {
    components: {},
    data() {
        return {
            str:'son'
        };
    },
    props:{
        value:{
            type:String,
        },
    },
    methods: {
        handleClick(){
            this.$emit('input',this.str)
        }
    },
    }
</script>

這樣就完成父子組件之間的數(shù)據(jù)雙向綁定效果

二、.sync修飾符

1、作用

.sync修飾符可以實(shí)現(xiàn)父子組件之間的雙向綁定,并且可以實(shí)現(xiàn)子組件同步修改父組件的值,相比較與v-model來說,sync修飾符就簡單很多了:

2、本質(zhì)

    //正常父傳子
    <Son :a="num" />
    
    //加上sync之后的父傳子
    <Son :a.sync="num" />
    
    //它等價(jià)于
    <Son :a="num" @update:a="val=>a=val" />
    
    //相當(dāng)于多了一個(gè)事件監(jiān)聽,事件名是update:a,
    //回調(diào)函數(shù)中,會(huì)把接收到的值賦值給屬性綁定的數(shù)據(jù)項(xiàng)中。

這里面的傳值與接收和正常的父組件向子組件傳值沒有區(qū)別,唯一的區(qū)別在于子組件往回傳值的時(shí)候$emit所調(diào)用的事件名必須是update:屬性名,事件名寫錯(cuò)不會(huì)報(bào)錯(cuò),但那時(shí)也不會(huì)有任何改變,這點(diǎn)需要注意。

感謝各位的閱讀,以上就是“修飾符v-model與.sync有哪些區(qū)別”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對修飾符v-model與.sync有哪些區(qū)別這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI