美文网首页
vue的基本指令的完整案例

vue的基本指令的完整案例

作者: 十年之后_b94a | 来源:发表于2018-03-01 10:55 被阅读0次
    //html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="index.css">
        <script src="vue.min.js"></script>
    </head>
    <body>
        <div class="page-top">
            <div class="page-content">
                <h2>任务计划列表</h2>
            </div>
        </div>
        <div class="main">
            <h3 class="big-title">添加任务:</h3>
            <input placeholder="例如:吃饭睡觉打豆豆;提示:+回车即可添加任务" class="task-input" type="text" v-model="editData" @keyup.13="addTodo"/>
            <ul class="task-count" v-show="list.length">
                <li>{{filterData.length}}个任务未完成</li>
                <li class="action">
                    <a :class={active:hashData==='all'} href="#all">所有任务</a>
                    <a href="#unfinshed" :class={active:hashData==='unfinshed'}>未完成的任务</a>
                    <a href="#finshed" :class={active:hashData==='finshed'}>完成的任务</a>
                </li>
            </ul>
            <h3 class="big-title">任务列表:</h3>
            <div class="tasks">
                <span class="no-task-tip" v-show="!list.length">还没有添加任何任务</span>
                <ul class="todo-list">
                    <li class="todo" :class="{completed:item.isChecked,editing:item === nowEdit}" v-for="item in hashFilter">
                        <div class="view">
                            <input class="toggle" type="checkbox" v-model="item.isChecked"/>
                            <label @dblclick="editTodo(item)">{{item.title}}</label>
                            <button class="destroy" @click="deleteTodo(item)"></button>
                        </div>
                        <input class="edit" type="text" v-focus="true" @keyup.esc="escTodo" @blur="saveEdit(item)" v-model="nowEdit.title"/>
                    </li>
                </ul>
            </div>
        </div>
        <script>
            let list = [
                {
                    title:'测试',
                    isChecked:false
                },
                {
                    title:'学这么多',
                    isChecked:true
                },
                {
                    title:'我的速度太慢了',
                    isChecked:false
                }
            ];
            const vm = new Vue({
                el:".main",
                data:{
                    list:list,
                    editData:'',//正在编辑的数据
                    nowEdit:'', //双击编辑的数据
                    beforeData:'', //退出编辑的数据
                    hashData : 'all'  //hash的数据
                },
                computed:{
                    filterData(){
                        return this.list.filter(function(item){
                            return !item.isChecked
                        })
                    },
                    hashFilter(){
                        const hashEnter={
                            all(list){ //所有的
                                return list;
                            },
                            unfinshed(list){ //未完成的
                                return list.filter(function(item){
                                    return !item.isChecked
                                })
                            }, 
                            finshed(list){ //完成的
                                return list.filter(function(item){
                                    return item.isChecked
                                })
                            }
                        }
                        return hashEnter[this.hashData]?hashEnter[this.hashData](this.list):this.list
                    }
                },
                methods:{
                    deleteTodo(todo){//删除数据
                        const index = this.list.indexOf(todo);
                        this.list.splice(index,1);
                    },
                    addTodo(){ //回车添加数据
                        if(this.editData=='') return;
                        this.list.push({
                            title:this.editData,
                            isChecked:false
                        });
                        this.editData = '';
                    },
                    editTodo(todo){ //双击展开编辑
                        this.nowEdit = todo;
                        this.beforeData = todo.title;
                    },
                    saveEdit(todo){ //失去焦点保存数据
                        this.nowEdit = '';
                        this.beforeData = '';
                    },
                    escTodo(){
                         this.nowEdit.title = this.beforeData;
                         this.nowEdit = '';
                    }
                },
                directives:{ //自定义事件
                    focus:{
                        update(el){
                            el.focus();
                        }
                    }
                }
            })
    
            window.addEventListener('hashchange',function(){
                const hash = window.location.hash.substr(1);
                vm.hashData = hash;
            })
        </script>
    </body>
    </html>
    

    css文件

    //css
    body {
        margin:0;
        background-color: #fafafa;
        font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
    }
    
    h2{
        margin:0;
        font-size: 12px;
    }
    a {
        color: #000;
        text-decoration: none;
    }
    
    input {
        outline: 0;
    }
    
    button {
        margin: 0;
        padding: 0;
        border: 0;
        background: none;
        font-size: 100%;
        vertical-align: baseline;
        font-family: inherit;
        font-weight: inherit;
        color: inherit;
        outline: 0;
    }
    
    ul {
        padding:0;
        margin:0;
        list-style: none;
    }
    
    .page-top {
        width: 100%;
        height: 40px;
        background-color: #db4c3f;
    }
    
    .page-content {
        width: 50%;
        margin: 0px auto;
    }
    
    .page-content h2{
        line-height: 40px;
        font-size: 18px;
        color: #fff;
    }
    
    .main {
        width: 50%;
        margin: 0px auto;
        box-sizing:border-box;
    }
    
    .task-input {
        width: 99%;
        height:30px;
        outline: 0;
        border: 1px solid #ccc;
    }
    
    .task-count{
        display: flex;
        margin:10px 0;
    }
    
    .task-count li {
        padding-left: 10px;
        flex: 1;
        color: #dd4b39;
    }
    
    .task-count li:nth-child(1){
        padding: 5px 0 0 10px;
    }
    
    .action {
        text-align: center;
        display: flex;
    }
    .action a {
        margin: 0px 10px;
        flex: 1;
        padding: 5px 0;
        color: #777;
    
    }
    
    .action a:nth-child(3){
        margin-right: 0;
    }
    
    .active {
        border: 1px solid rgba(175, 47, 47, 0.2);
    }
    
    .tasks {
        background-color: #fff;
    }
    .no-task-tip {
        padding:10px 0 10px 10px;
        display: block;
        border-bottom: 1px solid #ededed;
        color:#777;
    }
    
    .big-title {
        color: #222;
    }
    
    
    .todo-list {
        margin: 0;
        padding: 0;
        list-style: none;
    }
    
    .todo-list li {
        position: relative;
        font-size: 16px;
        border-bottom: 1px solid #ededed;
    }
    
    .todo-list li:hover {
        background-color: #fafafa;
    }
    
    
    .todo-list li.editing {
        border-bottom: none;
        padding: 0;
    }
    
    .todo-list li.editing .edit {
        display: block;
        width: 506px;
        padding: 13px 17px 12px 17px;
        margin: 0 0 0 43px;
    }
    
    .todo-list li.editing .view {
        display: none;
    }
    
    .todo-list li .toggle {
        text-align: center;
        width: 40px;
        /* auto, since non-WebKit browsers doesn't support input styling */
        height: auto;
        position: absolute;
        top: 5px;
        bottom: 0;
        margin: auto 0;
        border: none; /* Mobile Safari */
        -webkit-appearance: none;
        appearance: none;
    }
    
    .toggle {
        text-align: center;
        width: 40px;
        /* auto, since non-WebKit browsers doesn't support input styling */
        height: auto;
        position: absolute;
        top: 5px;
        bottom: 0;
        margin: auto 0;
        border: none; /* Mobile Safari */
        -webkit-appearance: none;
        appearance: none;
    }
    
     .toggle:after {
        content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="40" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
    }
    
    .toggle:checked:after {
        content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="40" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
    }
    
    .todo-list li label {
        white-space: pre-line;
        word-break: break-all;
        padding: 15px 60px 15px 15px;
        margin-left: 45px;
        display: block;
        line-height: 1.2;
        transition: color 0.4s;
    }
    
    .todo-list li.completed label {
        color: #d9d9d9;
        text-decoration: line-through;
    }
    
    /*.tip-toggle {
        padding-left: 0;
        position: relative;
    }
    
    .tip-toggle .toggle {
        top: -2px;
    }
    
    .tip-toggle span {
        margin-left: 45px;
    }*/
    
    .todo-list li .destroy {
        display: none;
        position: absolute;
        top: 0;
        right: 10px;
        bottom: 0;
        width: 40px;
        height: 40px;
        margin: auto 0;
        font-size: 30px;
        color: #cc9a9a;
        margin-bottom: 11px;
        transition: color 0.2s ease-out;
    }
    
    .todo-list li .destroy:hover {
        color: #af5b5e;
    }
    
    .todo-list li .destroy:after {
        content: '×';
    }
    
    .todo-list li:hover .destroy {
        display: block;
    }
    
    .todo-list li .edit {
        display: none;
    }
    
    .todo-list li.editing:last-child {
        margin-bottom: -1px;
    }
    

    完整页面


    image.png

    相关文章

      网友评论

          本文标题:vue的基本指令的完整案例

          本文链接:https://www.haomeiwen.com/subject/ngcgxftx.html