【问题标题】:emit changes to parent from child [duplicate]从孩子向父母发出变化[重复]
【发布时间】:2018-01-22 05:20:27
【问题描述】:

我在通过子项的更改来更新父绑定时遇到问题。

我有以下vue代码:

Vue.component('usercomp', {
  template: '<input v-model="user.name.lastname">',
  props:['user'],
  computed: {
    fullname: function() {
        return this.user.firstname + ' ' + this.user.lastname;
    }
  }
});

new Vue({
  el: '#user-example',
  data: function() {
    return {
        user: {
        name: {
            fullname: '',
            firstname: '',
          lastname: '',
        }
      }
    }
  }
})

我在父视图上绑定子节点的计算属性。 我试图从孩子那里获取一个计算属性来更新父级中的&lt;p&gt;。 我尝试过使用商店,但不幸的是似乎给出了完全相同的结果。

我已经创建了this 小提琴:https://jsfiddle.net/alexintime/02jxvqex/7/

【问题讨论】:

  • 我不完全清楚你想做什么。全名计算属性在组件中定义。您是否有理由不想在父母中定义它?此外,虽然有几个人提到您需要 $emit 值,因为您正在传递一个 object,但这确实没有必要。

标签: javascript vue.js vuejs2


【解决方案1】:

您必须将带有vm.$emit 的事件从子组件发送到父组件,然后使用vm.$on 侦听/获取值

例如

vm.$on('name', function (val) {
  console.log(val)
})

vm.$emit('name', 'John Doe')
// -> "hi"

【讨论】:

    【解决方案2】:

    我已经更新了你的小提琴。 https://jsfiddle.net/observing/2jumkmvc/9/

    Vue.component('usercomp', {
      template: `<div>
      <input v-model="user.name.firstname">
      <br>
      <input v-model="user.name.lastname">
      </div>`,
      props:['user'],
      computed: {
      	    fullname: function() {
        	return this.user.name.firstname + ' ' + this.user.name.lastname;
        }
      },
      watch: {
        fullname: function (val) {
          this.$emit('change-full-name', val)
        }
      }
    });
    
    new Vue({
      el: '#user-example',
      data: function() {
      	    return {
    	  user: {
      	    name: {
              fullname: 'empty until type',
        	  firstname: 'James',
              lastname: 'Holden',
            }
          }
        }
      },
      methods: {
        changeFullName: function (fullName) {
          this.user.name.fullname = fullName
        }
      }
    })
    <script src="https://unpkg.com/vue@2.4.2"></script>
    <div id="user-example">
      <p> {{user.name.fullname}} </p>
      <usercomp v-bind:user="user" 
      v-on:change-full-name="changeFullName"></usercomp>
    </div>

    【讨论】:

    • 您可以完全删除您的@keyup 事件和fiddle will still work
    • 是的。 )) 我只是展示了他如何从孩子改变父母......
    • 我试图指出他正在从孩子改变父母。对象通过引用传递。在这种特定情况下,不需要 $emit。
    • 是的!我已经删除了 keyup 事件,现在父级可以通过子级中的计算属性进行更新。 VisualBean 要求执行此操作“我正在尝试从子级获取计算属性以更新父级中的 p。”
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2022-12-16
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多