vue.js实现备忘录功能的方法


Posted in Javascript onJuly 10, 2017

这个vue实现备忘录的功能demo是K在github上找到的,K觉得这是一个用来对vue.js入门的一个非常简单的demo,所以拿在这里共享一下。

(尊重他人劳动成果,从小事做起~  demo原github地址:https://github.com/vuejs/vue)

一、实现效果

 vue.js实现备忘录功能的方法

二、代码展示

<!DOCTYPE html>
<html>

  <head>
    <meta charset="UTF-8">
    <title>备忘录</title>
    <link rel="stylesheet" type="text/css" href="css/index.css" rel="external nofollow" />
    <style>[v-cloak] { display: none; }</style>
  </head>

  <body>
  <section class="todoapp">
   <header class="header">
    <h1>todos</h1>
    <input class="new-todo"
     autofocus autocomplete="off"
     placeholder="What needs to be done?"
     v-model="newTodo"
     @keyup.enter="addTodo">
   </header>
   <section class="main" v-show="todos.length" v-cloak>
    <input class="toggle-all" type="checkbox" v-model="allDone">
    <ul class="todo-list">
     <li v-for="todo in filteredTodos"
      class="todo"
      :key="todo.id"
      :class="{ completed: todo.completed, editing: todo == editedTodo }">
      <div class="view">
       <input class="toggle" type="checkbox" v-model="todo.completed">
       <label @dblclick="editTodo(todo)">{{ todo.title }}</label>
       <button class="destroy" @click="removeTodo(todo)"></button>
      </div>
      <input class="edit" type="text"
       v-model="todo.title"
       v-todo-focus="todo == editedTodo"
       @blur="doneEdit(todo)"
       @keyup.enter="doneEdit(todo)"
       @keyup.esc="cancelEdit(todo)">
     </li>
    </ul>
   </section>
   <footer class="footer" v-show="todos.length" v-cloak>
    <span class="todo-count">
     <strong>{{ todos.length }}</strong> {{ remaining | pluralize }} left
    </span>
    <ul class="filters">
     <li><a href="#/all" rel="external nofollow" :class="{ selected: visibility == 'all' }">All</a></li>
     <li><a href="#/active" rel="external nofollow" :class="{ selected: visibility == 'active' }">Active</a></li>
     <li><a href="#/completed" rel="external nofollow" :class="{ selected: visibility == 'completed' }">Completed</a></li>
    </ul>
    <button class="clear-completed" @click="removeCompleted" v-show="todos.length > remaining">
     Clear completed
    </button>
   </footer>
  </section>
    <footer class="info">
      <p>双击编辑一条备忘录</p>
    </footer>

  </body>

  <script language="JavaScript" src="js/director.js"></script>
  <script language="JavaScript" src="js/vue.js"></script>
  <script language="JavaScript" src="js/index_vue.js"></script>

</html>
// 本地缓存设置
// 防止页面关闭后,数据全部丢失的问题
var STORAGE_KEY = 'todos-vuejs-2.0'
var todoStorage = {
  
  // 获取本地存储中的内容
  fetch:function(){
    // JSON.parse()解析一个json字符串
    //  localStorage.getItem 从本地存储中获取STORAGE_KEY字段的值
    var todos = JSON.parse(localStorage.getItem(STORAGE_KEY)||'[]');
    //  foreach遍历todos,两个参数分别为遍历出的每一个子单元及对应的索引
    todos.forEach(function(todo,index){
      todo.id = index;
    })
    todoStorage.uid = todos.length;
    return todos;
  },
  
  // 保存时将内容写进本地存储
  save:function(todos){
    // localStorage.setItem 将todos转化成字符串存入本地存储,键名为STORAGE_KEY
    localStorage.setItem(STORAGE_KEY,JSON.stringify(todos))
  }
  
}

// 可视化状态过滤设置
//  包括全选(all)、选择未完成(active)、选择已完成(completed)
var filters = {
  all:function(todos){
    return todos;
  },
  
  //  filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
  active:function(todos){
    return todos.filter(function(todo){
      return !todo.completed;
    })
  },
  
  completed:function(todos){
    return todos.filter(function(todo){
      return todo.completed;
    })
  }
}


// vue实例化
var app = new Vue({
  
  //  data 参数设置
  data:{
    todos:todoStorage.fetch(),
    newTodo:'',
    editedTodo:null,
    visibility:'all'
  },
  
  //  watch 监视todos在本地储存中的变化
  watch:{
    todos:{
      handler:function(todos){
        todoStorage.save(todos)
      },
      deep:true
    }
  },
  
  //  computed 检测数据发生变动时执行函数
  computed:{
    
    filteredTodos:function(){
      return filters[this.visibility](this.todos)
    },
    
    remaining:function(){
      return filters.active(this.todos).length
    },
    
    allDone:{
      get:function(){
        return this.remaining === 0
      },
      
      set:function(value){
        this.todos.forEach(function(todo){
          todo.completed = value
        })
      }
      
    }
  },
  
  //  methods 方法设置
  methods:{
    addTodo:function(){
      var value = this.newTodo && this.newTodo.trim()
      if(!value){
        return;
      }
      this.todos.push({
        id:todoStorage.uid++,
        title:value,
        completed:false
      })
      this.newTodo = ''
    },
    
    removeTodo:function(todo){
      this.todos.splice(this.todos.indexOf(todo),1)
    },
    
    editTodo:function(todo){
      this.beforeEditCache = todo.title;
      this.editedTodo = todo
    },
    
    doneEdit:function(todo){
      if(!this.editedTodo){
        return;
      };
      this.editedTodo = null;
      todo.title = todo.title.trim()
      if(!todo.title){
        this.removeTodo(todo)
      }
    },
    
    cancelEdit:function(todo){
      this.editedTodo = null;
      todo.title = this.beforeEditCache
    },
    
    removeCompleted:function(){
      this.todos = filters.active(this.todos)
    }
  },
  
  directives:{
    'todo-focus':function(el,binding){
      if(binding.value){
        el.focus()
      }
    }
  }
})


// hashchange URL的片段标识符更改触发
function onHashChange(){
  var visbility = window.location.hash.replace(/#\/?/, '');
  if(filters[visbility]){
    app.visibility = visbility
  }else{
    window.location.hash = '';
    app.visbility = 'all'
  }
}

window.addEventListener('hashchange',onHashChange)
onHashChange()

// mount 手动挂载
app.$mount('.todoapp')

以上这篇vue.js实现备忘录功能的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery移动点击的项目到列表最顶端的方法
Jun 24 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
Bootstrap3制作搜索框样式的方法
Jul 11 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
JavaScript中清空数组的方法总结
Dec 02 Javascript
vue-router路由简单案例介绍
Feb 21 Javascript
vue如何从接口请求数据
Jun 22 Javascript
详解vue 模版组件的三种用法
Jul 21 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 Javascript
原生js拖拽功能制作滑动条实例代码
Feb 05 Javascript
AugularJS从入门到实践(必看篇)
Jul 10 #Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 #Javascript
AngularJS实用基础知识_入门必备篇(推荐)
Jul 10 #Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
Jul 09 #Javascript
详谈AngularJs 控制器、数据绑定、作用域
Jul 09 #Javascript
vue子父组件通信的实现代码
Jul 09 #Javascript
vue2中filter()的实现代码
Jul 09 #Javascript
You might like
php下封装较好的数字分页方法
2010/11/23 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
js 上传图片预览问题
2010/12/06 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Python装饰器的函数式编程详解
2015/02/27 Python
Python while 循环使用的简单实例
2016/06/08 Python
Python 性能优化技巧总结
2016/11/01 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
杭州时比特电子有限公司SQL
2013/08/22 面试题
工程力学硕士生的自我评价范文
2013/11/16 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
MySQL优化之慢日志查询
2022/06/10 MySQL