組件間的傳遞 錯誤訊息
[plugin:vite:vue] v-model cannot be used on a prop, because local prop bindings are not writable.
Use a v-bind binding combined with a v-on listener that emits update:x event instead.
從父母那裡傳遞我們的數據
我們的孩子發出一個事件來更新父實例
父組件
v-model:表單傳遞的名稱值='表單傳遞的名稱值'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <script setup lang="ts"> import { ref } from 'vue' import TodList from '../../../components/TodoList.vue' interface todosType{ id: Number, text: String, completed: boolean, } const todos = ref<todosType[]>([ { id: 1, text: 'Learn Vue.js 3', completed: false } ]) const newTodo = ref<string>('') const createTodo = () => { const query = { id: 2, text: newTodo.value, completed: false } todos.value.push(query) } </script> <template> <TodList :todos="todos" v-model:newTodo='newTodo' @sendCreateTodo ="createTodo" /> </template>
子組件
:value="表單傳遞的名稱值"
@input="emitNewTodoValue"
emitNewTodoValue是函式=>如果不是空字符,更新表單傳遞的名稱值(往父系傳遞)
const emitNewTodoValue = (evt) =>{
emit('update:newTodo', evt.target.value)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <script setup> const props = defineProps({ todos: { type: Object }, newTodo: { type: String }, // lastNewTodoModifiers: { // default: () => ({}), // 'no-whitespace': () => {} // }, }) const emit = defineEmits(['update:newTodo','sendCreateTodo']) const emitNewTodoValue = (evt) => { // let val = evt.target.value // if (props.lastNewTodoModifiers['no-whitespace']) { // val = val.replace(/\s/g, '') // } emit('update:newTodo', evt.target.value) } const sendCreateTodo = () =>{ emit('sendCreateTodo') } </script> <template> <div> <div v-for="todo in todos" :key="todo.id" data-test="todo"> {{ todo.text }} </div> <input type="text" placeholder="Add" :value="newTodo" @input="emitNewTodoValue" /> <button @click="sendCreateTodo">新增</button> </div> </template>
Vue v-model指令,值和資料屬性中的值之間建立雙向資料綁定。 1 2 3 4 5 6 7 8 9 10 11 12 <script setup lang="ts"> import { ref } from 'vue' const value = ref('') </script> <template> <div> <input v-model="value" type="text" /> <p>Value: {{ value }}</p> </div> </template>
v-model.lazy => 減少了 v-model 嘗試與 Vue 實例同步的次數 - 在某些情況下,可以顯著提高效能 v-model.number => 確保我們的值作為數字處理的一種方法是使用修飾符 v-model.trim => 在傳回值之前刪除前導或尾隨空格。 v-model.trim.lazy => 尾隨和前導空格將被刪除 參考資料 參考資料