Tetapkan semula model v komponen kanak-kanak
P粉268284930
P粉268284930 2023-09-13 09:33:32
0
1
519

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粉268284930
P粉268284930

membalas semua(1)
P粉618358260

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>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan