Vue.js 将函数作为 prop 传递并使 child 用数据调用它
Vue.js pass function as prop and make child call it with data
我有一个 posts 列表组件和一个 post 组件。
我传递了一个从 posts 列表调用到 post 组件的方法,因此当单击按钮时将调用它。
但我想在点击此功能时传递 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 组件中看到的那样,您有一个点击运行他从 prop 获得的方法,我想向该方法添加一个变量。
你是怎么做到的?
通常,click
事件处理程序将接收事件作为其第一个参数,但您可以使用 bind
来告诉函数对其 this
和第一个参数使用什么(s):
:clicked="clicked.bind(null, post)
更新的答案:但是,让 child emit 可能更直接(并且更 Vue-standard)事件并让 parent 处理它。
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>
使用 Vue 2 并扩展上面的 @Roy J 代码,我在子组件 (Post) 中创建了一个方法,该方法调用 prop 函数并作为回调的一部分发回数据对象。我还将 post 作为道具传入,并在回调中使用其 ID 值。
回到 Posts 组件(父级),我修改了 clicked 函数,方法是引用事件并以这种方式获取 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>
这是服务:
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);
},
}
我有一个 posts 列表组件和一个 post 组件。
我传递了一个从 posts 列表调用到 post 组件的方法,因此当单击按钮时将调用它。
但我想在点击此功能时传递 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 组件中看到的那样,您有一个点击运行他从 prop 获得的方法,我想向该方法添加一个变量。
你是怎么做到的?
通常,click
事件处理程序将接收事件作为其第一个参数,但您可以使用 bind
来告诉函数对其 this
和第一个参数使用什么(s):
:clicked="clicked.bind(null, post)
更新的答案:但是,让 child emit 可能更直接(并且更 Vue-standard)事件并让 parent 处理它。
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>
使用 Vue 2 并扩展上面的 @Roy J 代码,我在子组件 (Post) 中创建了一个方法,该方法调用 prop 函数并作为回调的一部分发回数据对象。我还将 post 作为道具传入,并在回调中使用其 ID 值。
回到 Posts 组件(父级),我修改了 clicked 函数,方法是引用事件并以这种方式获取 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>
这是服务:
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);
},
}