VUE3 实现ToDoList经典任务清单增强终结版

废话不都说,详情看代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/vue.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }

        #app {
            width: 888px;
            background-color: #cabdbd;
            margin: 0 auto;
        }

        h2 {
            color: aliceblue;
        }

        .top {
            height: 50px;
            display: flex;
            align-items: center;
            background-color: #866668;
            padding: 0 30px;
        }

        .entry {
            height: 35px;
            width: 300px;
            border-radius: 40px;
            padding-left: 10px;
            margin-left: 400px;
            border: #000 2px solid;
        }

        h3 {
            padding-left: 30px;
            margin: 10px 0;
        }

        .line {
            height: 5px;
            background-color: aliceblue;
        }

        .item {
            padding: 15px 0 5px 0;
            margin: 0 50px;
            border-bottom: 2px solid #000;
            display: flex;
            align-items: center;
        }

        .items {
            height: 200px;
            overflow: auto;
            padding-bottom: 20px;

        }

        .items::-webkit-scrollbar {
            display: none;
        }

        img {
            width: 20px;
            height: 20px;
            margin-left: 640px;
        }

        input[type="checkbox"] {
            margin-right: 20px;
            margin-left: 10px;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="top">
            <h2>To do List</h2>
            <input class="entry" type="text" placeholder="请输入内容  Enter确认添加" v-model.trim="temp" @keyup.enter="addItem">
        </div>
        <div class="line"></div>
        <h3>正在进行中</h3>
        <div class="list">
            <div class="items">
                <div class="item" v-for="(item,index) in undoList" :key="item.name">
                    <input type="checkbox" v-model="item.done">
                    <!-- 如果状态为0 显示 文本 -->
                    <span v-show="item.state==0" @dblclick="item.state=1;tempEdit=item.name">{{item.name}}</span>
                    <!-- 状态为1显示输入框 -->
                    <input type="text" v-model="tempEdit" v-show="item.state==1"
                        @keyup.esc="item.state=0;tempEdit=item.name" @keyup.enter="item.state=0;item.name=tempEdit"
                        @blur="item.state=0;item.name=tempEdit">
                    <!--  @blur="item.state==0;item.name=tempEdit" -->
                    <img @click="removeItem(item)" src="./img/shanchu.png" alt="">
                </div>
            </div>
            <div class="line"></div>
            <h3>已经完成</h3>
            <div class="list">
                <div class="items">
                    <div class="item" v-for="(item,index) in doneList" :key="item.name">
                        <input type="checkbox" v-model="item.done">
                        <!-- 如果状态为0 显示 文本 -->
                        <span v-show="item.state==0" @dblclick="item.state=1;tempEdit=item.name">{{item.name}}</span>
                        <!-- 状态为1显示输入框 -->
                        <input type="text" v-model="tempEdit" v-show="item.state==1"
                            @keyup.esc="item.state=0;tempEdit=item.name" @keyup.enter="item.state=0;item.name=tempEdit"
                            @blur="item.state=0;item.name=tempEdit">
                        <!--  @blur="item.state==0;item.name=tempEdit" -->
                        <img @click="removeItem(item)" src="./img/shanchu.png" alt="">
                    </div>
                </div>
            </div>
            <script>
                Vue.createApp({
                    data() {
                        return {
                            //清单列表
                            //getItem获取本地数据
                            //||"[]" 如果获取不到转换为空的数组
                            list: JSON.parse(localStorage.getItem("list") || "[]"),
                            // 存放列表的数据
                            // list: [{ name: "学习Vue", done: false, state: 0 },
                            // { name: "学习,学个屁", done: true, state: 0 }],
                            // 存放输入的数据
                            temp: '',
                            // 修改框的临时数据
                            tempEdit: ''
                        }
                    },
                    methods: {
                        addItem() {
                            // 如果文本为空 就返回
                            if (this.temp === "") {
                                return;
                            }
                            // unshift 添加到最前面
                            this.list.unshift({
                                name: this.temp,
                                done: false,
                                state: 0
                            })
                            // 清空临时框
                            this.temp = "";
                        },
                        removeItem(item) {
                            // // 从list列表中找到删除元素的下标
                            // // var ind = this.list.findIndex(value=>value==item);
                            // var ind = this.list.indexOf(item);
                            // // 从list列表的ind下标开始删除一个
                            // this.list.splice(ind, 1);


                            //弹出确认框
                            var flag = window.confirm("你确定要删除我吗");
                            //执行删除
                            if (flag) {
                                //查找符合条件的元素的索引值
                                var ind = this.list.findIndex(value => value.title === item.title);
                                //splice从第ind删除一个
                                this.list.splice(ind, 1);
                            }
                        }
                    },
                    computed: {
                        //通过计算把现有的list数据 分成正在完成 和正在进行两部分
                        undoList() {
                            //filter  是数组的过滤函数 如果返回真 则对当前遍历的数据保留
                            return this.list.filter(item => !item.done)
                        },
                        doneList() {
                            return this.list.filter(item => item.done)
                        }
                    },
                    watch: {
                        "list": {
                            handler() {
                                // setItem 设置本地数据
                                //JSON.stringify把js对象抓换为json字符串
                                //JSON.parse 把字符串转换为js对象
                                localStorage.setItem("list", JSON.stringify(this.list));
                            },
                            deep: true,
                        }
                    }
                }).mount("#app")
            </script>

</body>

</html>

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值