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 相关文章推荐
代码生成器 document.write()
Apr 15 Javascript
基于jquery的动态创建表格的插件
Apr 05 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
Feb 07 Javascript
浅析JQuery中的html(),text(),val()区别
Sep 01 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 Javascript
浅谈Angularjs中不同类型的双向数据绑定
Jul 16 Javascript
layui从数据库中获取复选框的值并默认选中方法
Aug 15 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
总结对比php中的多种序列化
2016/08/28 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
犀利的js 函数集合
2009/06/11 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
javascript模拟命名空间
2015/04/17 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
Vue响应式原理详解
2017/04/18 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Windows下安装Scrapy
2018/10/17 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
python批量创建指定名称的文件夹
2019/03/21 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
利用python在excel中画图的实现方法
2020/03/17 Python
Python错误的处理方法
2020/06/23 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
Django实现简单的分页功能
2021/02/22 Python
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
学习演讲稿范文
2014/05/10 职场文书
红色经典观后感
2015/06/18 职场文书
创业计划书之书店
2019/09/10 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
Python绘画好看的星空图
2022/03/17 Python