Vue 3 组件重置不会重置reactive() 对象数据 [英] Vue 3 component reset does not reset reactive() object data

查看:680
本文介绍了Vue 3 组件重置不会重置reactive() 对象数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 Vue 3、打字稿、组合 API &FireStore 数据,当尝试通过键值更改重置表单时,所有 reactive() 数据将重置为其原始存储值除了嵌套对象数据...在这种情况下地址:{}.

Using Vue 3, typescript, composition API & FireStore data, when attempting to reset the form by key value change, all reactive() data resets to its original stored value except the nested object data... in this case address: {}.

父母

<template>
    ...
    <component :key="formKey" @reset="formReset" :FireStoreData="fsData" />
    ...
</template>
<script lang="ts">
...
export default defineComponent({
    ...
    setup(){
        const formKey = ref(0)

        const formReset = () => formKey.value++

        return { activeForm, formKey, formReset }
    }
})
</script>

子表单

<template>
    <form>
        <input type="text" v-model="name" /> // RESETS
        <input type="text" v-model="address.street" /> // DOES NOT RESET
        <input type="text" v-model="address.city" /> // DOES NOT RESET
        <input type="text" v-model="phone" /> // RESETS
        <button @click.prevent="reset">Reset</button>
    </form>
</template>
<script lang="ts">
...
export default defineComponent({
    ...
    setup(props, {emit}){
        const formData = reactive({
            name: '',
            address: {
                street: '',
                city: ''
            },
            phone: ''
        })

        Object.assign(formData, props.FireStoreData)

        const reset = () => emit('reset')

        return { ...toRefs(formData), reset }
    }
})
</script>

推荐答案

要获得发射权限,您需要做的事情

to get access to emit you need to do

setup(props, { emit }) {

最小复制

Parent.vue

<template>
  <div class="">{{formKey}}</div>
  <Child
    :key="formKey"
    @reset="formReset"
  />
</template>

<script lang="ts">
import { ref, defineComponent } from "vue";
import Child from "./Child.vue";
export default defineComponent({
  components: {
    Child,
  },
  setup() {
    const formKey = ref(0);
    const formReset = () => formKey.value++;
    return { formKey, formReset };
  },
});
</script>

Child.vue

<template>
  <form>
    <input type="text" v-model="name" />
    <input type="text" v-model="address.street" />
    <input type="text" v-model="address.city" />
    <input type="text" v-model="phone" />
    <div>Name {{name}} </div>
    <div>Street {{address.street}} </div>
    <div>City {{address.city}} </div>
    <div>Phone {{phone}} </div>
    <button @click.prevent="reset">Reset</button>
  </form>
</template>

<script lang="ts">
import { defineComponent, toRefs, reactive } from "vue";
export default defineComponent({
  setup(props, { emit }) {
    const formData = reactive({
      name: "",
      address: {
        street: "",
        city: "",
      },
      phone: "",
    });
    const reset = () => emit("reset");
    return { ...toRefs(formData), reset };
  },
});
</script>

重置

这篇关于Vue 3 组件重置不会重置reactive() 对象数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