1. 程式人生 > >IMWeb訓練營作業【Vue 完成一個TodoList小玩意兒】

IMWeb訓練營作業【Vue 完成一個TodoList小玩意兒】

這是參加Vue課程的第四天,上了四節課之後對Vue的原理以及用法有了基本的瞭解,並跟著老師做了一個ToDoList的東西。在學習過程中,感觸最深的是: 與原生js 或者jQuery 不同,Vue完全是資料驅動的一個JS框架,即所有頁面的改動,都要考慮如何與資料繫結並且如何去操作資料,從而改變頁面的檢視。

       首先,說一下這個ToDoList的功能:

       介面如下圖所示:

          沒有新增任務時:

          

           添加了任務之後:

          

           在圖中的輸入框可以輸入任務,回車之後就會新增到下方的任務列表中;

           在任務列表中,可以勾選表示任務已完成,勾選之後任務被劃掉;

           也可以點刪除按鈕,刪除之後任務列表中就不存在該任務了;

           雙擊任務之後還可以編輯,可通過編輯動態改變任務名稱。

           思路:

           Vue是資料驅動的框架,因此考慮到頁面有動態變化的地方都要思考如何去繫結資料?

           比如,輸入框input的輸入資料,可以用v-model來進行資料的雙向繫結;

           列表的資料可以將其存在一個數組中,然後用v-for指令來渲染到<ul><li></li></ul>中;

           當添加了任務之後,“XX個任務已新增”也需要動態改變。

          Show you the Code:

<body>
    	<div id="title">
    		任務計劃列表
    	</div>
    	<div id="demo">
    		<p id="insert">新增列表</p>
    		<input id="content" type="text" v-on:focus = "clc()" @keyup.13 = "handle($event)"  v-model = "message" />
    		<div id="tip" v-show = "list.length">
    			<span id="Num">{{itemNum}}個任務已新增</span>
    			<span v-bind:class="{tips: true}">所有任務</span>
    			<span v-bind:class="{tips: true}">已完成任務</span>
    			<span v-bind:class="{tips: true}">未完成任務</span>
    		</div>
    		<div id="lis" v-show = "!list.length">還沒有新增任何任務</div>
    		<!-- <span >還沒有新增任何任務</span> -->
    		<ul>
    			<li v-for = "item in list">
    			<input type="checkbox" v-model = "item.isChecked" />
    			<span v-show = '!item.ifEdit' id="item" :class="{completed: item.isChecked}" v-on:keyup.13 = "change(item, $event)" v-on:dblclick = "test(item)">{{item.title}}</span>
    			<input 
    			v-focus = "item.ifEdit" 
    			type="text" 
    			v-show = "item.ifEdit" 
    			v-model = "item.title"
    			@blur = "recover(item)" />
    			<input id="btn" type="button" v-model="btnval" v-on:click = "del(item)" />
    			</li>
    		</ul>

    	</div>
        <script src="http://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.js"></script>        <!-- 引入vue.js -->
        <script>
        	//資料
        	
        	var list = [

        	];
        	
        	var data = {
        		message: "例如:吃飯睡覺打豆豆   提示 + 回車即可新增任務",
        		itemNum: 0,
        		list : list,
        		btnval: "刪除",
        		Ifcheck : false,        //可以利用它來實現全選
        		ifShow: true,
        		todoes : ""        //編輯的資料
        	}
        	//例項
        	var vm = new Vue({
        		el: '#demo',
        		data: data,
        		methods: {
        			test : function(){
        				alert("Yes");
        			},
        			clc : function(){
        				this.message = "";
        			},
        			handle : function(e){
        				//按下回車,將input裡面的資料push到list裡面,然後一一渲染list裡面的資料
        				if(this.message)
        				{
        					this.list.push({title: this.message, isChecked : false, isShow: true, ifEdit: false});
        					this.itemNum++;
        				}
        				this.message = "";
        				

        			},
        			del : function(e){  //找到item是在list 中的第幾項,然後刪除該項就可以
        				/*console.log(e);
        				e.isShow = false;*/
        				var index = this.list.indexOf(e);
        				this.list.splice(index, 1);           //splice不是原生的js,這個會觸發檢視更新的
        			},
        			test : function(e)
        			{
        				e.ifEdit = true;
        				this.todoes = e.title;
        			},
        			change : function(data, e){
        				/*console.log(e.type);
        				console.log(data.ifEdit);*/
        				e.ifEdit = false;
        			},
        			recover : function(e)
        			{
        				e.ifEdit = false;
        			}
        		},
        		//要使得新增加的input文字框獲取焦點,需要自定義指令
        		directives: {
        			'focus' : {
        				update(el, binding){
        					console.log(el);
        					console.log(binding);
        					if(binding.value)
        					{
        						el.focus();
        					}
        				}              //鉤子函式update函式,表示在input 框中的內容發生變化更新時,執行
        			}
        		}
        	});

        </script>

    </head>
    </body>
          

           存在的問題:

           利用自定義指令來實現當雙擊任務時,使得顯示的Input框獲取焦點。

          首先在選項物件中新增directives屬性,定義focus:{ update : function(el , binding){ if(binding.value) { el.focus(); } } }

          然後在 input 中設定 v-focus屬性為true ,但並不會在input上獲取焦點,不知道是什麼情況?