1. 程式人生 > >vue.js 實現 todo list 任務表單

vue.js 實現 todo list 任務表單

---------------------------------------

有關點選複選框 未完成數字的變化 bug 已經修復   

  新增

 clickInput: function(lsi){

        var om = this.items.indexOf(lsi);       //獲取相應的索引值
         if(this.items[om].isChecked)
               {                             //如果選中未完成任務減一 否則加一

            this.num =  this.num-1;    
               }
               else
               {
                   this.num =  this.num+1;
               }
     },

-----------------------------------------

今天在騰訊課堂學習關於用vue.js 製作todo list 任務表單   然後自己寫了一遍,用來加強記憶和總結

-------------------------------------------------------------

如果有錯誤 望指正 ps;反正我執行時沒有錯誤偷笑偷笑

部分功能還未實現   後續將新增

----------------------------------------------------------

html 原始碼

<!DOCTYPE html>
<html>
<head>
	
	<meta charset='utf-8' />
	<title>todo list</title>
	<link rel="stylesheet" type="text/css" href="./todo-list.css" />
</head>
<body>
     <div id="head">
     	  任務計劃列表
     </div>    
     <div id="main">
     	  <div class="name">新增任務</div>
     	  <!-- 新增鍵盤事件   並將input的value值 用intext獲取 -->
     	  <input type="text" v-model='intext' v-on:keyup.enter='addList' />
     	  <!-- 新增隱藏的指令 並給出依據 show show不等於0時展示 -->
     	  <div class="task" v-show="show">
     	      <span><i v-text="num"></i>個任務未完成</span>
     	      <div class="task_type">
     	      	<a href="javascript:void(0)">所有任務</a>
     	  	    <a href="javascript:void(0)">未完成任務</a>
     	  	    <a href="javascript:void(0)">完成任務</a>
     	      </div>
     	  	  
     	  </div>
     	  <div class="list">
     	  	   <ul>
     	  	      <!-- 迴圈產生li標籤及其內部標籤   並判斷是否有內容 沒有則不展示 因為在初始化時會產生一個空標籤所以才會判斷 以免產生空任務 -->
     	  	   	   <li v-for='item in items' v-show='item.text' >
     	  	   	    <!-- 動態新增class 當點選選中時新增hidd 目的是顯示覆選框和刪除  
     	  	   	          input 的選擇中狀態由 ischecked 的值決定 -->
     	  	   	   	  <div id="box"><input type="checkbox" :class='{hidd:item.isChecked}' v-model='item.isChecked' v-on:click='clickInput(item)'/></div>
     	  	   	   	  <!-- class和前面一樣裡面包含選中時出現刪除線  標籤內的內容由text決定 而text由輸入內容決定 -->
     	  	   	   	  <span v-on:click='clickselect(item)' :class='{hidd:item.isChecked}' >{{item.text}}</span>
     	  	   	   	  <!-- class相同   新增點選刪除函式  並且函式接受當前的item,由於去判斷在陣列中的索引 確定位置 -->
     	  	   	   	  <a href="javascript:void(0)"  :class='{hidd:item.isChecked}' v-on:click='deletList(item)'>刪除</a>
     	  	   	   </li>
     	  	   	   
     	  	   </ul>
     	  	   </ul>
     	  </div>
     </div>
     <script type="text/javascript" src='./vue.js'></script>
     <script type="text/javascript" src='./todo-list.js'></script>
</body>
</html>

js 原始碼

// 例項化


