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上获取焦点,不知道是什么情况?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值