vue2的todolist入门小项目的详细解析


Posted in Javascript onMay 11, 2017

看完vue2的官方文档后,找个入门项目巩固下知识点,简单的todolsit是个不错的选择。

项目用到了vue.js vue.cli webpack ES6 node环境,完成项目后会对这些技术栈有了些了解。

准备开发环境

$ npm install -g vue-cli
$ vue init ,比如 vue init webpack todolist
$ cd todolist
$ npm install
$ npm run dev
  1. 安装谷歌插件vue.js devtools
  2. 下载vue.js的webpack模板
  3. 下载todomvc的模板 (提供html和css)(也可以直接$ git clone https://github.com/tastejs/todomvc-app-template.git 来下载)
  4. 把todomvc的index.html拖到todolist文件夹去覆盖里面的index.html
  5. 打开todomvc的json文件,会看到 “todomvc-app-css”: “^2.0.0”,就是要你 npm install todomvc-app-css -S 从而下载该css
  6. 删点todolsit index.html的默认css,js引用,src文件夹下的main.js引入模板css(import‘todomvc-app-css/index.css')
  7. 引入vue(import Vue form ‘vue')
  8. 等写完代码后 $npm run build 一键打包构建,会看到dist文件夹

main.js的代码

//后面的为注释讲解, ~表示串联index.html的对应内容

import 'todomvc-app-css/index.css'
import Vue from 'vue'
//添加localStorage
var STORAGE_KEY = 'todos-vuejs-2.0'
var todoStorage = {
 fetch: function () {
  var todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')
  todos.forEach(function (todo, index) {
   todo.id = index
  })
  todoStorage.uid = todos.length
  return todos
 },
 save: function (todos) {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
 }
}
//用过滤器筛选出三种状态
var filters = {
 all(todos) {
  return todos
 },
 active(todos) {
  return todos.filter((todo) => {
   return !todo.completed
  })
 },
 completed(todos) {
  return todos.filter((todo) => {
   return todo.completed
  })
 },
}
let app = new Vue({
 el: '.todoapp',  // ~ <section class="todoapp">
 data: {
  msg: 'hello world',
  title: '待做清单',  // 渲染标题 ~ {{title}}
  newTodo: '',
   todos: todoStorage.fetch(), // ~ v-show="todos.length" ; ~ {{todos.length>1?'items':'item'}} 渲染 li ~ v-for="(todo,index) in filteredTodos" 
  editedTodo: '',  // 空的编辑对象
  hashName: 'all'  
 },
 
 watch: {
  todos: {
   handler: function (todos) {
    todoStorage.save(todos)
   },
   deep: true
  }
 },
 
 computed: {
  remain() {
   return filters.active(this.todos).length  //未完成事项的数量 ~ {{remain}}
  }, 
  isAll: {   // ~ v-model="isAll"
   get() {
    return this.remain === 0
   },
   set(value) {
    this.todos.forEach((todo) => {
     todo.completed = value
    })
   }
  },
  filteredTodos() {  //用hashName过滤出当前页面的todos ~ v-for="(todo,index) in filteredTodos" 
   return filters[this.hashName](this.todos)
  }
 },
 methods: {
  addTodo(e) { //输入值为空时,不添加(trim去除前后空格) ~ v-model.trim="newTodo" 
   if (!this.newTodo) {
    return
   }
   this.todos.push({
    id: todoStorage.uid++,
    content: this.newTodo,
    completed: false //结合v-model 根据completed状态绑定样式 ~:class="{completed:todo.completed; ~ v-model="todo.completed"
   })
   this.newTodo = ''
  },
  removeTodo(index) {  //绑定x样式,点击删除该todo ~ @click="removeTodo(index)"
   this.todos.splice(index, 1)
  },
  editTodo(todo) {     //编辑 ~ @dblclick="editTodo(todo)"
   this.editCache = todo.content //储存编辑前的内容
   this.editedTodo = todo // 点击编辑里面的内容而不是只是空文本框~ editing:todo==editedTodo}"
  },
  doneEdit(todo, index) { //失去焦点后 ~ @blur="doneEdit(todo)";@keyup.enter="doneEdit(todo)"
   this.editedTodo = null //不存在编辑了或者说编辑已完成
   if (!todo.content) { //如果编辑后没有内容了,删除该todo
    this.removeTodo(index)
   }
  },
  cancelEdit(todo) {  //按esc键取消此次编辑操作 ~ @keyup.esc="cancelEdit(todo)">
   this.editedTodo = null   
   todo.content = this.editCache //当esc取消编辑时,还原编辑前的内容
  },
  clear() { //点击清除已完成的功能 ~ @click="clear"
   this.todos = filters.active(this.todos) //获取并渲染未完成的事项 ~ 
  }
 },
 directives: {  //自定义属性 ~ v-focus="todo == editedTodo"
  focus(el, value) { //文本框双击获取焦点
   if (value) {
    el.focus()
   }
  }
 }
})
//hash(url地址中#以及之后的字符)
function hashChange() { 
// ~ :class="{selected:hashName=='all'}";:class="{selected:hashName=='active'}";:class="{selected:hashName=='completed'}"
 let hashName = location.hash.replace(/#\/?/, '') //正则表达式去除#/?,获取如all,active,completed
 if (filters[hashName]) {  //如果过滤状态的hashName存在
  app.hashName = hashName //给整个app变量里的hashName赋上那个值
 } else {
  location.hash = ''  //取消
  app.hashName = 'all' //否则就赋值‘all',回到全部事项的页面
 }
}
window.addEventListener('hashchange', hashChange) //全局监听hash

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery remove方法应用详解
Nov 22 Javascript
裁剪字符串trim()自定义改进版
Apr 10 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
javascript的函数作用域
Nov 12 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
VUE 自定义组件模板的方法详解
Aug 30 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
Vue实现导航栏的显示开关控制
Nov 01 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 Javascript
ionic实现底部分享功能
May 11 #Javascript
学习使用Bootstrap栅格系统
May 11 #Javascript
jQuery实现的简单在线计算器功能
May 11 #jQuery
学习使用Bootstrap页面排版样式
May 11 #Javascript
Angularjs 与 bower安装和使用详解
May 11 #Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 #Javascript
es6学习笔记之Async函数基本教程
May 11 #Javascript
You might like
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
Javascript开发包大全整理
2006/12/22 Javascript
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
python regex库实例用法总结
2021/01/03 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
毕业生的自我评价
2013/12/30 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
3分钟演讲稿
2014/04/30 职场文书
总经理岗位职责范本
2015/04/01 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
创业计划书之干洗店
2019/09/10 职场文书