首页 > 编程 > JavaScript > 正文

Vue制作Todo List网页

2019-11-19 16:43:47
字体:
来源:转载
供稿:网友

Vue学习完成Todo List网页,供大家参考,具体内容如下


跟着老师学习Vue,我喜欢清爽的界面,就自己改了样式,看起来还不错,以后就用来记录要做的事情,实用性还蛮强。

Vue非常容易上手,运用到了双向绑定机制,即HTML里的DOM元素与JS里的Vue实例进行双向绑定,只要Vue实例中的代理数据改变,HTML中的实际数据就会跟着变,这和原生的Js的命令驱动模式不同,它是数据驱动模式,通过数据的改变来控制DOM的变化。什么意思呢?我们会在接下去的学习中慢慢实践。

Todo List这个网页用到了很多Vue的指令,在这里我贴出一部分代码,全部代码请戳我的Github

以下是HTML部分

<div class="main"> <h3 class="big-title">添加任务:</h3> <input   placeholder="在此添加任务"   class="task-input"   type="text"  v-model="things"  @keyup.enter="addTodo" /> <ul class="task-count" v-show="list.length">  <li>   {{unCheckedLength}}个任务未完成</li>  <li class="action">   <a :class="{active: visibility == 'all'}" href="#all" rel="external nofollow" >所有任务</a>   <a :class="{active: visibility == 'unfinished'}"href="#unfinished" rel="external nofollow" >未完成任务</a>   <a :class="{active: visibility == 'finished'}"href="#finished" rel="external nofollow" >完成任务</a>  </li> </ul> <div class="tasks">  <span class="no-task-tip" v-show="!list.length">还没有添加任何任务</span>  <ul class="todo-list">   <li class="todo" v-for="item in filteredList" :class="{completed: item.isChecked,editing:item === editItem}" >    <div class="view">     <div class="word">      <input class="toggle" type="checkbox" v-model="item.isChecked" >      <label @dblclick="editTodo(item)">{{item.title}}</label>     </div>     <button class="destroy" type="text" @click="deleteTodo(item)">×</button>    </div>    <input      v-focus="editItem === item"      class="edit"      type="text"      v-model="item.title"     @blur="edited"     @keyup.enter="edited"     @keyup.esc="cancel(item)"    />   </li>  </ul> </div></div>

Vue实例部分

var vm = new Vue({ el: ".main", data: {  list:list,  things:"",  editItem:"",  beforeTitle:"",  visibility:"all",  inputId:"", },  watch:{  list:{   handler:function(){    store.save("todolist",this.list)   },   deep:true  } }, computed:{  unCheckedLength(){   return this.list.filter(function(item){    return item.isChecked == false   }).length  },  filteredList(){      return filter[this.visibility] ? filter[this.visibility](this.list) : list  } }, methods: {  addTodo(ev){   if(this.things !== ""){    var item = {     title:this.things,     isChecked:false,     }    this.list.push(item)   }       this.things = "";  },  deleteTodo(item){   var index = this.list.indexOf(item);   this.list.splice(index,1);  },  editTodo(item){    this.beforeTitle = item.title;   this.editItem = item  },  edited(item){   this.editItem = ""  },  cancel(item){   item.title = this.beforeTitle;   this.editItem = "";   this.beforeTitle = ""  } }, directives:{  "focus":{            update(el,binding){    if(binding.value){     el.focus()    }   }  } }});

这是一个基本的Vue实例,el是和DOM元素连接的挂载点,data是代理数据,在DOM的内容中如果要用到代理数据就用{{xxx}}表示,比如{{list}},{{visibility}},而当data中的代理数据出现在DOM标签里的时候就不需要用花括号。

new Vue({ el: ".main", data: {  list:list,  things:"",  editItem:"",  beforeTitle:"",  visibility:"all",  inputId:"", }})

Vue要用大的方法都放在methods部分

methods: {   addTodo(ev){    if(this.things !== ""){     var item = {      title:this.things,      isChecked:false,      }     this.list.push(item)    }        this.things = "";   },   deleteTodo(item){    var index = this.list.indexOf(item);    this.list.splice(index,1);   },   editTodo(item){     this.beforeTitle = item.title;    this.editItem = item   },   edited(item){    this.editItem = ""   },   cancel(item){    item.title = this.beforeTitle;    this.editItem = "";    this.beforeTitle = ""   } }

还有计算属性

computed:{  unCheckedLength(){   return this.list.filter(function(item){    return item.isChecked == false   }).length  },  filteredList(){      return filter[this.visibility] ? filter[this.visibility](this.list) : list }}

观察属性

watch:{  list:{   handler:function(){    store.save("todolist",this.list)   },   deep:true  }}

自定义属性

directives:{  "focus":{            update(el,binding){    if(binding.value){     el.focus()    }   }  }}

在HTML中要绑定这些数据,Vue也提供了一套指令:

v-bind绑定一个或多个特性,一般用于绑定class和style, v-on 绑定事件, v-show,v-if都是根据条件渲染元素,v-for是渲染列表…等等,我就不一一赘述了。可以去Vue中文官网看,讲的很详细。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表