【问题标题】:Emit value from child to parent component从子组件向父组件发出值
【发布时间】:2019-12-17 08:05:53
【问题描述】:

在我的 Nuxt.js 应用程序中,我尝试从子组件向父组件发出一个值。

父组件是:pages/index.vue

<template>
  <div>
    <custom-input v-model="value" />
    <v-btn @click="showValue">
      Ok
    </v-btn>
  </div>
</template>

<script>
import CustomInput from '@/components/CustomInput.vue'
export default {
  components: { CustomInput },
  data () {
    return {
      value: 'hello'
    }
  },
  watch: {
    value (val) {
      console.log('value' + val)
    }
  },
  methods: {
    showValue () {
      console.log('value is: ' + this.value)
    }
  }
}
</script>

子是:component/CustomInput.vue

<template>
  <v-text-field
    v-bind:value="value"
    v-on:input="$emit('input', value)"
  />
</template>

<script>
export default {
  name: 'CustomInput',
  props: {
    value: {
      type: String,
      required: true
    }
  },
  watch: {
    value () {
      this.$emit('input', this.value)
    }
  }
}
</script>

当我单击确定按钮时,我没有得到更新的值。我错过了什么?

屏幕截图显示新值不是通过单击按钮登录控制台,而是显示旧值。

我按照官方文档here

相关简单demo 托管在 Github 上。

【问题讨论】:

  • 您的代码中有许多其他控制台登录。您认为哪些日志符合预期?
  • 只是为了调试,我把它们去掉,只留下相关的
  • 但是您看到控制台记录了value 上的watch 吗?
  • 我需要的是:点击按钮,我想控制台记录我输入的值。所有其他控制台日志都只是为了调试

标签: javascript vue.js nuxt.js


【解决方案1】:

这一行是错误的:

v-on:input="$emit('input', value)"

这是发出旧值。

应该是:

v-on:input="$emit('input', $event)"

这将发出新值。

您也可以使用:

v-on:input="value => $emit('input', value)"

或者把它移到methods中的一个方法中。

【讨论】:

  • 我共享的文档链接和this tutorial 都做了我尝试过的事情(我只是按照他们的步骤操作)。非常感谢
  • @Begueradj 我在这两种资源中都看不到任何你尝试过的地方。我怀疑您可能误解了您阅读的内容。
  • 在它使用的教程中:this.$emit('input', this.value);,与我的区别是this,我在发布之前尝试过(抱歉没有提及)。我做了文档所说的,但我得到了类似的东西:试图读取未定义的值。感谢您的帮助
  • @Begueradj 关键区别在于代码出现的位置。在本教程中,代码出现在 watch 中,并在 this.value 更改为新值后运行。在您的代码中,您将其用作input 事件的侦听器。这是两个完全不同的场景。了解为什么您的代码不起作用非常重要。当您将代码迁移到模板时,删除this. 前缀是正常的,这不是问题。
  • @Begueradj 如果您仍然想使用带有v-model 的道具,那么您需要在组件上使用model 选项来配置道具名称:vuejs.org/v2/api/#model。另一种方法是使用sync 修饰符而不是v-modelvuejs.org/v2/guide/components-custom-events.html#sync-Modifier。另一种选择是手动处理父组件中的绑定和事件监听器,而不是依赖 Vue 的双向绑定。
猜你喜欢
  • 2021-02-12
  • 2021-07-26
  • 2017-07-12
  • 1970-01-01
  • 2018-09-30
  • 2020-10-06
  • 2018-09-30
  • 2019-08-10
  • 2021-04-10
相关资源
最近更新 更多