使用Vue实现一个简单的To-Do-List应用

541 阅读3分钟
前言

先上个运行截图,然后咱再来一部一部分析代码制作,这个小应用,以为很简单,实际制作过程中还是遇到了些问题。

初始界面就是上面那样的,因为背景是白色的,看着感觉有点怪啊,输入代办事项后如下:
添加待办事项,勾选后会给文本添加个删除线的样式,点击X号可以实现删除。 使用Vue来实现这个小应用,Vue是数据驱动视图的,那我们来分析下需要哪些数据,有哪些事件:
1.用户输入的数据,待办事项用一个对象来保存,为什么用对象呢,因为一个待办事项是否完成了,也属于待办事项的属性,而用户输入内容的为待办事项的内容。对象模型如下item:{value:'',check:'false'}
2.建立一个数组来存放所有的待办事项。List:[]
事件:用户输入后点击enter的事件,用户点击完成的事件,用户点击X的删除事件
事件发生时的执行的方法:用户输入完成点击enter后,创建一个待办事项对象,value属性为用户输入的内容,check为fasle表示未完成,然后将这个对象放入List中。用户点击小方框的事件:修改对应的待办事项的check为true。为文字添加删除线样式。用户点击X的事件:在List中删除对应的待办事项。具体代码:

html部分:
    <div id="app" style="width: 200px;margin: 20px auto;">
		<!--输入框 -->
        <input type='text' v-model='value' :placeholder="ts" @keyup.enter='inptEvent'/>
		
        <div v-if='List.length>0'>
            <div style="padding:10px 0;" v-for='(item,index) in List' :key="item.value">
             	<!--选择框  -->
             	<input type="checkbox" @click='checkEvent(item)' > 
             	<!--待办事项  -->
                <span :class='{active:item.checked}'>{{item.value}}</span>
                <span style="padding:0 5px;cursor: pointer;background-color: #f3f3f3;" @click='deleteA(index)'>X</span>
            </div> 

        </div>

        <div v-else>
            <p>输入待办事项吧</p>
        </div>

    </div>
JavaScript 部分:
    var app = new Vue({
        el: '#app',
        data: {
            //value存放用户输入的信息
            value: '',
            //提示信息
            ts: '请输入待办事项',
            //存放待办事项的数组
            List:[],
        },
        methods: {
        	//用户输入完成点击enter的事件
            inptEvent(){
            	//待办事项对象
                let item = {}
                //将待办事项的选择状态设置为false
                item.checked = false;
                //将待办事项的value设置为用户输入的value
                item.value = this.value;
                //将待办事项对象放入待办事项数组
                this.List.unshift(item);
                //将value设置为空
                this.value = '';
            },
            //用户点击复选框的事件
            checkEvent(item){  
               item.checked=!item.checked;
            },
            //用户点击X的事件
            deleteA(index){
            	//将待办事项从数组中删除
                this.List.splice(index,1)
            }
        },
    })
CSS部分:
//为文字添加下划线
    .active{
      text-decoration: line-through;
  }

坑来了,:key="item.value"v-for 循环待办事项这个数组的 key值不能重复,如果你使用List数组的index的值,就悲剧了.如果有若干个待办事项,将最后一个的前一个待办事项打勾,设置为以完成,然后再把它删除.你会发现,最后一个待办事项明明你没打勾,现在却打上勾了.我们来分析下怎么回事啊,假设,最后一个待办事项的key值为n,那么前一个的key值就是n-1,当你删除最后一项的前一项时,最后一项的key值变为n-1,因为先前存在key值为n-1的DOM元素,内容被更新,DOM元素会被复用.所以呀这个key值不能为index,可以为待办事项对象设置一个唯一的id做为key值,也可以将待办事项的value值设为key值,这样的话得加个判断,让用户不能输入重复的待办事项,如果有重复的待办事项,会出现和上面一样的问题