3

子コンポーネントのいずれかのボタンがクリックされたときに、親コンポーネントで実行するメソッドを取得しようとしています。Webpack で単一ファイル コンポーネントを使用しています。子コンポーネントのコードは次のとおりです。

<template>
  <button v-on:click="add">Click</button>
</template>

<script>
export default {
  methods: {
    add: () => {
      console.log('foo')
      this.$dispatch('addClick')
    }
  }
}
</script>

そして、親のコード:

<template>
  <div id="app">
    <count :total="total"></count>
    <click></click>
  </div>
</template>

<script>
import count from './components/count.vue'
import click from './components/click.vue'

export default {
  components: {
    count,
    click
  },
  data: () => {
    return {
      total: 0
    }
  },
  methods: {
    addToTotal: () => {
      console.log('bar')
      this.total += 1
    }
  },
  events: {
    addClick: 'addToTotal'
  }
}
</script>

コンポーネントは、変数countを表示する単なる h1 要素です。totalボタンをクリックすると、「foo」はコンソールに記録されますが、「bar」は記録されず、合計も変わりません。私が間違っていることについてのアイデアはありますか?前もって感謝します!

4

2 に答える 2

1

メソッドにラムダ表記を使用しているため、メソッドに間違ったthis. function代わりに使用すると、機能します。

Vue.component('click', {
  template: '#clicker',
  methods: {
    add: function() {
      console.log('foo')
      this.$dispatch('addClick')
    }
  }

})

new Vue({
  el: '#app',
  data: () => {
    return {
      total: 0
    }
  },
  methods: {
    addToTotal: function () {
      console.log('bar')
      this.total += 1
    }
  },
  events: {
    addClick: 'addToTotal'
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<template id="clicker">
  <button v-on:click="add">Click</button>
</template>

<div id="app">
  <count :total="total"></count>
  <click></click>
  {{total}}
</div>

于 2016-08-28T02:13:26.847 に答える
0

親の値が変更されたときに値が更新されるように、コンポーネントのプロパティで双方向.syncバインディング タイプ修飾子を使用します。次に例を示します。totalcounttotal

Vue.component('click', {
    template: '<button v-on:click="add">Click</button>',
    methods: {
        add: function () {
            this.$dispatch('addClick');
        }
    }
});

Vue.component('count', {
    template: '<h1 v-text="total"></h1>',
    props: {
        total: {
            type: Number,
            twoWay: true
        }
    }
});

new Vue({
    el: '#app',
    data: {
        total: 1
    },
    methods: {
        addTotal: function () {
            this.total++;
        }
    },
    events: {
        addClick: 'addTotal'
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.25/vue.min.js"></script>

<div id="app">
    <count :total.sync="total"></count>
    <click></click>
</div>

于 2016-08-28T00:27:32.207 に答える