Vue.js将函数作为prop传递,并让子进程调用数据

时间:2016-09-13 19:55:57

标签: javascript vue.js vue-component

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

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

但我希望在点击此功能时传递帖子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组件中看到的那样,你有一个点击来运行他从道具获得的方法,我想在该方法中添加一个变量。

你是怎么做到的?

3 个答案:

答案 0 :(得分:22)

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

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

更新的答案:但是,让孩子emit成为一个事件并让父母处理它可能会更直接(并且更符合Vue标准)。

&#13;
&#13;
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
  }
});
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<post-feed></post-feed>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

回到帖子组件(父级),我通过引用事件并以这种方式获取ID属性来修改单击的功能。

查看工作Fiddle here

这是代码:

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>

答案 2 :(得分: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);
    },
}