Vue入门案例---ToDoList


仿 ToDoList官方

功能展示

1.初始页面

在这里插入图片描述

<template>
  <div>
      <!-- 输入框 -->
      <input type="text" @keyup.enter="keyup" v-model.trim="value">

      <!-- 正在进行 -->
      <h2>正在进行({
    
    {
    
     yesSize }})</h2>
      <ul>
          <li v-for="(item,index) in list" v-show="!item.done" :key="index"> 
            <!-- 复选框 -->
            <!-- 取消复选框的默认选中行为 -->
            <input type="checkbox" @click.prevent="changeDone(item)">
            
            <!-- 点击文字修改状态为输入框 -->
            <!-- 当点击的下标和当前下标一致的时候,让输入框显示 -->
            <span @click="changeState(index,item)" v-show="index !== updateIndex">{
    
    {
    
     item.value }}</span>  
            <input type="text" v-model="updateValue" v-show="index === updateIndex" @blur="update">

            <a href="javascript:;" @click="del(index)">删除</a>
        </li>
      </ul>
      <h2>已完成({
    
    {
    
     noSize }})</h2>
      <ul>
          <li v-for="(item,index) in list" v-show="item.done" :key="index"> 
            <!-- 复选框 -->
            <input type="checkbox" @click.prevent="changeDone(item)" checked>

            <!-- 点击文字修改状态为输入框 -->
            <!-- 当点击的下标和当前下标一致的时候,让输入框显示 -->
            <span @click="changeState(index,item)" v-show="index !== updateIndex">{
    
    {
    
     item.value }}</span>  
            <input type="text" v-model="updateValue" v-show="index === updateIndex" @blur="update">

            <a href="javascript:;" @click="del(index)">删除</a>
        </li>
      </ul>
  </div>
</template>

2.在输入框输入内容,按回车,添加到正在进行的列表

在这里插入图片描述

//键盘按下事件
        keyup(){
    
    
            //输入框内容不能为空
            if(this.value.trim() == '') return;

            //按下回车,把输入框的值添加到正在进行的事件列表
            this.list.push(
                {
    
    
                    value : this.value,
                    done :false   //默认未完成
                }
            );
            this.value = '';
        },

3.点击文本,变为输入框,可以对内容进行修改

在这里插入图片描述

changeState(index,item){
    
    
            // console.log(index);
            // 告诉它要修改的下标
            this.updateIndex = index;
            // 让事件列表的输入框的值为传过来的item值(传过来的item值为上面输入框里面的值)
            this.updateValue = item.value;
        },

4.文本框失焦,输入框隐藏,值变为修改后的值

在这里插入图片描述

//失焦事件,当失焦的时候,让输入框隐藏
        update(){
    
    
            //失焦的时候
            // this.list[this.updateIndex]是一个对象
            this.list[this.updateIndex].value = this.updateValue;

            //失焦的时候让点击的下标和当前下标不一致,输入框就隐藏了
            this.updateIndex = -1;
        },

5.点击“x”,删除内容

在这里插入图片描述

 //删除
        del(index){
    
    
            //当前状态是修改状态的时候不能删除
            if(this.updateIndex === -1){
    
    
                this.list.splice(index,1);
            }
        },

6.点击正在进行的列表的内容前面的复选框,事件从正在进行的列表添加到已经完成的列表

在这里插入图片描述

//复选框,点击复选框,事件从正在进行列表添加到已完成列表
        changeDone(item){
    
    
            //改变v-show的值
            item.done = !item.done;
        },

7.点击已经完成的列表的内容前面的复选框,事件从已经完成的列表添加到正在进行的列表

在这里插入图片描述

//复选框,点击复选框,事件从正在进行列表添加到已完成列表
        changeDone(item){
    
    
            //改变v-show的值
            item.done = !item.done;
        },

8计算事件列表的数量

// 计算属性求事件列表的事件数量
    computed :{
    
    
        yesSize(){
    
    
            let array =  this.list.filter(item => {
    
    
                return item.done == false;
            })
            return array.length;
        },
        noSize(){
    
    
            let array =  this.list.filter(item => {
    
    
                return item.done == true;
            })
            return array.length;
        }
    },

9.使用localstorage把事件保存到本地,并监听事件列表的变化

//保存到本地
        save(){
    
    
            localStorage.setItem('toDoList',JSON.stringify(this.list));
        }
// 监听,监听list的改变,只要一改变就保存到本地
    watch : {
    
    
        list : {
    
    
            handler(array){
    
    
                localStorage.setItem('toDoList',JSON.stringify(array));
            },
            deep : true
        }
    },
