欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue制作Todo List网页

程序员文章站 2022-11-15 10:10:54
vue学习完成todo list网页,供大家参考,具体内容如下 跟着老师学习vue,我喜欢清爽的界面,就自己改了样式,看起来还不错,以后就用来记录要做的事情,实用...

vue学习完成todo list网页,供大家参考,具体内容如下

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中文官网看,讲的很详细。

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