当前位置: 首页 > news >正文

Vue 2 TodoList 案例

组件化编码流程(通用)

1.实现静态组件:抽取组件,使用组件实现静态页面的效果

结构

 2.代码

1.App.vue

<template><div id="appContainer"><TodoComponent/></div>
</template><script>
import TodoComponent from './components/TodoComponent.vue';
export default {name: "App",components: {TodoComponent}
};
</script><style>
#appContainer{display: flex;justify-content: center;
}
</style>

2.TodoComponent.vue

<template><div id="container"><div id="parent"><TodoHeader  :addTodo="addTodo"/><TodoList  :todos="todos" /><TodoFooter  :finish="finish" :all="all" :clear="clear" :doneAll="doneAll" /></div></div>
</template><script>
import TodoFooter from "./TodoFooter.vue";
import TodoHeader from "./TodoHeader.vue";
import TodoList from "./TodoList.vue";export default {name: "TodoComponent",components: {TodoFooter,TodoHeader,TodoList,},data() {return {todos:[{id:'001',title:'吃饭',done:true},{id:'002',title:'睡觉',done:false},{id:'003',title:'喝酒',done:true},{id:'004',title:'开车',done:true},{id:'005',title:'打游戏',done:false},{id:'006',title:'随便',done:false},{id:'007',title:'创业',done:false},]}},methods:{addTodo(x){console.log("我是Todo组件,我收到了数据",x);this.todos.unshift(x);},clear(){console.log('清除了');const idList = this.todos.filter(x=>x.done).map(x=>x.id);for(let i=0;i<this.todos.length;i++){if(idList.includes(this.todos[i].id)){this.todos.splice(i,1);i--;}}console.log(this.todos);},doneAll(choose){this.todos.forEach(x=>x.done=choose)}},computed:{finish(){return this.todos.filter(x=>x.done).length;},all(){return this.todos.length;}}
};
</script><style scoped>#parent {width: 600px;border: 1px solid #ccc;display: flex;justify-content: center; /*  水平居左 */align-items: center; /* 垂直居中 */flex-direction: column; /* 垂直排列子元素 */
}
#parent > *{margin: 10px 0px;
}</style>

 3.TodoFooter.vue

<template><div id="container" v-show="all>0"><div><input type="checkbox" v-model="allChoose" @change="doneAll(allChoose)"/><label>已完成{{finish}} / 全部{{all}}</label></div><button id="button" @click="clear">清除已完成的任务</button></div>
</template><script>
export default {name: "TodoFooter",data() {return {allChoose:false}},updated() {if(this.finish ===this.all && this.all > 0){this.allChoose = true;}else if(this.finish < this.all && this.all > 0){this.allChoose = false;}//双向绑定可以绑定 计算属性 前提是计算属性要写 setter},props:['finish','all','clear','doneAll']
};
</script><style scoped>
#container {display: flex;justify-content: space-between; /*  水平居左 */width: 500px;height: 30px;padding: 10px;
}
#container *{padding: 5px;
}#button {width: 140px;height: 28px;color: white;background-color: #eb1212;border: 1px solid #ccc;border-radius: 5px;padding: 5px;margin-right: 15px;cursor: pointer; /* 鼠标悬停时显示手型光标 */transition: background-color 0.3s ease; /* 平滑过渡 */
}#button:hover {background-color: #d10d0d; /* 鼠标悬停时颜色变化 */
}#button:active {background-color: #a00; /* 按下时颜色变化 */transform: translateY(2px); /* 按下时按钮下移效果 */
}</style>

4.TodoHeader.vue

<template><div><inputid="headerInput"type="text"placeholder="请输入你的任务名称,按回车键确认"v-model="title"@keyup.enter="submit"/></div>
</template><script>
import { nanoid } from "nanoid"; //函数export default {name: "TodoHeader",data() {return {title: "",};},props: ["addTodo"],methods: {submit() {//将用户的输入包装成一个todo对象if (this.title.trim() === "") {alert("输入不能为空");return;}const todoObj = {id: nanoid(),title: this.title,done: false,};this.addTodo(todoObj);this.title = "";//安装一些 nanoid  npm i nanoid},},
};
</script><style scoped>
#headerInput {width: 498px;height: 30px;border: 1px solid #ccc;border-radius: 2px;padding-left: 10px;
}
</style>

 5.TodoItem.vue

<template><div id="container" @mouseover="handleMouseOver"  @mouseleave="handleMouseLeave" ><div id="d" ><input type="checkbox" v-model="todo.done" /><span @click="info">{{ todo.title }}</span></div><button id="button" v-show="showDelete" @click="deleteTodo">删除</button></div>
</template><script>
export default {name: "TodoItem",data() {return {todo: this.todoObj,showDelete: false,};},methods: {info() {console.log(this.todo);},handleMouseOver() {this.showDelete = true;},handleMouseLeave() {this.showDelete = false;},deleteTodo(){this.removeTodo(this.todoObj.id)}},props: {todoObj: {//传入的若是引用对象 则里面修改了,外面同样生效type: Object,required: true,},removeTodo:{type:Function,}},
};
</script><style scoped>#container:hover{background-color: #a09a9a;
}#container {display: flex;justify-content: space-between; /*  水平居左 */align-items: center; /* 垂直居中 */width: 500px;height: 30px;border: 0.1px solid #ccc;border-radius: 2px;padding-left: 10px;padding-top: 5px;padding-bottom: 5px;
}#container * {padding: 5px;
}#button {width: 50px;height: 28px;color: white;background-color: #eb1212;border: 1px solid #ccc;border-radius: 5px;padding: 5px;margin-right: 15px;cursor: pointer; /* 鼠标悬停时显示手型光标 */transition: background-color 0.3s ease; /* 平滑过渡 */
}
#button:hover {background-color: #d10d0d; /* 鼠标悬停时颜色变化 */
}#button:active {background-color: #a00; /* 按下时颜色变化 */transform: translateY(2px); /* 按下时按钮下移效果 */
}
</style>

6. TodoList.vue

<template><div><TodoItem v-for="item in todosList" :key="item.id" :todoObj="item" :removeTodo="deleteTodo" /></div>
</template><script>
import TodoItem from './TodoItem.vue'export default {name:'TodoList',components:{TodoItem},data() {return {todosList: this.todos}},methods:{deleteTodo(id){for(var i=0;i<this.todosList.length;i++){if(this.todosList[i].id===id){console.log(i,"下标");break;}}this.todosList.splice(i,1);}},props:['todos']}
</script><style scoped></style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 博弈dp,CF 731E - Funny Game
  • Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践
  • 在MySQL中,处理层次结构数据(如树状或组织结构图)的查询
  • 国家网络安全战略
  • 新160个crackme - 027-MexeliteCRK1
  • 深度学习:记一次由model.train() 引发的模型训练效果变差事故
  • 纯手工在内网部署一个Docker私有仓库
  • 【RISC-V设计-09】- RISC-V处理器设计K0A之CIC
  • android10 系统定制:增加应用锁功能
  • DS1302实时时钟(51单片机)
  • Flink cdc正确打开方式(flink on yarn)
  • Kotlin 和 Java区别
  • Netty学习笔记01--出入站处理器顺序
  • 学习记录702@计算机组成原理之计算机硬件组成细化
  • FFmpeg源码:av_packet_move_ref、av_packet_make_refcounted函数分析
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • C++类中的特殊成员函数
  • canvas 五子棋游戏
  • Cookie 在前端中的实践
  • JavaScript的使用你知道几种?(上)
  • Laravel 中的一个后期静态绑定
  • zookeeper系列(七)实战分布式命名服务
  • 区块链技术特点之去中心化特性
  • 人脸识别最新开发经验demo
  • 如何编写一个可升级的智能合约
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 为视图添加丝滑的水波纹
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)Android开发优化---------UI优化
  • (11)MSP430F5529 定时器B
  • (BFS)hdoj2377-Bus Pass
  • (Java数据结构)ArrayList
  • (JS基础)String 类型
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)Honghu Cloud云架构一定时调度平台
  • (算法设计与分析)第一章算法概述-习题
  • (一)基于IDEA的JAVA基础10
  • (转)http-server应用
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (自用)交互协议设计——protobuf序列化
  • .“空心村”成因分析及解决对策122344
  • .apk文件,IIS不支持下载解决
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 使窗口永不获得焦点
  • .net反编译的九款神器
  • .NET连接数据库方式