Rumah > Soal Jawab > teks badan
Dalam komponen induk saya, saya mempunyai sesuatu seperti ini,
<template> <ProductCounter v-model="formData.productCount" label="product count" /> </template> <script setup> const initialFormData = { productCount: null, firstname: '', surname: '', phone: '', email: '', postcode: '', submittedOnce: false, errors: [] } let formData = reactive({ ...initialFormData }); const clearUI = () => { formData = reactive({ ...initialFormData }); triggerInlineForm.value = false; } </script>
Komponen anak saya kelihatan seperti ini,
<template> <div class="form__row" @reset-counts="resetCount"> <div class="counter__row"> <label>{{ label }}</label> <div class="form__counter"> <button class="form__button--decrease form__button--circle form__button--animate-scale" :disabled="value == 0 || props.disabled" @click.prevent="decreaseCount()"> <i> <FontAwesomeIcon :icon="['fal', 'minus']" /> </i> </button> <input type="text" v-model="value" :disabled="props.disabled" @input="updateQty" placeholder="0"/> <button class="form__button--increase form__button--circle form__button--animate-scale" :disabled="props.disabled" @click.prevent="increaseCount()"> <i> <FontAwesomeIcon :icon="['fal', 'plus']" /> </i> </button> </div> </div> </div> </template> <script setup> import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'; const emits = defineEmits(['update:modelValue', 'resetCounts']); const props = defineProps({ label: { type: String, required: true }, modelValue: { type: String, required: true, default: 0 }, disabled: { type: Boolean, required: false } }); const value = ref(props.modelValue); const updateQty = () => { emits('update:modelValue', value.value) } const increaseCount = () => { value.value++ emits('update:modelValue', value.value) } const decreaseCount = () => { value.value--; emits('update:modelValue', value.value) } </script>
Saya menjangkakan bahawa apabila clearUI dicetuskan daripada induk dan formData ditetapkan semula, model ProductCounter's v akan kembali kepada 0, tetapi tidak demikian, di manakah silap saya?
P粉6183582602023-09-14 00:46:50
Pautan ke Penyelesaian Langsung
Sila sediakan contoh yang boleh dihasilkan secara minima di https://play.vuejs.org/ lain kali. Untuk soalan anda:
Sila jangan tulis ganti pembolehubah reaktif dalam Vue...
Tukar sahajaObject.assign(formData,initialFormData)
:
Juga jangan nyahrujuk sifat komponen: const value = ref(props.modelValue)
. Sifat ini kehilangan kereaktifannya kerana anda hanya menyalin nilai asal.
Buat v-model
模式的最佳方法是使用计算
dan anda boleh memanipulasinya terus dalam templat.
const value = computed({ get(){ return props.modelValue; }, set(val){ emits('update:modelValue', val); } });
Selain itu, sifat kiraan anda hendaklah nombor, bukan rentetan (anda akan mendapat amaran Vue):
modelValue: { type: Number, required: true, default: 0 },
Selain itu, tiada kemas kini diperlukan input
事件上的 prop,因为您已经在 上使用
v-model
>. Anda juga harus menukar model input kepada nombor:
<input type="text" v-model.number="value" :disabled="props.disabled" placeholder="0"/>
Jadi anda ada: Paparan permohonan
<template> <p> <ProductCounter v-model="formData.productCount" label="product count" /> </p> <button @click="clearUI"> Clear </button> <div> {{ JSON.stringify(formData) }} </div> </template> <script setup> import ProductCounter from './ProductCounter.vue' import {reactive} from 'vue' const initialFormData = { productCount: 0, firstname: '', surname: '', phone: '', email: '', postcode: '', submittedOnce: false, errors: [] } let formData = reactive({ ...initialFormData }); const clearUI = () => { Object.assign(formData, initialFormData); } </script>
ProductCounter.vue:
<template> <div class="form__row"> <div class="counter__row"> <label>{{ label }}</label> <div class="form__counter"> <button :disabled="value == 0 || props.disabled" @click.prevent="value--"> - </button> <input type="text" v-model.number="value" :disabled="props.disabled" placeholder="0"/> <button :disabled="props.disabled" @click.prevent="value++"> + </button> </div> </div> </div> </template> <script setup> import {computed} from 'vue'; const emits = defineEmits(['update:modelValue']); const props = defineProps({ label: { type: String, required: true }, modelValue: { type: Number, required: true, default: 0 }, disabled: { type: Boolean, required: false } }); const value = computed({ get(){ return props.modelValue; }, set(val){ emits('update:modelValue', val); } }); </script>