基于VUE-CLI实现待办事项

前言

在没有VUEX和全局事件总线的情景下,采用了最原始的逐级传递的方式,实现了每一个VueComponent实例化对象之间的信息传递来完成这个功能


1 配置VUE脚手架

1.1 VUE脚手架的概念

VUE脚手架是VUE提供的标准化开发工具 , CLI为command line interface,直译过来就是命令行接口工具

1.2 初始化脚手架

1.2.1 全局安装

打开cmd输入

npm install -g @vue/cli

1.2.2 创建脚手架

切换到要创建项目的目录,然后命令创建项目

vue create xxxxx

1.2.3 启动项目

npm run serve

备注:

如果下载缓慢,在cmd里切换到npm淘宝镜像

npm config set registry https://registry.npm.taobao.org

2 通过集成开发环境打开脚手架

3.文件说明


这个文件夹是存放所有的vue组件的

app是所有组件的汇总,main.js文件则是整个项目的入口

public目录下的index.html则是整体的展现,在这设置了一个div容器

4.项目文件

首先打开app.vue文件输入下面代码

app.vue

<template><div id="root"><div class="todo-container"><div class="todo-wrap"><my-header :receive="receive"/><List :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/><my-footer :todos="todos" :checkAllTodo="checkAllTodo" :clearAllTodo="clearAllTodo"/></div></div></div>
</template><script>import MyHeader from "@/components/MyHeader";import MyFooter from "@/components/MyFooter";import List from "@/components/List";export default {name: 'App',components: {MyHeader,MyFooter,List,},data() {return {todos: [{id: '001', title: '吃饭', done: true},{id: '002', title: '睡觉', done: false},{id: '003', title: "喝水", done: true},]}},methods: {receive(todoObj) {this.todos.unshift(todoObj)},checkTodo(nid) {this.todos.forEach((todo) => {if (todo.id === nid) todo.done = !todo.done})},deleteTodo(nid) {this.todos = this.todos.filter((todo) => {return todo.id !== nid})},checkAllTodo(done) {this.todos.forEach((todo) => {todo.done = done})},clearAllTodo() {this.todos = this.todos.filter((todo) => {return !todo.done})}}}
</script><style>body {background-color: #fff;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.03);border-radius: 4px;}.btn-danger {color: #fff;background-color: #da4f49;border: 1px solid #bd362f;}.btn-danger:hover {color: #fff;background-color: #bd362f;}.btn:focus {outline: none;}.todo-container {width: 600px;margin: 0 auto;}.todo-container .todo-wrap {padding: 10px;border: 1px solid #ddd;border-radius: 5px;}
</style>

MyFooter.vue

<template><div class="todo-footer" v-show="total"><label><input type="checkbox" :checked="isAll" @click="checkAll"></label><span><span>已完成{{ doneTotal }}</span>  /全部{{ total }}</span><button class="btn btn-danger" @click="clearAll">清除已完成任务</button></div>
</template><script>export default {name: 'MyFooter',components: {},props: ['todos', 'checkAllTodo', 'clearAllTodo'],computed: {doneTotal() {return this.todos.reduce((pre, current) => pre + (current.done ? 1 : 0), 0)},total() {return this.todos.length},isAll() {return this.doneTotal === this.total && this.total > 0}},methods: {checkAll(event) {this.checkAllTodo(event.target.checked)},clearAll() {this.clearAllTodo()}}}
</script><style scoped>.todo-footer {height: 40px;line-height: 40px;padding-left: 20px;cursor: pointer;}.todo-footer label {display: inline-block;margin-right: 20px;cursor: pointer;}.todo-footer label input {position: relative;top: -1px;vertical-align: middle;margin-right: 5px;}.todo-footer button {float: right;margin-top: 5px;}
</style>

MyHeader.vue

<template><div class="todo-header"><input type="text" placeholder="请输入任务名称,回车确认" @keyup.enter="add"></div>
</template><script>import {nanoid} from 'nanoid'export default {name: 'MyHeader',data() {return {title: ""}},props: ['receive'],components: {},methods: {add(event) {//校验数据if (!event.target.value.trim()) return alert("输入不能为空")//包装用户的输入const todoObj = {id: nanoid(), title: event.target.value, done: false}//把数据交给appthis.receive(todoObj)//格式化输入this.title = ""}},}
</script><style scoped>.todo-header input {width: 560px;height: 28px;font-size: 14px;border: 1px solid #ccc;border-radius: 4px;padding: 4px 7px;}.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>

List.vue

<template><div><ul class="todo-main"><Item v-for="todoObj in todos" :key="todoObj.id" :todoObj="todoObj" :deleteTodo="deleteTodo":check-todo="checkTodo"/></ul></div>
</template><script>import Item from "@/components/Item";export default {name: 'List',components: {Item,},props: ["todos", "checkTodo", 'deleteTodo']}
</script><style scoped>.todo-main {margin-left: 0;border: 1px solid #ddd;border-radius: 2px;padding: 0;}.todo-empty {height: 40px;line-height: 40px;border: 1px solid #ddd;border-radius: 2px;padding-left: 5px;margin-top: 10px;}
</style>

List.vue的子组件item.vue

<template><div><li><label><input type="checkbox" :checked="todoObj.done" @click="handCheck(todoObj.id)"/><span>{{ todoObj.title }}</span></label><button class="btn btn-danger" @click="handDelete(todoObj.id)">删除</button></li></div>
</template><script>export default {name: 'Item',components: {},props: ['todoObj', 'checkTodo', 'deleteTodo'],methods: {handCheck(nid) {//通知app组件done值取反this.checkTodo(nid)},handDelete(nid) {if (confirm('确定删除吗?')) {this.deleteTodo(nid)}}}}
</script><style scoped>li {list-style: none;height: 36px;line-height: 36px;padding: 0 5px;border-bottom: 1px solid #ddd;}li label {float: left;cursor: pointer;}li label li input {vertical-align: middle;margin-right: 6px;position: relative;top: -1px;}li button {float: right;display: none;margin-top: 3px;}li:before {content: initial;}li:last-child {border-bottom: none;}li:hover {background-color: darkgray;}li:hover button {display: block;}
</style>

5.项目运行

打开终端

输入

npm run serve

6.项目思路

基于VUE-CLI实现待办事项功能相关推荐

  1. vue学习实现待办事项功能

    下载vue.js的网址为:https://cn.vuejs.org/v2/guide/installation.html#直接用-lt-script-gt-引入 代码实现 <!DOCTYPE h ...

  2. 前端基于vue企业微信JS-SDK语音识别功能开发(同公众号)

    前端基于vue企业微信JS-SDK语音识别功能开发(同公众号) 微信JS-SDK 1.前期准备 前端代码撰写 微信JS-SDK 前端需要实现一个功能,如录音,拍照,分享,地理位置等,前端想要实现这些功 ...

  3. 原生vue.js实现待办事项清单,支持增删改查

    源码部分: <!DOCTYPE html> <html lang="en"> <head><!--设置页面的utf-8编码格式--> ...

  4. vue实现ToDoList待办事项/清单

    1.这个功能运用的知识点比较多,computed计算,watch监听,directives自定义指令和methods定义事件,还有一些属性绑定,列表渲染,表单绑定指令,按键修饰符,表单修饰符等... ...

  5. php实现待办事项功能,PHP倒计时和待办事项

    我有几个问题.我需要每天17:00(下午5点)倒计时. 17:00之后,我想回复一条消息.然后,定时器需要在23.59之后复位.我怎样才能做到这一点与PHP?PHP倒计时和待办事项 我的下一个问题是关 ...

  6. 实现微信小程序和手机app(基于vue)PDF预览功能

    引言:最近在做微信小程序和手机端app开发(基于vue),实现一个pdf预览功能. 需求:点击pdf列表,跳转到预览pdf页面,页面上强制阅读10s后,显示一个按钮返回,更新阅读状态: 要求:不能调用 ...

  7. 基于vue element-ui 封装上传图片组件 功能:上传,删除,预览,上传图片水印,拖拽排序,上传进度条等

    学习目标: 我们在开发后台时肯定避免不了上传图片的功能 例如: 上传图片回显 上传完成 : 预览查看 , 删除等 如果是图片列表,还可能让你拖动图片排序 有的后台项目可能要给图片添加水印,添加标记 有 ...

  8. 基于vue 实现 excel导出导入功能

    第一步下包 excel导入导出功能需要我们下载哪些包? 在vue-element-admin中有着详细的文档查看: Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js ...

  9. vue项目通过命令行传参实现多环境配置(基于@vue/cli)

    大多数项目都有生产环境和开发环境,一般情况下应该够了,但是有时候还需要sit,uat,本地等环境,这时候假如要通过注释的方式切换环境就相当麻烦了. 如果可以像下面这样切换环境就方便了 npm run ...

最新文章

  1. synchronized原理_Synchronized 实现原理
  2. 四轴飞行器实践教程1.1.2飞行器的发展
  3. 小程序订单点击不同页面_小程序跳转页面参数丢失
  4. Atitit.css 规范 bem  项目中 CSS 的组织和管理
  5. 开始使用asp.net ajax的控件工具包AJAX Control Toolkit
  6. 实际程序调用IndexWriter* writer = NULL
  7. Java 洛谷 P1149 火柴棒等式
  8. html:(30):继承和特殊性
  9. mounted钩子函数_Vue 探索之路——生命周期和钩子函数的一些理解
  10. Swift 与 JSON 数据
  11. Redis内核原理及读写一致企业级架构深入剖析1-综合组件环境实战
  12. Gensim word2vec计算多个词之间的相似度
  13. 使用case语句的3个诀窍
  14. Mac系统使用VS Code编译Bootstrap 4
  15. 产品设计的基本原则是什么
  16. c语言中函数的递归调用,用C语言函数调用与递归解决问题
  17. Solidity 系列教程
  18. 2021黑马程序员Java面试宝典笔记(完整版)
  19. 暗影精灵5触摸板双指手势失效问题
  20. 软件------关于spacedesk分屏软件的使用说明(包括下载和具体启动方式)

热门文章

  1. Linux系统中安装软件的几种方式
  2. 【电子产品】ThinkPad S5 Intel(R) Dual Band Wireless-AC 3165 网卡驱动莫名其妙挂掉
  3. 制作一个属于自己的BHO吧!(C#)
  4. kali的网络设置及三种网络模式
  5. 依锥彻怕燎方跃涣牧叵邻牟辟岗俅
  6. I2S总线学习:I2S数据格式
  7. 邻居表项的mcast_solicit数量
  8. VS中SVN的简介、安装和使用(安装+汉化+使用)
  9. 通信协议英语单词解析
  10. Matplotlib画各种论文图