vue初识-基础应用


vue初识-基础应用

人生至恶是善谈人过;人生至愚恶闻己过


简单开发 todolist 待办项应用

演示-> Athink_toodlist待办项

需求

  • 可输入待办项
  • 记正在进行的待办项
  • 记录完成待办项
  • 数据保存浏览器

技术

  • vue直接使用

开发

  • 引用vueanimate

    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet"
        type="text/css">
  • 视图代码

        <div id="app">
            <!-- 输入框 -->
            <div class="head">
                <label for="inputInfo">todolist</label>
                <input type="text" name="inputInfo" @keydown.enter="inputInfoEven" v-model="inputInfo"
                    placeholder="请输入代办项..">
            </div>
    
            <div class="main">
                <!-- 正在进行的待办项 -->
                <h2>正在进行<span>{{todoList.length}}</span></h2>
                <ol class="todo">
                    <transition-group name="todoTransition" 
                          enter-active-class=" animate__animated animate__bounceIn"
                        leave-active-class="animate__animated animate__fadeOutRight"
                        :duration="{ enter: 500, leave: 400 }">
                        <li v-for="item,index in todoList" :key="'todo'+index">
                            <input type="radio" @click.prevent.stop="checkDone(item)" :checked="item.isDone" />
                            <span>{{item.val}}</span>
                            <a href="#1" @click="removeInfo(index.id)">-</a>
                        </li>
                    </transition-group>
                </ol>
    
                <!-- 已完成的待办项 -->
                <h2>已经完成<span>{{doneList.length}}</span></h2>
                <ol class="done">
                    <transition-group name="doneTransition" 
                          enter-active-class=" animate__animated animate__zoomIn"
                        leave-active-class="animate__animated animate__zoomOutUp"
                        :duration="{ enter: 500, leave: 400 }">
                        <li v-for="item,index in doneList" class="done" :key="'done'+index">
                            <input type="radio" @click.prevent.stop="checkDone(item)" :checked="item.isDone" />
                            <span>{{item.val}}</span>
                            <a href="#1" @click="removeInfo(index.id)">-</a>
                        </li>
                    </transition-group>
                </ol>
            </div>
        </div>
    
  • js代码

    var app = new Vue({
        el: "#app",
        data: {
            inputInfo: "", //输入框的值
            allList: [], //所有待办项
        },
        computed: {
            todoList: function() { //正在进行的待办项
                var arr = this.allList.filter((item, index) => {
                    return !item.isDone;
                })
                return arr;
            },
            doneList: function() { //已完成的待办项
                var arr = this.allList.filter((item, index) => {
                    return item.isDone;
                })
                return arr;
            }
        },
        methods: {
            checkDone: (item) => { //检查待办项是否已完成
                item.isDone = !item.isDone;
                app.saveInfo();
            },
            inputInfoEven: () => {    //输入框的输入和回车事件
                if (!app.inputInfo || app.inputInfo == "") {
                    alert("请输入代办项..")
                    return;
                }
                app.allList.push({
                    'id': app.allList.length,
                    'val': app.inputInfo.trim(),
                    'isDone': false
                })
                app.inputInfo = "";
                app.saveInfo();
            },
            removeInfo: function(index) {    //删除所有里某个待办项
                app.allList.splice(index, 1);
                app.allList.forEach((item, i) => {
                    item.id = i;
                });
                app.saveInfo();
            },
            saveInfo: function() {    //保存待办项到浏览器
                localStorage.setItem("allList", JSON.stringify(app.allList));
            }
        },
        mounted() {
            //挂载时把浏览器保存的待办项加载进来
            this.allList = JSON.parse(localStorage.getItem("allList"))
        }
    })
    
  • 测试

    基本功能完成,测试ok..

总结

开发完小案例,感觉vue主要就是围绕数据来开发,

只需对相应逻辑改变数据,vue就能自动把数据渲染在页面上,而不需要自己获取dom元素然后再去改变值。

下篇文章将记录如何使用vue-cli脚手架来创建单文件组件开发。


文章作者: Athink
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Athink !
评论
  目录