【原创】Vue todolist 练习

<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <h1>Todolist</h1>
        <div>
            <input type="text"  v-model="value" /> <button @click="addtask()">添加</button>
        </div>
        <div>
            <a v-for="a in statusLink" href="javascript:;" @click="changeStatus(a.id)" :class="{active:a.id === selected}"> {{a.text}} </a>
        </div>
        <div>
            <h2>列表</h2>
            <div>
                <h3>{{ currentLinkText }}任务{{ showList.length }}个</h3>
            <ul>
                <li v-for="item in showList">
                    <input type="checkbox" v-if="item.status !== 'finished'" v-model="item.checked"/>
                    <span v-if="item.is_edit === false">{{ item.value }}</span>
                    <span v-else><input v-model="item.value" @blur="editBlur(item, $event)" /></span>
                    <button v-if="item.is_edit === false" @click="edit(item)">编辑</button></span>
                    <span v-if="item.status === 'todo' && item.is_edit === false"><button @click="finish(item.id)">完成</button>
                    <button @click="del(item.id)">删除</button></span>
                </li>
            </ul>
            <div v-show="showList.length > 1"><input type="checkbox" v-model="status"/>全选 <button @click="batchFinish()">完成</button> <button @click="batchDelete()">删除</button></div>
            </div>
        </div>

    </div>
    <script>
        let app = new Vue({
            el : "#app",
            data : {
                // 文本框value
                value : '',
                // 列表数组
                taskList : [],
                // 选中链接项
                selected : 'all',
                currentLinkText : '全部',
                // 链接显示对象
                statusLink: [
                    {text:'全部', id:'all'},
                    {text:'已完成', id:'finished'},
                    {text:'未完成', id:'todo'},
                ]
            },
            computed : {
                // 显示列表
                showList : function() {
                    return this.selected === 'all' ? this.taskList : this.taskList.filter(item => item.status === this.selected)
                },
                // 全选按钮状态
                status: {
                    get : function() {

                    },
                    set : function(value) {
                        this.showList.map(function(item) {
                        item.checked = value;
                        return item;
                        });
                    }
                }
            },
            methods : {
                // 添加任务
                addtask : function() {
                    this.taskList.push({
                        'id' : new Date().getTime(),
                        'value' : this.value,
                        'status' : 'todo',
                        'checked' : false,
                        'is_edit' : false
                    });
                    this.value = '';
                },
                // 单项完成
                finish : function(id) {
                    const item = this.showList.find((item) => item.id === id);
                    item.status = 'finished';
                },
                // 单项删除
                del : function(id) {
                    this.taskList = this.showList.filter((item) => item.id !== id);
                },
                // 编辑
                edit : function(item) {
                    item.is_edit = true;
                },
                // 编辑 - 失去焦点事件
                editBlur : function(item, e) {
                    if (!e.target.value.trim()) {
                        alert('请输入内容!');
                        return;
                    }
                    item.is_edit = false;

                },
                // 状态切换(链接样式改变)
                changeStatus : function(id) {
                    this.selected = id;
                    this.currentLinkText = this.statusLink.find(item => item.id === id).text;
                },
                // 批量完成
                batchFinish : function() {
                    let items = this.showList.filter(item => item.checked === true);
                    items.map(function(item){
                        item.status = 'finished';
                    });
                },
                // 批量删除
                batchDelete : function() {
                    this.taskList = this.showList.filter(item => item.checked === false);
                }
            }
        });
    </script>

<style>
    a {
        text-decoration:none; 
    }
    .finished {
            text-decoration: line-through;
      }
    .active {
        font-weight: bold;
    }
</style>
</body>
</html>

参考:Vue入门,实现todolist

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注