vue实现todolist单页面应用


Posted in Javascript onApril 11, 2017

刚学习vue的小伙伴不知道从哪入手,很多网上的教程一来就搭建脚手架环境,可以新手更本看不懂,建议还是用引入script的方式引入vue.js,然后看官网的教程,再拿那这个demo练练手,也可以看看官网的demo,然后再去熟悉安装,搭建单页面应用。

效果:

vue实现todolist单页面应用

功能:

在input输入文字点击按钮或者enter,下面会添加一个带复选框和文字还有删除按钮的li

用到的vue函数:

data,methods,watch,还有localstorage

页面非常简单:

先写外面的盒子,这里用到v-model双向绑定input的值和js里的inputValue

<div id="vue-todolist" class="todolistDiv">
  <span> todolist</span>
  <input class="ipt" type="text" v-model="inputVaule" />
</div>

然后在js绑定:

var vm=new Vue({
 el: '#vue-todolist',
 data: { 
  inputVaule:""
 }
})

页面添加ul和button:

<div id="vue-todolist" class="todolistDiv">
  <span> todolist</span>
    <input class="ipt" type="text" v-model="inputVaule" v-on:keyup.enter="add"/>
    <button v-on:click="add" class="btn">add</button>
    <ul >
      <li v-for="item in items" >
      <div class="liDiv">       
        <label>{{item.text}}</label>      
      </div>
      </li>
    </ul>
  </div>

button的点击事件为methods里的add方法v-for就是遍历items数组,将item的text显示

js里的data要加上items,还要有methods:

var vm=new Vue({
 el: '#vue-todolist',
 data: { 
  items:[{text:'1'},{text:'2'}]
  inputVaule:""
 },
 methods:{
   add:function(){
    this.items.push({text:this.inputVaule});
    this.inputVaule="";
  }
 }
})

点击按钮时,就添加input的值到items数组,并重置值。这样view就自动更新li添加一项,因为数据变化页面也会实时更新,vue的好处开始浮现

在li加上checkbox和delete,再给items添加completed这个属性,代表完成没有,使用v-bind:class,意思是item.completed是true,那么就会使用complete这个class,如果false,就没有class,complete这个class我们可以设置字体red,便于识别。

<li v-for="item in items" >
      <div class="liDiv">
        <input type="checkbox" v-model="item.completed">
        <label v-bind:class="{ complete:item.completed }">{{item.text}}</label>
        <button v-on:click="removeTodo(item)" class="btn">x</button>
      </div>
</li>

js这里添加了completed属性,还添加了removeTodo方法用于删除指定item:

var vm=new Vue({
 el: '#vue-todolist',
 data: { 
  items:[{text:'1',completed:true},{text:'2',completed:false}]
  inputVaule:""
 },
 methods:{
   add:function(){
    this.items.push({text:this.inputVaule});
    this.inputVaule="";
  },
  removeTodo: function (todo) {
   this.items.splice(this.items.indexOf(todo), 1)
  }
 }
})

现在已经完善的差不多了,可是我们发现,每次浏览器刷新,或者页面重新打开,我们新增加的li就会消失,那我们要保存我们添加的数据,要怎么做呢,很简单,html5为我们提供了localstorage这个东西,它保存数据在浏览器,使得页面刷新或者重新打开或者浏览器关闭也不会数据丢失。

我们一步步来看怎么实现

1.添加li时保存数据到localstorage:

var STORAGE_KEY = 'todos-vuejs'//名称
var todoStorage = { 
 save: function (todos) {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
 }
}

很简单,调用setItem传入key和我们的items数组即可,这时候我们要用到watch函数了,去监视items数组,如果items数组有变化即添加或者删除,我们都自动调用todostorage的save方法

watch:{
  items:{
    handler:function(items){
      todoStorage.save(items)
    },
    deep:true//一定要加
  }
 }

我们打开浏览器的开发者选项的dom,然后添加几个li,可以看到localstorage里面已经保存了todos-vuejs,里面保存了我们添加的item数据

2.数据保存到浏览器的localstorage后,我们的items数组的数组源是不是也应该设置为localstorage的呢

添加fetch方法

var STORAGE_KEY = 'todos-vuejs'//名称
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))
 }
}

还有我们data里的items:

data: {
  items:todoStorage.fetch(),//直接从localstroage拿数据
  inputVaule:""
 },

到这里功能就齐全了,小伙伴可以再添加更多的功能,比如全部删除等,

最后附上源码https://github.com/gdmec07140603/todolist.git

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

Javascript 相关文章推荐
js中数组Array的一些常用方法总结
Aug 12 Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
Dec 13 Javascript
js 作用域和变量详解
Feb 16 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
解决ztree搜索中多级菜单展示不全问题
Jul 05 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
JavaScript设计模式之调停者模式实例详解
Feb 03 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
Apr 11 #Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 #Javascript
javascript数组去重常用方法实例分析
Apr 11 #Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 #Javascript
vuejs绑定class和style样式
Apr 11 #Javascript
vue监听滚动事件实现滚动监听
Apr 11 #Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
Apr 11 #jQuery
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP eval函数使用介绍
2013/12/08 PHP
初识PHP中的Swoole
2016/04/05 PHP
php微信支付接口开发程序
2016/08/02 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
linux下python抓屏实现方法
2015/05/22 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python 进程的几种创建方式详解
2019/08/29 Python
简单了解python中的与或非运算
2019/09/18 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
如何写python的配置文件
2020/06/07 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
挂科检讨书范文
2014/02/20 职场文书
《春雨》教学反思
2014/04/24 职场文书
王力宏牛津大学演讲稿
2014/05/22 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
实习生矿工检讨书
2014/10/13 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python