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

Vue实现todolist功能

程序员文章站 2022-07-01 19:10:44
...

学习感悟:与原生JS不同,Vue完全是数据驱动的一个JS框架,即所有页面的改动,都要考虑如何与数据绑定并且如何去操作数据,从而改变页面的视图。而且Vue是一个MVVM框架。

todolisit实现功能

Vue实现todolist功能

完成任务的添加 删除 编辑等功能,以及已完成 未完成任务的分开,利用Vue里面的component函数,注册todolist组件,然后在html中引用。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<script src="file:///D|/前端/vue.js"></script>
<link rel="stylesheet" type="text/css" href="todo.css">
</head>

<body>
<div id ="root">
<to-do></to-do>
</div>
<script src="to-do list zujian.js"></script>
<script >
    new Vue ({
    el:"#root"
})
</script>
</body>
</html>

思路:如果页面有动态变化,就要考虑如何去绑定数据。用v-model来进行数据的双向绑定, 列表的数据可以将其存在一个数组中,然后用v-for指令来渲染到<ul><li></li></ul>中;此外还用了localStorage来存储输入数据,使得页面刷新时数据依旧存在。

代码如下:

Vue.component("to-do",{
	template:`
        <div class="box">
        <div class="input">
            <input type="text" placeholder="请输入事项" v-model="text" @keyup.13="add">
        </div>
        <div class="btns">
             <input type="button" value="全部" @click="changeStatus('all')" :class="{check:status=='all'}">
             <input type="button" value="未完成" @click="changeStatus('0')" :class="{check:status=='0'}">
             <input type="button" value="已完成" @click="changeStatus('1')" :class="{check:status=='1'}">
        </div>
        <ul class="lists">
            <li v-for="item in datas">
                <div v-if="item.edit==true">
                <span class="opt" @click="changeState(item)" :class="{red:item.state==1}"></span>
                <p @dblclick="edit(item)">
                   {{item.text}}
                </p>
                <span class="del" @click="del(item.id)">删除</span>
            </div>
            <div v-else> 
                <input type="text" v-model="item.text" @blur="edit(item)"><!--失去焦点   -->
            </div>
            </li>
        </ul>
        <div v-show="all.length==0">没有数据</div>  
    </div>
	`,
	   data:function(){   //在组件中数据必须是函数
	   	return {
        all:localStorage.todo?JSON.parse(localStorage.todo):[],
        text:"",
        status:"all"
    }
},
    methods:{
        add(){           //输入的文本生成一个对象,方便识别各个文本以及完成状态
            var obj={};
            obj.text=this.text;
            if(!obj.text){
                alert("请输入内容");
                return;
            }
            obj.id=Math.random()+new Date().getTime();//生成随机ID
            obj.state=0;//0表示未完成 1表示已完成
            obj.edit=true;
            this.all.push(obj);
            this.text="";
            localStorage.todo=JSON.stringify(this.all);//将数据变为字符串存储在localstorage中
        },
       changeStatus(val){           //改变全局信息状态
        this.status=val;
       } ,
       changeState(obj){        //改变当前信息状态 
           if(obj.state==0){
            obj.state=1;
           }
           else{
            obj.state=0;
           }
           localStorage.todo=JSON.stringify(this.all);
       },
       del(id){         //删除
                this.all= this.all.filter(function(obj){
                    if(obj.id!=id){
                        return obj;
                    }
                 })
                localStorage.todo=JSON.stringify(this.all);
       },
       edit(item){           //编辑
            item.edit=!item.edit;
            localStorage.todo=JSON.stringify(this.all);
       },
     
    },
    computed:{                                  //此语句尚未完全理解。。。
        datas:function(){              
          return   this.all.filter((obj)=>{     //在all中筛选出obj
               if(this.status=="all")
                {return obj;}
                else{
                    if(this.status==obj.state){
                        return obj;
                    }
                }
            })
        }
    }                                
    
})

上一篇: vue中的slot插槽

下一篇: todolist