位置: IT常识 - 正文

Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)(vue做项目的流程)

编辑:rootadmin
Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点) Vue2.x 项目实战(一)内容参考链接Vue2.x全家桶Vue2.x 全家桶参考链接Vue2.x项目(一)Vue2.x 实现一个任务清单Vue2.x项目(二)Vue2.x 实现GitHub搜索案例Vue3.x项目(三)Vue3.x 实现一个任务清单文章目录Vue2.x 项目实战(一)Vue2.x 实现 todoList1、前言2、项目演示(一睹为快)3、涉及知识点4、项目详情(附源码及解析)5、写在最后的话Vue2.x 实现 todoList1、前言

推荐整理分享Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)(vue做项目的流程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vuejs项目实战,vue项目中技巧知识点,vue项目实例,vue做项目的流程,vue项目实战教程,vue项目实例,vuecli项目实战,vue项目实战教程,内容如对您有帮助,希望把文章链接给更多的朋友!

如果你对 vue 的基础知识还很陌生,推荐先去学习一下 vue 基础

如果你 刚学完 vue 基础知识,想检查一下自己的学习成果如果你 已学完 vue 基础知识,想快速回顾复习如果你 已精通 vue 基础知识,想做个小案例那不妨看完这篇文章,我保证你一定会有收获的!2、项目演示(一睹为快)

todoList 项目演示

3、涉及知识点Vue基础:插值语法,常用指令,键盘事件,列表渲染,计算属性,事件监听,生命周期Vue进阶:props(父传子),自定义事件(任意组件间通信),自定义事件的解绑,$nextTick 异步本地存储:任务记录保留在当前浏览器中,长期有效(不手动销毁则一直保留)第三方库:nonoid(下载导入即可使用)

备注:

任意组件间的通信方式有很多种(全局事件总线,消息订阅预发布…),熟练掌握一种即可(推荐自定义事件,配置简单,容易理解)本文是 vue 基础的练习项目,不涉及 vue 周边(Vuex,Vue-router)4、项目详情(附源码及解析)

该项目有 五个组件 构成:

Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)(vue做项目的流程)

(1)App.vue 父组件,以上四个子组件 最终归并的地方,并实现很多功能相关方法

(2)MyHeader.vue 子组件:头部,用于用户文本框 输入添加任务事项

(3)MyList.vue 子组件:躯干,用于 呈现任务的列表

(4)MyItem.vue 子中子组件,Mylist.vue 的子组件,用于 呈现每个任务及编辑删除

(5)MyFooter 子组件,用于 显示所选个数和总个数及删除已完成任务

App.vue 父组件

