Vue中的$emit组件事件运用
2024-08-21 13:09:53
话不多说上代码
- vue>src>App.vue
<template>
<div id="app">
<!-- header -->
<Header/>
<AddTodo v-on:handleAdd="handleAdd"/>
<Todos :todos="todos" @handleDelete="handleDelete"/> </div> </template> <script>
import Todos from "./components/Todos";
import Header from "./components/layout/Header";
import AddTodo from "./components/layout/AddTodo";
export default { name:"app",
data(){
return{
msg:"hello",
todos:[
{
id:,
title:"代办事项1",
completed:false
},
{
id:,
title:"代办事项2",
completed:false
},
{
id:,
title:"代办事项3",
completed:false
},
]
}
},
components:{
Todos,
Header,
AddTodo,
},
methods:{
handleDelete(id){
// console.log(id);
this.todos=this.todos.filter(todo =>todo.id !==id)
},
handleAdd(newTodo){
// this.todos.unshift(newTodo);
this.todos=[...this.todos,newTodo]
}
}
}
</script> <style>
*{
box-sizing:border-box;
margin: ;
padding: ;
} body{
font-family: Arial, Helvetica, sans-serif;
line-height: 1.4;
}
</style>
vue>src>commponents>Todoo.vue
<template>
<div>
<div :key="todo.index" v-for="(todo) in todos">
<!-- <Todoitem :todo="todo" @deleteItem="deleteItem"/> -->
<Todoitem :todo="todo" @deleteItem="$emit('handleDelete',todo.id)"/>
</div>
</div>
</template> <script>
import Todoitem from './Todoitem';
export default {
name:"Todos",
props:{
todos:{
type:Array
}
},
components:{
Todoitem
},
methods:{
// deleteItem(id){
// console.log(id);
// }
}
};
</script> <style scoped> </style>
- vue>src>commponents>Todooitem.vue
<template>
<div class="todo-item" :class="{'is-complete':todo.completed}">
<p>
<input type="checkbox" @change="markComplete">
{{todo.title}}
<button class="del" @click="$emit('deleteItem',todo.id)">x</button>
</p>
</div>
</template> <script>
export default {
name:"Todos",
props:["todo"],
methods:{
markComplete(){
// console.log(this.todo);
this.todo.completed = !this.todo.completed;
}
} }
</script> <style scoped>
.todo-item{
background: #f4f4f4;
padding: 10px;
border-bottom: 1px #ccc dotted; }
.is-complete{
text-decoration: line-through;
}
.del{
background: #ff0000;
color: #fff;
border: none;
padding: 5px 9px;
border-radius: %;
cursor: pointer;
float: right;
} </style>
- vue>src>commponents>AddTodo.vue
<template>
<div>
<form @submit="addTodo">
<input v-model="title" type="text" name="title" placeholder="请添加代办事项……"/>
<input type="submit" value="添加" class="btn">
</form>
</div>
</template> <script>
import uuid from "uuid";
export default {
name:"AddTodo",
data(){
return{
title:""
}
},
methods:{
addTodo(e){
e.preventDefault();
// console.log('title:', this.title)
const newTodo={
id:uuid.v4(),
title:this.title,
completed:false
};
console.log('tag',newTodo )
//注册事件
this.$emit("handleAdd",newTodo)
this.title="";
}
}
}
</script>
<style scoped>
form{
display:flex;
}
input[type="text"]{
flex:;
padding: 5px;
}
input[type="submint"]{
flex: ;
}
.btn{
display: inline-block;
border: none;
background: #;
color:#fff;
padding:7px 20px;
cursor: pointer;
}
.btn:hover{
background: #;
}
</style>
- vue>src>commponents>Header.vue
<template>
<header class="header">
<h1>代办事项</h1>
</header>
</template> <script>
export default {
name: 'Header', }
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.header{
background: #;
color:#fff;
text-align: center;
padding:;
}
</style>
运行效果
一入前端深似海
最新文章
- Apache服务器安装过程及问题的解决(for windows system32bit)
- Direct2D教程(外篇)环境配置
- jquery的ready方法(DOM是否加载完)详解与使用
- jQuery jsonp无法捕获404、500状态错误
- 熟悉熟悉常用的几个算法用JS的实现
- freemarker判断对象是否为空
- hdu3247Resource Archiver(ac自动机+spfa)
- 用Leangoo做敏捷需求管理-敏捷团队协作
- iOS 7.0获取iphone UDID 【转】
- Java基础知识强化51:经典排序之桶排序(BucketSort)
- phantomjs form提交
- [Backbone.js]如何处理Model里面嵌入的Collection?
- 机器学习——KMeans聚类,KMeans原理,参数详解
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)
- 实时输出topk最频繁变动的股价
- dedecms模板中 if else怎么写
- http修改443端口,http 强制跳转https
- Python——pyiso8601
- UVA375
- Python笔记 #18# Pandas: Grouping