VueJs3从孙子组件向其祖父组件发出事件

csbfibhn  于 2023-01-09  发布在  Vue.js
关注(0)|答案(2)|浏览(283)

我对Vue比较陌生,正在进行我的第一个项目。我正在创建一个包含几个子组件和孙组件的表单。我遇到了一个问题,我需要生成表单的多个副本。因此,我将一些数据属性上移了一级。目前,表单是ApplicationPage.Vue〉TheApplication.Vue〉PersonalInformation.Vue〉BaseInput.Vue。我的问题是我需要通过TheApplication将更改从PersonalInformation发送到ApplicationPage。我很难弄清楚如何处理这种情况。我一直在为Vue2寻找解决方案,但没有为Vue3找到。

    • 应用程序页面. vue**
template
      <TheApplication :petOptions="petOptions"
                      :stateOptions='stateOptions'
                      v-model="data.primary"
                      applicant="Primary"/>

script
data() {
    return {
      data: {
        primary: {
          personalInformation: {
            first_name: "",
            middle_name: "",
            last_name: "",
            date_of_birth: "",
            phone: null,
            email: "",
            pets: "",
            driver_license: null,
            driver_license_state: "",
            number_of_pets: null,
            additional_comments: ""
          },
        },
      },
    }
  },
    • 应用程序. Vue**

x一个一个一个一个x一个一个二个x

    • 个人信息.版本**

一个三个三个一个

pcww981p

pcww981p1#

我会这么做:codesandbox
emits只接受两个参数,即发射的名称和发射的值。如果发射多个值,则必须将这些值作为单个对象发射。在我的解决方案中,孙组件将字段名称和值作为单个对象发射

    • 孙子**
<input
    :value="personalInformation.first_name"
    @input="onInput('first_name', $event.target.value)"
    ...
>
onInput(field, value) {
  this.$emit("update-field", { field: field, value: value });
},

子对象捕获并重新发出的对象,首先注意以父组件预期的格式发出(它预期整个data.primary对象,因为这是设置为v模型的对象)

    • 儿童**

一个二个一个一个
然后,父组件自动接收并更新v模型data.primary对象。

  • 或者 *,我必须提到,您可以始终使用Pinia,Vue的官方状态管理库(在一个组件中保存一些状态,从任何其他组件读取相同的状态),而不是处理多级组件之间的任何发射/传递对象。当然,这需要学习曲线,但它绝对值得学习,并且正是为了简化这种情况而设计的。
bpzcxfmw

bpzcxfmw2#

对于任何不想链接事件发射的人来说,子对象上有一个父对象,也可以用来发射事件。请确保在父对象中注册发射,以避免控制台中出现警告。
孩子
在此调用直接父级的$emit

    • 子版本**
<input @input="$parent.$emit('custom-event', e.target.value) />

或使用方法:
x一个一个一个一个x一个一个二个x

父母

因为是父节点向祖先节点发射,所以在这里声明发射。对于<script setup>,只需使用defineEmits()方法来声明发射。参见文档。

    • 父版本**

一个三个三个一个
如果使用<script setup>

<script setup>
  defineEmits(['custom-event']) // Register the emits
</script>

祖父母

然后侦听祖父组件中的事件。

    • 祖父母价值**
<Parent @custom-event="doSomething()" /> <!-- The event is being listened to in the grandparent component -->

相关问题