var main = new Vue({
    el:"#main",
    
    data:{
    	items:[
    		 {text:null , isChecked:false },   // ischecked 判斷是否被選中
    	],
    	intext:'請輸入任務',
       
        show: 0,    // 新增判斷是否展示輸入框下的工作列依據 初始為0 不展示 
        num: 0,         //  判斷未完成的任務數量 初始為0 即沒有新增任何任務時
    },

    methods:{
    	 // 新增任務函式
    	addList: function(){
              console.log(this.intext);
              console.log(this.items[0].text);
              if(this.intext.length!=0)      // 判斷輸入框是否有輸入內容
              {
              	this.items.push({          
              	 		text: this.intext,  // 將輸入內容新增到 items.text內
              	 		isChecked:false,     // 使剛輸入的未被選中 (注意即使不新增這句也會不選中
              	 		                      // 但是陣列items內相應位置就不會出現ischecked 會使後面需要選中時出現問題)
              	 		
              			});
              	this.show = this.show+1;    //每新增一個任務 任務的總個數加一
              	this.num =  this.num+1;      // 每新增一個任務 未完成任務的總個數加一
              }
              
              // 清空輸入框內容
              this.intext = '';  
    	},
    	// 點選文字選中複選框
    	clickselect:function(lsi){
    		   console.log(this.items.indexOf(lsi));
    		   var om = this.items.indexOf(lsi);       //獲取相應的索引值
    		   this.items[om].isChecked = !this.items[om].isChecked;  // 當點選相應任務時
    		   														// 選擇的狀態發生改變
               if(this.items[om].isChecked)
               {                             //如果選中未完成任務減一 否則加一

    		      this.num =  this.num-1;     
               }
               else
               {
               	   this.num =  this.num+1; 
               }
    	},
clickInput: function(lsi){                     //新增點選input標籤時 num 也變化
        var om = this.items.indexOf(lsi);       //獲取相應的索引值
         if(this.items[om].isChecked)
               {                             //如果選中未完成任務減一 否則加一
            this.num =  this.num-1;     
               }
               else
               {
                   this.num =  this.num+1; 
               }
     },
    	// 點選刪除
    	deletList: function(lsi){
    		  var om = this.items.indexOf(lsi);
    		  // this.items[om].text=''; //這樣並沒有完全從陣列清除
              
              // 當點選刪除時 未完成任務數量變化
              // 變化依據任務是否已經被選中而變化
              // 不能將移出陣列先執行 這樣就會導致無法判斷是否之前已經被選中
              if( this.items[om].isChecked == true)   
              {
              	this.num =  this.num;
              }
              else
              {
              	this.num =  this.num-1;
              }
              this.show= this.show-1;     // 任務總數減一  如果總數等於0時 隱藏
    		  this.items.splice(om,1);     // 移出相應任務

    	}
    }


})

css 原始碼

body{padding: 0;margin:0; font-size: 14px; font-family: '微軟雅黑';}
ul,li,a,div,input,span {padding: 0; margin:0;}
a{text-decoration: none; color: #000;}
ul,li {list-style-type: none;}
/*頂部佈局*/
#head {
		width: 100%;
		height: 50px;
		font-size: 18px;
		font-weight: bold;
		line-height: 50px;
		text-align: center; }

#main {
	   width: 400px;
	   margin:5px auto;

}
#main .name {
	    font-size: 16px;
	    font-weight: bold;
}
#main input {
	   width: 400px;
	   height: 35px;
       outline: none;
}
#main .task{
	  margin:10px 0;
	  height: 32px;
	  overflow: hidden;
	  line-height: 32px;
}
#main .task span {
	 display: block;
	 height: 30px;
	 float: left;
}
#main .task  .task_type{
	 float: right;
}
#main .task  .task_type a{
		display: block; 
		height: 30px; 
		padding: 0 5px;
		line-height: 30px; 
		border:1px solid #ccc;
		text-decoration: center;
		float: left;
		margin-left: 10px;
	    }
#main .list {
	   width: 400px;

	   clear: both;
}
#main .list ul{
	  width: 400px;
}
#main .list ul li {
	  width: 400px;
	  height: 30px;
	  line-height: 30px;
	  display: block;
	  overflow: hidden;
}
#main .list ul li #box {
	 float: left;
	 width: 16px;
	 height:16px;
	 margin:7px 0;
}
#main .list ul li input{
	 display: none;
	
	 width: 16px;
	 height:16px;
	


}
#main .list ul li:hover a{
     display: block;
}
#main .list ul li:hover input{
     display: block;
}
#main .list ul li .hidd {
	display: block;
	color: #ccc;
	text-decoration: line-through;
}
#main .list ul li span {
	 display: block;
	 float: left;
	 margin-left: 20px;

}

#main .list ul li a{

	 display: none;
	 float: left;
	 margin-left: 20px;
}

下面是我執行的介面

 剛進入介面

新增第一個任務

   

滑鼠懸停

        

單擊選中

        

單擊刪除

-----------------------------------------------------------------

原諒我還不太會用csdn

-------------------------------------------------------------------