javascript - 无法让 $emit 在 vuejs 中将 prop 传递给父级
问题描述
我正在制作一个 todo 应用程序以更好地理解 Vue,但遇到了障碍。
我经历了几个 StackOverflow 问题和 Vuejs 论坛,但我不明白我做错了什么。
问题源于to-do-item
组件模板:
<button
@click="$emit('remove-item', {{item.id}} )">
Remove
</button>
如果我用$emit
不调用$emit
它的组件方法替换它可以正常工作,但是当我使用时$emit
(即使在本地组件函数中)它拒绝渲染。
我不确定这是为什么。这是我的其余代码:
Vue.component("todo-item", {
props:["item"],
template: `
<li>{{ item.text }}
<button
@click="$emit('remove-item', {{item.id}} )">
Remove
</button>
</li>`
})
let vm = new Vue({
el:"#app",
data: {
text: "",
todos: []
},
methods: {
getID: (function() {
let id = 0;
return function() {
return id++;
}
}()),
addTodo: function() {
this.todos.push({id: this.getID(), text: this.text});
this.text = "";
},
remove: function(remove_id) {
this.todos = this.todos.filter(({id}) => id != remove_id);
}
}
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script>
<div id="app">
<div id="container">
<main>
<ul>
<todo-item
v-for="todo in todos"
:item="todo"
@remove-item="remove"
>
</todo-item>
</ul>
</main>
<div id="add-field">
<input v-model="text" /> <button id="add" @click="addTodo">Add Todo</button>
</div>
</div>
</div>
解决方案
问题是您试图在 javascript-executed 属性中使用模板语法:
<button
@click="$emit('remove-item', {{item.id}} )">
修复它,它应该可以工作:
Vue.component("todo-item", {
props:["item"],
template: `
<li>{{ item.text }}
<button
@click="$emit('remove-item', item.id )">
Remove
</button>
</li>`
})
let vm = new Vue({
el:"#app",
data: {
text: "",
todos: []
},
methods: {
getID: (function() {
let id = 0;
return function() {
return id++;
}
}()),
addTodo: function() {
this.todos.push({id: this.getID(), text: this.text});
this.text = "";
},
remove: function(remove_id) {
this.todos = this.todos.filter(({id}) => id != remove_id);
}
}
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script>
<div id="app">
<div id="container">
<main>
<ul>
<todo-item
v-for="todo in todos"
:item="todo"
@remove-item="remove"
>
</todo-item>
</ul>
</main>
<div id="add-field">
<input v-model="text" />
<button id="add" @click="addTodo">Add Todo</button>
</div>
</div>
希望这可以帮助!
推荐阅读
- flutter - 如何在图像中填充颜色
- javascript - 我可以在不同的 React 组件中调用函数吗?
- html - 如何将 CSP 标头(Content-Security-Policy)添加到 vuejs 应用程序?
- graphql - GraphQL 文档资源管理器未在浏览器 .net core 3.1 中显示
- xamarin.forms - Xamarin Forms - 将 Scope-Injected 服务从 tabbedpageviewmodel 传递到页面的视图模型
- java - JLINK是如何使用的
- elasticsearch - 如何在elasticsearch中更新没有ID条件的文档?
- python - 如何设计神经网络使其表现得像 For-Loop?
- r - Tidyr::crossing 2 个以上的参数 (..1,..2,..3)
- python - python:比较复合主键值