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 相关文章推荐
JavaScript 常用函数库详解
Oct 21 Javascript
jquery 新浪网易的评论块制作
Jul 01 Javascript
iphone safari不支持position fixed的解决方法
May 04 Javascript
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
Backbone.js中的集合详解
Jan 14 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 Javascript
浅析Vue.js 中的条件渲染指令
Nov 19 Javascript
详解vue父子组件关于模态框状态的绑定方案
Jun 05 Javascript
vue基于better-scroll仿京东分类列表
Jun 30 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 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python实现从字典中删除元素的方法
2015/05/04 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python3调用R的示例代码
2018/02/23 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
旷课检讨书2000字
2014/01/14 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
医院领导班子整改方案
2014/10/01 职场文书
2014年采购部工作总结
2014/11/20 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
大学生实习介绍信
2015/05/05 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL