Vue案例-小目标列表(上)

任务案例:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>任务案例</title>
    <style>
        /* 设置全局的字体和大小 */
        body {
            font-family: "微软雅黑";
            font-size: 14px;
        }

        /* 设置input字体大小 */
        input {
            font-size: 14px;
        }

        /* 取消padding和margin */
        body,
        ul,
        div,
        html {
            padding: 0;
            margin: 0;
        }

        /* 设置宽度,可用于居中显示 */
        .main {
            width: 800px;
            margin: 0 auto;
            border: 1px solid;
        }

        /* 设置li,取消默认的样式,设置行高,设置相对位置,设置边框 */
        li {
            list-style-type: none;
            line-height: 40px;
            /* 相对的是元素本身的位置进行的移位 */
            position: relative;
            /* transparent相当于一个透明的边框 */
            border: 1px solid transparent;
            /* 设置左右的padding看起来有点缩进 */
            padding: 0 20px;
        }

        /* 设置一个小方块 */
        li .status-span {
            display: block;
            width: 10px;
            height: 10px;
            background: #ccc;
            margin: 14px 10px 0 0;
            float: left;
        }

        /*  完成任务显示的界面*/
        li .status-end {
            background: #09f;
        }

        /* X的样式 */
        li .close {
            /* 相对父的布局 */
            position: absolute;
            color: #f00;
            font-size: 20px;
            line-height: 40px;
            height: 40px;
            /* 距离父li的右边20px */
            right: 20px;
            /* 光标呈现小手的状态 */
            cursor: pointer;
            /* 默认不显示 */
            /* display: none; */
            top: 0;
        }

        /*  鼠标经过li时候的颜色*/
        li:hover {
            border: 1px solid #09a;
        }

        /* 出现关闭的X */
        li:hover .close {
            display: block;
        }

        /* 输入任务的窗口 */
        .text-keyword {
            /* 盒子模型,加了该属性的padding和border都是计算在宽高之内了 */
            box-sizing: border-box;
            width: 100%;
            height: 40px;
            padding-left: 10px;
            /* 取消轮廓线 */
            outline: none;
        }
    </style>
</head>

<body>
    <!-- 最外层一个大div设置了居中显示和高度 -->
    <div id="app" class="main">
        <h2>小目标列表</h2>
        <div class="list">
            <h3>添加小目标</h3>
            <!-- 回车事件和双向数据绑定 -->
            <input type="text" class="text-keyword" placeholder="输入小目标后,按回车确认" @keyup.enter='addList'
                v-model="addText" />
            <!--如果noend等于0,就是全部完成了就显示‘全部完成了’,如果没有就是显示已完成多少条(prolist.length-noend)和未完成多少条(noend)-->
            <p>共有{{prolist.length}}个目标,{{noend==0?"全部完成了":'已完成'+(prolist.length-noend)+',还有'+noend+'条未完成'}}</p>
            <p>
                <input type="radio" name="chooseType" checked="true" @click='chooseList(1)' /><label>所有目标</label>
                <input type="radio" name="chooseType" @click='chooseList(2)' /><label>已完成目标</label>
                <input type="radio" name="chooseType" @click='chooseList(3)' /><label>未完成目标</label>
            </p>
        </div>
        <ul>
            <li class="li1" v-for="(list,index) in newList">
                <!--下面使用10px*10px的实心方块(.status-span)作为改变状态的按钮-->
                <span class="status-span" @click="changeType(index)" :class="{'status-end':list.status}"></span>
                <span>{{list.name}}</span>
                <!--下面的"X"初始不显示,当鼠标悬浮时才显示-->
                <span class="close" @click='delectList(list)'>X</span>
            </li>
        </ul>
    </div>
</body>
<script src="vue.js"></script>
<script type="text/javascript">
    new Vue({
        el: "#app",
        data: {
            addText: '',
            //name-名称,status-完成状态
            prolist: [
                { name: "HTML5", status: false },
                { name: "CSS3", status: false },
                { name: "vue", status: false },
                { name: "react", status: false }
            ],
            newList: [],
            curType: 0
        },
        computed: {
            //filter方法对数组所有元素依次应用回调函数,返回一个新数组,包含所有回调函数返回true的元素。
            //计算属性,返回未完成目标的条数,就是数组里面status=false的条数
            noend: function () {
                return this.prolist.filter(function (item) {
                    return !item.status
                }).length;
            }
        },
        methods: {
            addList() {
                // 添加先的清单
                //添加进来默认status=false,就是未完成状态
                this.prolist.push({
                    name: this.addText,
                    status: false
                });
                //添加后,清空addText
                this.addText = "";
            },
            // 变换清单
            chooseList(type) {
                //type=1时,选择所有目标
                //type=2时,选择所有已完成目标
                //type=3时,选择所有未完成目标
                this.curType = type;
                switch (type) {
                    newList用于保存当前显示的目标列表。
                    case 1: this.newList = this.prolist; break;
                    case 2: this.newList = this.prolist.filter(function (item) { return item.status }); break;
                    case 3: this.newList = this.prolist.filter(function (item) { return !item.status }); break;
                }
            },
            /*改变单条数据的完成状态*/
            changeType(index) {
                this.newList[index].status = !this.newList[index].status;
                //更新数据
                this.chooseList(this.curType);
            },
            // 删除指定的条目并更新list
            delectList(list) {
                var index = this.prolist.indexOf(list);
                //删除数组从index处开始的1个元素
                this.prolist.splice(index, 1);
                //加载最新数组结果
                this.chooseList(this.curType);
            }
        },
        // 显示全部任务的清单,执行顺序比较早
        mounted() {
            //newList用于保存当前显示的目标列表。
            //初始化,把prolist赋值给newList。默认显示所有目标
            this.newList = this.prolist;
        }
    });
</script>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不懂代码的孩子

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值