使用 Vue 在 Laravel 9 中从子组件到父组件获取更新值时出现问题

Problem getting updated value from child component to the parent component in a Laravel 9 with Vue

我正在使用带有 Vue 3 的 Laravel 9 应用程序。我创建了全新安装。 我想创建一些我想在父组件中使用的组件。我要创建的第一个组件将传递一个值(邮政编码),该组件将格式化并验证传递的值。父组件应该可以访问更新后的格式化值。

作为第一步,我使用 vuejs.org 中的文档创建了邮政编码组件。

<!-- postalcode.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue;
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  }
}
</script>

<template>
  <input v-model="value" />
</template>

接下来,我复制了 Laravel Vue 安装附带的示例组件,以创建数据元素“邮政编码”并用作 ,

的 v 模型
    <div class="card-body">
        <postal-code-input v-model="postalcode" /> {{ postalcode }}
    </div>
</template>

<script>
    export default {
    data(){
        return {
            postalcode:'l3r3g',
        }
    },
}

当我 运行 我的应用程序时,它会在输入框中显示初始值 (l3r3g),并在 {{postalcode}} 处显示相同的值。但是,当我更新输入框中的值时,它不会更新父组件中的 {{postalcode}} 。当我在 vue 开发工具中检查组件时,我看到 modelValue 和 computed 'value' 未定义,如图所示

我只是不知道发生了什么。如果能帮助解决此问题,我将不胜感激。

如果您使用 v-model 绑定这样的道具

<postal-code-input v-model="postalcode" /> 

postal-code 组件应该发出“输入”并有一个值属性。你可以使用不同的道具和事件,但你应该避免 v-model 绑定,而只是做这样的事情

<postal-code-input :modelValue="postalcode" @modelValueUpdate=“handleUpdate” /> 

我尝试使用 watcher 而不是 computed 属性 因为计算的属性会产生缓存,有时它的 set() 方法会在调试时造成复杂性 reactivity.

以下代码片段对我有用:


// PostalCode.vue

<template>
    <div class="input-group  input-group-merge mb-3">
        <input
            v-model="postalCode"
            type="text" class="form-control"
            id="postal_code" name="postal_code"
        />
    </div>
</template>

<script>
export default {
    name: "PostalCode",

    props: {
        modelValue: String,
    },

    data() {
        return {
            postalCode: null
        }
    },

    watch: {
        // watching prop
        modelValue: {
            handler: function (newValue) {
                if (newValue) {
                    this.postalCode = newValue;
                }
            },
            immediate: true,
        },

       // watching data() property
        postalCode: {
            handler: function (newValue, old) {            
                this.$emit('update:modelValue', newValue)
            },
            immediate: true
        }
    }
}
</script>

用法:

<postal-code v-model="user.postal_code"/>

您也可以将您的格式化逻辑放在任何观察器中。

Hint/Suggestion:

根据要求,如果你想对父项更改的道具进行格式化(对于旧的和新的),那么将格式化逻辑放在 modelValue watcher 中。

注:

以下代码片段在 Vue3

上完美运行