想不到對我來說,v-model還有續集...
在vue pre3.4之前,defineModel還沒出現之前,要怎麼處理組件間的雙向綁定?目前我知道的有兩種方式。
這個文件上也有,在子組件裡自己定義v-bind & v-on,讓component的input值由prop去views那邊接資料,同時當input欄位有新的輸入時,發出emit並帶著輸入的值給views。
<script setup>
const props=defineProps({
msg:{
type: String,
required: true,
default:()=>''
}
})
const emits=defineEmits(['update:msg'])
</script>
<template>
<span>My input</span>
<input :value="props.msg" @input="emits('update:msg',$event.target.value)">
</template>
基本上的想法就是用 "writable computed"來自己做類似defineModel的東西。
回想一下,v-model是由v-bind & v-on組成,如果是組件間的雙向綁定,v-bind要bind的是一個prop,v-on要on的是一個emit,所以defineModel幫我們做好了props & emit給views(父組件)來v-model,且它本身又回傳一個ref,給component(子組件)裡的v-model,讓使用者的input能與這個ref同步。
因為computed是一個ref,而它的內容是由getter & setter組成
由views同步component input
由component input同步views
const props=defineProps({
msg:{
type: String,
required: true,
default:()=>''
}
})
const emits=defineEmits(['update:msg'])
const beforeDefineModel=computed({
get(){
return props.msg
},
set(newValue){
emits('update:msg',newValue )
}
})
vue-v-model
vue-computed
Vue 3 — 在子元件中修改父層的狀態 feat. props、emit、computed