//生命周期函数
    //初创期,只要一运行就会执行的函数
    created(){
    
    
        let list = localStorage.getItem('toDoList');
        if(list){
    
    
            this.list = JSON.parse(list);
        }
    },

完整代码

<template>
  <div>
      <!-- 输入框 -->
      <input type="text" @keyup.enter="keyup" v-model.trim="value">

      <!-- 正在进行 -->
      <h2>正在进行({
    
    {
    
     yesSize }})</h2>
      <ul>
          <li v-for="(item,index) in list" v-show="!item.done" :key="index"> 
            <!-- 复选框 -->
            <!-- 取消复选框的默认选中行为 -->
            <input type="checkbox" @click.prevent="changeDone(item)">
            
            <!-- 点击文字修改状态为输入框 -->
            <!-- 当点击的下标和当前下标一致的时候,让输入框显示 -->
            <span @click="changeState(index,item)" v-show="index !== updateIndex">{
    
    {
    
     item.value }}</span>  
            <input type="text" v-model="updateValue" v-show="index === updateIndex" @blur="update">

            <a href="javascript:;" @click="del(index)">删除</a>
        </li>
      </ul>
      <h2>已完成({
    
    {
    
     noSize }})</h2>
      <ul>
          <li v-for="(item,index) in list" v-show="item.done" :key="index"> 
            <!-- 复选框 -->
            <input type="checkbox" @click.prevent="changeDone(item)" checked>

            <!-- 点击文字修改状态为输入框 -->
            <!-- 当点击的下标和当前下标一致的时候,让输入框显示 -->
            <span @click="changeState(index,item)" v-show="index !== updateIndex">{
    
    {
    
     item.value }}</span>  
            <input type="text" v-model="updateValue" v-show="index === updateIndex" @blur="update">

            <a href="javascript:;" @click="del(index)">删除</a>
        </li>
      </ul>
  </div>
</template>

<script>
export default {
    
    
    data(){
    
    
        return {
    
    
            // 输入框的值
            value : '', 
            // 数组,存放添加进去的事件列表项 
            list :[],
            //要修改的元素下标
            updateIndex : -1,
            //修改框中的内容
            updateValue : ''
        }
    },
    // 计算属性求事件列表的事件数量
    computed :{
    
    
        yesSize(){
    
    
            let array =  this.list.filter(item => {
    
    
                return item.done == false;
            })
            return array.length;
        },
        noSize(){
    
    
            let array =  this.list.filter(item => {
    
    
                return item.done == true;
            })
            return array.length;
        }
    },
    // 监听,监听list的改变,只要一改变就保存到本地
    watch : {
    
    
        list : {
    
    
            handler(array){
    
    
                localStorage.setItem('toDoList',JSON.stringify(array));
            },
            deep : true
        }
    },
    //生命周期函数
    //初创期,只要一运行就会执行的函数
    created(){
    
    
        let list = localStorage.getItem('toDoList');
        if(list){
    
    
            this.list = JSON.parse(list);
        }
    },
    methods :{
    
    
        //键盘按下事件
        keyup(){
    
    
            //输入框内容不能为空
            if(this.value.trim() == '') return;

            //按下回车,把输入框的值添加到正在进行的事件列表
            this.list.push(
                {
    
    
                    value : this.value,
                    done :false   //默认未完成
                }
            );
            this.value = '';
        },
        //点击元素后修改元素的状态
        changeState(index,item){
    
    
            // console.log(index);
            // 告诉它要修改的下标
            this.updateIndex = index;
            // 让事件列表的输入框的值为传过来的item值(传过来的item值为上面输入框里面的值)
            this.updateValue = item.value;
        },
        //失焦事件,当失焦的时候,让输入框隐藏
        update(){
    
    
            //失焦的时候
            // this.list[this.updateIndex]是一个对象
            this.list[this.updateIndex].value = this.updateValue;

            //失焦的时候让点击的下标和当前下标不一致,输入框就隐藏了
            this.updateIndex = -1;
        },
        //复选框,点击复选框,事件从正在进行列表添加到已完成列表
        changeDone(item){
    
    
            //改变v-show的值
            item.done = !item.done;
        },
        //删除
        del(index){
    
    
            //当前状态是修改状态的时候不能删除
            if(this.updateIndex === -1){
    
    
                this.list.splice(index,1);
            }
        },
        //保存到本地
        save(){
    
    
            localStorage.setItem('toDoList',JSON.stringify(this.list));
        }
        
    }
}
</script>

<style scoped>
    li{
    
    
        margin: 10px 0;
    }
</style>

猜你喜欢

转载自blog.csdn.net/qq_45021462/article/details/109587840