基于vuejs实现一个todolist项目


Posted in Javascript onApril 11, 2017

用vue.js实现一个todolist项目:input输入框输入的值会呈现在下方,并且会保存在localStorage里面,而且下方的列表点击之后也会有变化:

基于vuejs实现一个todolist项目

完整代码:

App.vue

<template>
 <div id="app">
 <h1 v-html = "title"></h1>
 <input v-model="newItem" v-on:keyup.enter="addNew" ></input>
 <ul>
  <li v-for="item in items" v-bind:class="{finished:item.isFinished}" v-on:click="toggleFinish(item)">{{item.label}}</li>
 </ul>
 </div>
</template>

<script>
import Store from './store'
export default {
 data:function(){
 return {
  title:"This Is A Todolist",
  items:Store.fetch(),
  newItem:""
 }
 },
 watch:{
 items:{
  handler:function(items){
  Store.save(items)
  },
  deep:true
 }
 },
 methods:{
 toggleFinish:function(item){
  item.isFinished = !item.isFinished
 },
 addNew:function(){
  this.items.push({
  label:this.newItem,
  "isFinished":false 
  })
  this.newItem=""
 }
 }
}
</script>

<style>
.finished{
 text-decoration:underline;
}
li{
 list-style:none;
 font-size:1.6em;
 margin-top:10px;
}
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
input{
 width:230px;
 height:40px;
 border-radius:20px;
 padding: 0.4em 0.35em;
 border:3px solid #CFCFCF;
 font-size: 1.55em;
}
</style>

store.js:

const STORAGE_KEY='todos-vuejs' 
export default {
 fetch:function(){
  return JSON.parse(window.localStorage.getItem(STORAGE_KEY)||'[]');
 },
 save:function(items){
  window.localStorage.setItem(STORAGE_KEY,JSON.stringify(items))
 }
}

详细解析

ES6的写法:

export default {
 name: 'hello',
 data () {
 return {
  msg: 'Welcome to Your Vue.js App'
 }
 }
}

export default 和 export 区别:

1).export与export default均可用于导出常量、函数、文件、模块等

2).你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用

3).在一个文件或模块中,export、import可以有多个,export default仅有一个

4).通过export方式导出,在导入时要加{ },export default则不需要

1.export

//demo1.js
export const str = 'hello world'
export function f(a){ return a+1}
对应的导入方式:

//demo2.js
import { str, f } from 'demo1' //也可以分开写两次,导入的时候带花括号

2.export default

//demo1.js
export default const str = 'hello world'
对应的导入方式:

//demo2.js
import str from 'demo1' //导入的时候没有花括号

当最简单导入的时候,这个值是将被认为是”入口”导出值。

在App.vue中完成项目编写:

组件布局将在这里设置,.vue文件将由vue-loader进行加载,.vue内同时包含html、css、js源码,使组件的独立,组件之间可以尽可能地解耦,便于开发维护

先看一个简单示例:只要isFinished为true就加下划线,false就不加下划线:

<template>
 <div id="app">
 <h1 v-html = "title"></h1>
 <ul>
  <li v-for="item in items" v-bind:class="{finished:item.isFinished}">{{item.label}}</li>
 </ul>
 </div>
</template>

<script>
import Hello from './components/Hello'

export default {
 data:function(){
 return {
  title:"this is a todolist",
  items:[
  {
   label:"coding",
   "isFinished":false
  },
  {
   label:"walking",
   "isFinished":true
  }
  ]
 }
 }
}
</script>

<style>
.finished{
 text-decoration:underline;
}
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

对于class的控制如上:如果是数组的话则可以渲染多个。

再进一步完成功能:点击没有下划线的li就会加下划线,有下划线就会去除下划线。

需要绑定事件:

<li v-for="item in items" v-bind:class="{finished:item.isFinished}" v-on:click="toggleFinish(item)">{{item.label}}</li>

还要添加方法toggleFinish():

methods:{
 toggleFinish:function(item){
  item.isFinished = !item.isFinished
 }
 }

将input输入的值添加到列表下面

添加input:

<input v-model="newItem" v-on:keyup.enter="addNew" ></input>

data对象添加:

newItem:""

添加方法:

//addNew:function(){
// alert(this.newItem)
// this.newItem=""   //添加后加输入框清空
//}

addNew:function(){
 this.items.push({
 label:this.newItem,
 "isFinished":false 
 })
 this.newItem=""
}

使用localStorage来存储

使用store.js:

const STORAGE_KEY='todos-vuejs' 
export default {
 fetch:function(){
  return JSON.parse(window.localStorage.getItem(STORAGE_KEY)||'[]');
 },
 save:function(items){
  window.localStorage.setItem(STORAGE_KEY,JSON.stringify(items))
 }
}

两个方法:一个设置,一个获取

导入:

import Store from './store'

打印一下Store,console.log(Store),可以看到:

基于vuejs实现一个todolist项目

由于加入代码中每次都需要添加还有删除等等,如果每次都用到store的方法,这就有点麻烦了,所以这里就要用到watch观察。

watch:{
 items:{
  handler:function(val,oldVal){
  console.log(val,oldVal)
  },
  deep:true
 }
 },

可以看到打印出:

基于vuejs实现一个todolist项目

使用save()方法:

watch:{
 items:{
  handler:function(items){
  Store.save(items)
  },
  deep:true
 }
 },

基于vuejs实现一个todolist项目

一有变化就会触发。

将fetch()方法也加进去:

<script>
import Store from './store'
export default {
 data:function(){
 return {
  title:"<span>?</span>this is a todolist",
  items:Store.fetch(),
  newItem:""
 }
 },
 watch:{
 items:{
  handler:function(items){
  Store.save(items)
  },
  deep:true
 }
 },
 methods:{
 toggleFinish:function(item){
  item.isFinished = !item.isFinished
 },
 addNew:function(){
  this.items.push({
  label:this.newItem,
  "isFinished":false 
  })
  this.newItem=""
 }
 }
}
</script>

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

Javascript 相关文章推荐
jQuery.ajax 用户登录验证代码
Oct 29 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
Dec 09 Javascript
js判断鼠标同时离开两个div的思路及代码
May 31 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
继续学习javascript闭包
Dec 03 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
Sep 20 jQuery
JavaScript 九种跨域方式实现原理
Feb 11 Javascript
小程序关于请求同步的总结
May 05 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
Vue分页插件的前后端配置与使用
Oct 09 Javascript
JavaScript语句错误throw、try及catch实例解析
Aug 18 Javascript
vue实现todolist单页面应用
Apr 11 #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
You might like
php中文件上传的安全问题
2006/10/09 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
Python 爬虫图片简单实现
2017/06/01 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
食品安全工作方案
2014/05/07 职场文书
奶茶店创业计划书
2014/08/14 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
学习十八大宣传标语
2014/10/09 职场文书
汽车车尾标语大全
2015/08/11 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python