基于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 相关文章推荐
javascript 用记忆函数快速计算递归函数
Mar 15 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
jQuery操作select的实例代码
Jun 14 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
Mar 07 Javascript
jQuery EasyUI之验证框validatebox实例详解
Apr 10 jQuery
Vue 组件间的样式冲突污染
Aug 31 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
react-router4按需加载(踩坑填坑)
Jan 06 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
Aug 29 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 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服务器页面间跳转实现方法
2012/08/02 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
python实现飞机大战游戏
2020/10/26 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
python编写实现抽奖器
2020/09/10 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
工程监理应届生求职信
2013/11/09 职场文书
暑期培训随笔感言
2014/03/10 职场文书
小学生学习感言
2014/03/10 职场文书
超市中秋节促销方案
2014/03/21 职场文书
企业金融服务方案
2014/06/03 职场文书
公司户外活动总结
2014/07/04 职场文书
普通党员对照检查材料
2014/08/28 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
孙振耀退休感言
2015/08/01 职场文书
预备党员表决心的话
2015/09/22 职场文书
Spring实现内置监听器
2021/07/09 Java/Android