41

我有一个帖子列表组件和一个帖子组件。

我传递了一个从帖子列表调用到帖子组件的方法,所以当一个按钮被点击时,它将被调用。

但是我想在单击此功能时传递帖子ID

代码:

let PostsFeed = Vue.extend({
    data: function () {
        return {
          posts: [....]
        }
    },
    template: `
      <div>
        <post v-for="post in posts" :clicked="clicked" />
      </div>
    `,
    methods: {
      clicked: function(id) {
        alert(id);
      }
    }
  }
                           
  let Post = Vue.extend({
    props: ['clicked'],
    data: function () {
        return {}
    },
    template: `
      <div>
        <button @click="clicked" />
      </div>
    `
}

正如您在 Post 组件中看到的那样,您可以单击运行他从道具获得的方法,我想向该方法添加一个变量。

你是怎样做的?

4

3 回答 3

39

通常,click事件处理程序将接收事件作为它的第一个参数,但您可以使用它bind来告诉函数它this和第一个参数使用什么:

:clicked="clicked.bind(null, post)

更新的答案:但是,让子级发出事件并让父级处理它可能更直接(并且更符合 Vue 标准) 。

let Post = Vue.extend({
  template: `
      <div>
        <button @click="clicked">Click me</button>
      </div>
    `,
  methods: {
    clicked() {
      this.$emit('clicked');
    }
  }
});

let PostsFeed = Vue.extend({
  data: function() {
    return {
      posts: [1, 2, 3]
    }
  },
  template: `
      <div>
        <post v-for="post in posts" @clicked="clicked(post)" />
      </div>
    `,
  methods: {
    clicked(id) {
      alert(id);
    }
  },
  components: {
    post: Post
  }
});

new Vue({
  el: 'body',
  components: {
    'post-feed': PostsFeed
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<post-feed></post-feed>

于 2016-09-13T21:39:32.790 回答
3

使用 Vue 2 并扩展上面 @Roy J 的代码,我在子组件 (Post) 中创建了一个方法,该方法调用 prop 函数并将数据对象作为回调的一部分发回。我还将帖子作为道具传入,并在回调中使用了它的 ID 值。

回到 Posts 组件(父组件),我通过引用事件并以这种方式获取 ID 属性来修改clicked函数。

在这里查看工作中的小提琴

这是代码:

let Post = Vue.extend({
  props: {
    onClicked: Function,
    post: Object
  },
  template: `
      <div>
        <button @click="clicked">Click me</button>
      </div>
    `,
  methods: {
    clicked() {
        this.onClicked({
        id: this.post.id
      });
    }
  }
});

let PostsFeed = Vue.extend({
  data: function() {
    return {
      posts: [
        {id: 1, title: 'Roadtrip', content: 'Awesome content goes here'},
        {id: 2, title: 'Cool post', content: 'Awesome content goes here'},
        {id: 3, title: 'Motorcycle', content: 'Awesome content goes here'},
      ]
    }
  },
  template: `
      <div>
        <post v-for="post in posts" :post="post" :onClicked="clicked" />
      </div>
    `,
  methods: {
    clicked(event) {
      alert(event.id);
    }
  },
  components: {
    post: Post
  }
});

new Vue({
  el: '#app',
  components: {
    'post-feed': PostsFeed
  }
});

这是HTML

<div id="app">
    <post-feed></post-feed>
</div>
于 2018-06-07T15:35:09.567 回答
0

这是服务:

export const getBuilding = () => {
  console.log("service");
  return 0;
};

在父组件中:

<Update-Theme :method="parentMethod"/>

import { getBuilding } from "./service";
methods: {
    parentMethod() {
      console.log("Parent");
      getBuilding();
    },
}

并在子组件中

<v-btn color="green darken-1" text @click="closeDialog()">
props: [ "method"],
 methods: {
    closeDialog() {
      this.method();
      //this.$emit("update:dialog", false);
    },
}
于 2020-09-23T02:27:13.273 回答