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 相关文章推荐
from 表单提交返回值用post或者是get方法实现
Aug 21 Javascript
JavaScript中解析JSON数据的三种方法
Jul 03 Javascript
js实现圆盘记速表
Aug 03 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
Jan 11 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
JS实现评价的星星功能
Aug 20 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
JS实现前端缓存的方法
Sep 21 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
浅谈JavaScript中this的指向问题
Jul 28 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 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获取访问设备信息的方法示例
2019/02/20 PHP
javascript新手语法小结
2008/06/15 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
jquery ajax abort()的使用方法
2010/10/28 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
成品库仓管员岗位职责
2014/04/06 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
面试通知邮件
2015/04/20 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js