所有子组件的汇集点里面定义里很多方法,通过 props 父传子,供子组件们去使用当然也有自定义事件,供子给父传值,进行页面的渲染更新<template> <!-- 最外层容器 --> <div class="todo-container"> <div class="todo-wrap"> <!-- 头部子组件,子传父,自定义 addTodo事件,添加一个 todo对象 --> <MyHeader @addTodo="addTodo" /> <!-- 任务列表子组件,父传子,动态绑定对应事件 --> <MyList :updateTodo="updateTodo" :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo" /> <!-- 底部子组件,子传父,全选和全清除 --> <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo" /> </div> </div></template><script>// 引入所需组件import MyHeader from "./components/MyHeader.vue";import MyList from "./components/MyList.vue";import MyFooter from "./components/MyFooter.vue";export default { name: "App", components: { MyHeader, MyList, MyFooter }, data() { return { // 由于 todos 是 MyHeader 组件 和 MyFooter 组件都在用,所以放在APP中(状态提升) // 解析 JSON字符串 第一次使用时 null 身上没有 length 属性会报错,所以添加||,前面不能用时,置为空数组 // localStorage.getItem("xxx") 用于从本地存储中读取 todos todos: JSON.parse(localStorage.getItem("todos")) || [], }; }, methods: { // 添加一个 todo addTodo(todoObj) { this.todos.unshift(todoObj); }, // 勾选 or 取消勾选一个todo checkTodo(id) { this.todos.forEach((todo) => { if (todo.id === id) todo.done = !todo.done; }); }, // 更新一个 todo updateTodo(id, title) { this.todos.forEach((todo) => { if (todo.id === id) todo.title = title; }); }, // 删除,todo.id !== id 就不会 push 该 todo,即删除 deleteTodo(id) { this.todos = this.todos.filter((todo) => todo.id !== id); }, // 全选 or 取消全选 checkAllTodo(done) { this.todos.forEach((todo) => { todo.done = done; }); }, // 清除所有已经完成的todo clearAllTodo() { this.todos = this.todos.filter((todo) => { return !todo.done; }); }, }, watch: { todos: { // 深度监视 检测到是否被勾选 deep: true, handler(value) { // localStorage.setItem("xxx") 用来添加 todo // 格式化为 JSON 字符串 localStorage.setItem("todos", JSON.stringify(value)); }, }, }, // 销毁前进行自定义事件的解绑 beforeDestroy() { this.$off(['addTodo', 'checkAllTodo', 'clearAllTodo']) }};</script><style>body { background: #fff;}.btn { display: inline-block; padding: 4px 12px; margin-bottom: 0; font-size: 14px; line-height: 20px; text-align: center; vertical-align: middle; cursor: pointer; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); border-radius: 4px;}.btn-danger { color: #fff; background-color: #da4f49; border: 1px solid #bd362f;}.btn-edit { margin-right: 5px; background-color: skyblue; border: 1px solid rgb(102, 158, 180);}.btn-danger:hover { color: #fff; background-color: #bd362f;}.btn:focus { outline: none;}.todo-container { width: 600px; margin: 10px auto;}.todo-container .todo-wrap { padding: 10px; border: 1px solid #ddd; border-radius: 5px;}</style>

MyHeader.vue 组件

终端键入 npm i nanoid,安装 nanoid<style> 标签里的 scoped,表示里面定义的样式 仅在当前组件中生效<template> <div class="todo-header"> <!-- 双向数据绑定 title,绑定键盘 enter 键,点击触发 add 事件,添加 title --> <input type="text" placeholder="请输入你的任务名称,按回车键确认" v-model="title" @keyup.enter="add" /> </div></template><script>import { nanoid } from "nanoid";export default { name: "MyHeader", data() { return { // 要输入的任务事项 title: "", }; }, methods: { add() { // 校验数据 if (!this.title.trim()) return alert("输入不能为空"); // 将用户的输入包装成为一个 todo 对象,nanoid() 是随机生成的唯一值,默认为未完成事件 const todoObj = { id: nanoid(), title: this.title, done: false }; // 通知 App 组件去添加一个 todo 对象 this.$emit("addTodo", todoObj); // 清空输入 this.title = ""; }, },};</script><style scoped>.todo-header input { width: 578px; height: 28px; font-size: 14px; border: 1px solid #ccc; border-radius: 4px; padding: 4px 7px; margin-bottom: 10px;}.todo-header input:focus { outline: none; border-color: rgba(82, 168, 236, 0.8); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);}</style>

MyList.vue 组件

该组件即为 ul 标签包裹着 MyItem.vue 组件的果皮真正的果肉在 MyItem.vue 组件里面~~<template> <ul class="todo-main"> <!-- :todo,动态绑定,供 MyItem.vue 使用 --> <!-- 自定义 updateTodo 事件,子传父,供子组件编辑更新数据 --> <MyItem v-for="todoObj in todos" :key="todoObj.id" :todo="todoObj" :checkTodo="checkTodo" :deleteTodo="deleteTodo" @updateTodo="updateTodo" /> </ul></template><script>import MyItem from "./MyItem.vue";export default { name: "MyList", components: { MyItem }, props: ["todos", "checkTodo", "deleteTodo", "updateTodo"],};</script><style scoped>.todo-main { margin-left: 0px; border: 1px solid #ddd; border-radius: 2px; padding: 0px;}.todo-empty { height: 40px; line-height: 40px; border: 1px solid #ddd; border-radius: 2px; padding-left: 5px; margin-top: 10px;}</style>

MyItem.vue 组件

获取焦点的时候要用 $nextTick (等 DOM 节点更新后执行),或者用 setTimeout 异步包裹也能达到同样的效果Vue2.x 不能监测 到 对象属性的添加或删除。因为 Vue.js 在 初始化实例时 将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue2.x 转换它,才能让它是响应的。所以,当我们想要在 data 中或者 data 中的对象添加新的属性时,我们需要使用 Vue.set() 和 vm.$set(),否则是无法触发视图更新的。<template> <li> <label> <!-- 复选框,:checked 单向绑定 todo 是否已完成,@change 检测复选框的变化 --> <input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)" /> <!-- 非编辑状态下,在 sapn 标签中展示 todo --> <span v-show="!todo.isEdit">{{ todo.title }}</span> <!-- 绑定失去焦点事件,更新内容。ref 打标识,用于自动获取焦点 --> <input type="text" style="height: 22px" v-show="todo.isEdit" :value="todo.title" @blur="handleBlur(todo, $event)" ref="inputTitle" /> </label> <!-- 删除 todo --> <button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button> <!-- 编辑状态下,展示输入框,隐藏编辑按钮。 --> <button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button> </li></template><script>export default { name: "MyItem", //
本文链接地址:https://www.jiuchutong.com/zhishi/299544.html 转载请保留说明!

上一篇:Python标准库之os(python标准库在哪个目录)

下一篇:vue的computed和watch的区别(vue中computed作用)

  • 荣耀magic3至臻版和华为p50pro怎么选(荣耀magic3至臻版和magic5哪个好)

    荣耀magic3至臻版和华为p50pro怎么选(荣耀magic3至臻版和magic5哪个好)

  • 微信音视频邀请通知铃声怎么恢复(微信发送视频邀请有音乐怎么弄的)

    微信音视频邀请通知铃声怎么恢复(微信发送视频邀请有音乐怎么弄的)

  • 微信健康码在哪里可以看得到(微信健康码在哪里申请)

    微信健康码在哪里可以看得到(微信健康码在哪里申请)

  • 国产oled屏手机有哪些(国产oled屏幕哪个牌子最好)

    国产oled屏手机有哪些(国产oled屏幕哪个牌子最好)

  • 电信基站对人体有辐射吗(电信基站是干嘛的)

    电信基站对人体有辐射吗(电信基站是干嘛的)

  • 华为nova7手机耳机怎么用(华为nova7手机耳机插上去没反应)

    华为nova7手机耳机怎么用(华为nova7手机耳机插上去没反应)

  • 把对方加入黑名单还能看到朋友圈吗(把对方加入黑名单,对方知道吗)

    把对方加入黑名单还能看到朋友圈吗(把对方加入黑名单,对方知道吗)

  • 为什么抖音音浪不显示(为什么抖音音浪越来越少)

    为什么抖音音浪不显示(为什么抖音音浪越来越少)

  • b站为啥占好多手机内存(b站为啥占好多内存)

    b站为啥占好多手机内存(b站为啥占好多内存)

  • 摄像头为什么用着用着就离线了(摄像头为什么用着用着就离线了,录有录进去)

    摄像头为什么用着用着就离线了(摄像头为什么用着用着就离线了,录有录进去)

  • 华为荣耀6plus能不能使用移动网络(华为荣耀6plus能用微信吗)

    华为荣耀6plus能不能使用移动网络(华为荣耀6plus能用微信吗)

  • 苹果手机充电自动开机是怎么回事啊(苹果手机充电自己开机吗)

    苹果手机充电自动开机是怎么回事啊(苹果手机充电自己开机吗)

  • 吉祥科技的验证码是干嘛的(吉祥科技数码卖手机怎么样)

    吉祥科技的验证码是干嘛的(吉祥科技数码卖手机怎么样)

  • 三星s8qq怎么分身(三星手机怎么qq分身)

    三星s8qq怎么分身(三星手机怎么qq分身)

  • iphone连上wifi没有图标(为什么iphone连上wifi却没有wi-fi图标)

    iphone连上wifi没有图标(为什么iphone连上wifi却没有wi-fi图标)

  • p30pro没有指示灯吗(华为p30手机指示灯设置在哪里)

    p30pro没有指示灯吗(华为p30手机指示灯设置在哪里)

  • 微信怎样查找聊天记录(微信怎样查找聊天记录删掉的)

    微信怎样查找聊天记录(微信怎样查找聊天记录删掉的)

  • 知道抖音号怎么查电话(知道抖音号怎么找回抖音账号)

    知道抖音号怎么查电话(知道抖音号怎么找回抖音账号)

  • 微信加不上附近人怎么回事(微信加不上附近人咋办)

    微信加不上附近人怎么回事(微信加不上附近人咋办)

  • xs怎么开机(xs如何开机关机)

    xs怎么开机(xs如何开机关机)

  • 前端面试:浅拷贝和深拷贝的区别?(前端常见面试)

    前端面试:浅拷贝和深拷贝的区别?(前端常见面试)

  • 一般纳税人抵扣小规模期间的专票怎么解决
  • 税种有哪几种
  • 增值税调整 以前签的合同怎么办?
  • 小规模增值税纳税申报
  • 快递费属于哪个商品编码
  • 税票百分之十三怎么算
  • 抵扣认证的发票怎么查询
  • 增值税计算为什么是销项减进项
  • 技术服务费怎么结转成本
  • 救护车能随便买吗
  • 行政单位应缴财政收入预算会计分录
  • 人力资源外包服务规范
  • 核定征收公司有什么用
  • 劳务公司开票是开劳务费还是工程服务
  • 物业费增值税是什么税
  • 小汽车残值率多少合适
  • 三证合一之前
  • 税务部门罚没收入会计分录
  • 增值税扣税项目
  • 技术服务发票的单位是什么
  • 代开普票需要具备哪些资料?
  • 离线开票时间超限怎么办 发票都已经报送
  • 分摊的水费应取得何种扣除凭证
  • 异地缴纳附加税怎么申报
  • 资产负债一并转让增值税
  • 赠送客户产品账务处理
  • 考后审核是什么时候
  • 贷款利率计算公式表格
  • 材料没入库的会计分录
  • 小规模公司注销流程及费用
  • 应收账款和预收账款有什么区别
  • 下列关于企业发生的税费说法正确的是
  • 金融公司呆账对当事人有什么影响
  • 业务招待费有
  • uni-app实例教程
  • 油猴脚本插件官网
  • 企业要普通发票有什么用
  • 马勒舞曲
  • ci框架文档
  • 金融业的特殊性指的是
  • 潜水时看到的鱼
  • 滴滴发票开公司名称可以抵扣进项吗
  • 土地使用权的折旧年限和折旧方法
  • php邮箱smtp发信源码
  • 财产赔偿账务处理办法
  • 以非现金资产清偿债务的,债权人应当
  • 物流企业会计核算的具体内容包括
  • 股本及溢价
  • 购买牵引车和挂车购车流程
  • 电子回单可以入档案吗
  • 利息收入怎么入账
  • 增值税专用发票丢了怎么补救
  • 公积金由个人全部交,单位违法吗法吗
  • 个税申报属于哪个部门的职责
  • 金融企业里面的债务
  • 佣金是买卖股票都收吗
  • 会计准则允许预提吗
  • 对存在标的资产的亏损合同,企业应首先对标的资产
  • 商标注册费计入哪个科目
  • 删除sql server2019
  • WIN10开启高性能模式
  • iphone制造成本
  • xp系统怎么打开开机启动项
  • vmware下载不了
  • linux修改分组
  • win8.1 ie浏览器
  • win8操作系统如何安装
  • g++编译debug
  • win7系统怎么把其他盘空间给c盘
  • linux配置静态
  • nodejs child_process
  • VectorField2D
  • 细说javascript
  • 命令最常用的类型有
  • jquery判断值是否为空
  • unity3dextractor
  • python toga
  • 企业吸收合并资质
  • 车辆购置税和消费税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设