todo 小案例

1. todo 小案例完成 需求分析使用 vuejs 完成一个todo小项目,todo应用主要是用于记录用户要做的事情。 参考原型http://todomvc.com/examples/vue/

实现的功能1. todo 展示2. todo 删除3. 筛选

代码实操源码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!--1. 引入 bootstrap-->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/2.0.1/jquery.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.js"></script>
    <style type="text/css">
        /*<!--代表已经完成的项目-->*/
        .del {
            text-decoration: line-through;
            color: #ccc;
        }
    </style>

</head>
<body>
<!--2. 导航-->
<nav class="navbar navbar-inverse">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">
                Vuejs_TODO
            </a>
        </div>
    </div>
</nav>

<!--pannel-->
<div class="container" id="app">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-success">

                <div class="panel-heading">
                    <h3 class="text-danger">-_-, 还有 {{ unDoDataTotal }} 件事未完成</h3>
                    <!--确保用户按下回车的时候,进行存储 监控回车按键-->
                    <!--按键修饰符: 13这个是回车键的键码,代表用户按下了回车键-->
                    <!--收集数据时候也可以使用修饰符-->
                    <input type="text" v-model.trim="title" @change.13="changeHandler" class="form-control">
                </div>

                <div class="panel-body">

                    <ul class="list-group">

                        <!--注意:在写模型变量的时候,单词的大小写,还有顺序不要写错-->
                        <!--能复制不要手写-->
                        <!--todos  toods  tods-->
                        <!--展示筛选后的数据-->
                        <li class="list-group-item" :class="{del: todo.isCompleted}" v-for="todo in newTodos">
                            <input type="checkbox" v-model="todo.isCompleted"> {{ todo.title }}
                            <button type="button" class="btn btn-danger btn-xs pull-right"
                                    @click="removeItemHandler(todo)">&times;
                            </button>
                        </li>

                    </ul>

                </div>
                <div class="panel-footer">
                    <!--要实现筛选功能:前台是要监控得到用户点击的是哪个筛选条件:可以使用到 window.onhashchange 这个事件, 当页面的锚点发生变化的时候,触发-->
                    <ul class="nav nav-pills">
                        <li :class="{active: hash ==‘#/all‘}"><a href="#/all">全部</a></li>
                        <li :class="{active: hash ==‘#/finish‘}"><a href="#/finish">已完成</a></li>
                        <li :class="{active: hash ==‘#/unfinish‘}"><a href="#/unfinish">未完成</a></li>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
<script src="./js/uuid.js"></script>

<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el: ‘#app‘,
        data: {
            hash: ‘#/all‘, // 默认全部选中
            title: ‘‘,
            todoskey: ‘keys‘,

            todos: [
                {
                    id: 1,
                    title: ‘睡觉‘,
                    isCompleted: false,
                },
                {
                    id: 2,
                    title: ‘吃饭‘,
                    isCompleted: true,
                },
                {
                    id: 3,
                    title: ‘打豆豆‘,
                    isCompleted: false,
                },
            ],
            //  在 使用 watch 的时候,存在一个监视的层级问题:默认是浅检测,只会监视模型变量的第一层的变化 开启深度检测
            newTodos: [],

        },
        // 页面一加载,函数自动触发
        created: function () {

            var key = ‘todosKey‘;

            this.todos = localStorage.getItem(key) ? JSON.parse( localStorage.getItem(key) ): [];

            window.addEventListener(‘hashchange‘, () => {
                console.log(location.hash);
                this.hash = location.hash;
            }, false);

        },
        methods: {
            generaterId: function () {
                var uuid = uuidv1();
                return uuid.replace(/-/g, ‘‘);

            },
            changeHandler: function () {

                if (this.title.length <= 0) {
                    alert(‘请填写待做事情!‘);
                    return;
                }

                this.todos.push({
                    id: this.generaterId(),
                    title: this.title,
                    isCompleted: false,
                });

                this.title = ‘‘;// 清空
            },
            removeItemHandler: function (todo) {
                this.todos = this.todos.filter((item) => {
                    return item !== todo;
                    // 当前如果不等于传过来的待删除的条目,则保留
                });

            }
        },
        // 展示待做项
        computed: {
            unDoDataTotal: function () {
                // 返回还没有完成的事情 isCompleted: false
                return this.newTodos.filter((item) => {
                    return !item.isCompleted;
                }).length;
            },

        },
        watch: {
            hash: function (newVal, oldVal) {
                if (newVal === ‘#/finish‘) {
                    this.newTodos = this.todos.filter((item) => {
                        return item.isCompleted;
                    })

                } else if (newVal === ‘#/unfinish‘) {

                    this.newTodos = this.todos.filter((item) => {
                        return !item.isCompleted;
                    })
                } else {
                    // 代表默认的操作,全部的数据
                    this.newTodos = this.todos;
                }

            },
            todos: {
                handler: function () {
                    var key = ‘todosKey‘;
                    console.log(‘this‘, this);
                    // 自己定义的模型变量不能使用下划线(vuejs默认会认为是私有属性)
                    // vuejs 里面特性 set get
                    console.log(‘this.todoskey‘, this.todoskey);
                    localStorage.setItem(key, JSON.stringify(  this.todos  ));
                    this.newTodos = this.todos;
                },
                deep: true,
            },
        }
    })
</script>
</html>

js代码如下:

!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).uuidv1=e()}}(function(){return function(){return function e(n,r,o){function t(u,f){if(!r[u]){if(!n[u]){var c="function"==typeof require&&require;if(!f&&c)return c(u,!0);if(i)return i(u,!0);var s=new Error("Cannot find module ‘"+u+"‘");throw s.code="MODULE_NOT_FOUND",s}var a=r[u]={exports:{}};n[u][0].call(a.exports,function(e){return t(n[u][1][e]||e)},a,a.exports,e,n,r,o)}return r[u].exports}for(var i="function"==typeof require&&require,u=0;u<o.length;u++)t(o[u]);return t}}()({1:[function(e,n,r){for(var o=[],t=0;t<256;++t)o[t]=(t+256).toString(16).substr(1);n.exports=function(e,n){var r=n||0,t=o;return[t[e[r++]],t[e[r++]],t[e[r++]],t[e[r++]],"-",t[e[r++]],t[e[r++]],"-",t[e[r++]],t[e[r++]],"-",t[e[r++]],t[e[r++]],"-",t[e[r++]],t[e[r++]],t[e[r++]],t[e[r++]],t[e[r++]],t[e[r++]]].join("")}},{}],2:[function(e,n,r){var o="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(o){var t=new Uint8Array(16);n.exports=function(){return o(t),t}}else{var i=new Array(16);n.exports=function(){for(var e,n=0;n<16;n++)0==(3&n)&&(e=4294967296*Math.random()),i[n]=e>>>((3&n)<<3)&255;return i}}},{}],3:[function(e,n,r){var o,t,i=e("./lib/rng"),u=e("./lib/bytesToUuid"),f=0,c=0;n.exports=function(e,n,r){var s=n&&r||0,a=n||[],d=(e=e||{}).node||o,l=void 0!==e.clockseq?e.clockseq:t;if(null==d||null==l){var p=i();null==d&&(d=o=[1|p[0],p[1],p[2],p[3],p[4],p[5]]),null==l&&(l=t=16383&(p[6]<<8|p[7]))}var v=void 0!==e.msecs?e.msecs:(new Date).getTime(),y=void 0!==e.nsecs?e.nsecs:c+1,m=v-f+(y-c)/1e4;if(m<0&&void 0===e.clockseq&&(l=l+1&16383),(m<0||v>f)&&void 0===e.nsecs&&(y=0),y>=1e4)throw new Error("uuid.v1(): Can‘t create more than 10M uuids/sec");f=v,c=y,t=l;var w=(1e4*(268435455&(v+=122192928e5))+y)%4294967296;a[s++]=w>>>24&255,a[s++]=w>>>16&255,a[s++]=w>>>8&255,a[s++]=255&w;var b=v/4294967296*1e4&268435455;a[s++]=b>>>8&255,a[s++]=255&b,a[s++]=b>>>24&15|16,a[s++]=b>>>16&255,a[s++]=l>>>8|128,a[s++]=255&l;for(var x=0;x<6;++x)a[s+x]=d[x];return n||u(a)}},{"./lib/bytesToUuid":1,"./lib/rng":2}]},{},[3])(3)});

注意:文件的路径哦,各位小可爱

效果截图如下:

  相关博客:https://blog.csdn.net/Solitarily/article/details/85333159

 

原文地址:https://www.cnblogs.com/fang-1207/p/lifangfang-todo.html

时间: 2024-10-01 07:03:15

todo 小案例的相关文章

Cookie小案例-----记住浏览过的商品记录

Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中很常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能如下: 1,点击购买的商品后,显示到另一页面 2,记住用户浏览过的商品,并在页面时中显示 3,当浏览过的数量超过最大值限度时,最下面一个商品被挤下去 4,当浏览过的商品本身就在浏览记录中,显示列表将其从中间移到最上面 显示一打开网站的样子和显示用户的浏览记录: package cn.itcast.cookie; im

Session小案例-----简单购物车的使用

Session小案例-----简单购物车的使用 同上篇一样,这里的处理请求和页面显示同样用的都是servlet. 功能实现如下: 1,显示网站的所有商品 2,用户点击购买后,能够记住用户选择的商品 3,实现了多个会话共享一个session 4, 实现了浏览器禁用cookie后数据共享问题的处理 首页: package cn.itcast.shopping; import java.io.IOException; import java.io.PrintWriter; import java.io

Session小案例------完成用户登陆

Session小案例------完成用户登陆 在项目开发中,用户登陆功能再寻常不过啦,当用户完成用户名和密码校验后,进入主界面,需要在主界面中显示用户的信息,此时用session来记住用户是最为合适不过了. 功能实现如下: 1,完成用户登陆功能 2,在主界面记住用户 3,完成用户注销功能 用户类: package cn.itcast.login; public class User{ private String username; private String password; public

android闹钟小案例之功能阐述

最近花了一个星期左右的时间做了一个小闹钟,现在回过头来进行总结下.刚开始接触这个案例,总体觉着没有太大的难度,都是一些基础知识的堆砌,可现实总比理想残酷啊,这几天下来,每天都会有意料之外的bug出现.在debug的过程中,深深体会到了百度一下和谷歌谷歌的用处,基本常见的问题都可以在这里得到提示甚至答案.这篇文章先来介绍下这个案例所实现的功能,接下来再用几遍文章记录所用到的知识点. 功能简介: 1.闹钟基本功能:和平时的闹钟一样,用户在界面选择闹钟响起的时间,到达所设定时间后执行相应的指定操作.

android闹钟小案例之知识点总结

上一篇文章对近期做的小闹钟做了功能阐述,现在来总结下整个开发过程中所用到的一些知识点: 1.TimePicker的监听 TimePicker控件是整个应用的核心,其它的操作都得基于对该控件的正确操控.对该控件的操作重要就是为其设置监听器,在监听事件中获取用户设置的时间. private Calendar calendar=Calendar.getInstance();//创建calendar对象 private class OnTimeChangedListenerImpl implements

session的两个小案例

学完了session,写两个小案例加深一下对session的巩固. 1. 用户登陆案例 登陆html页面提交后,将参数带给处理登陆的servlet,该servlet将获得登陆的用户名和密码,并将这些信息存入session中,另一个servlet在处理的时候,会先从session中拿到用户的信息,判断是否登陆,再执行相应的动作.主要模拟一下我们常见的场景:登陆后,网页上会显示:欢饮您,xxx. 首先我们看一下欢迎页面index.jsp(这里只是简单的模拟下,后面学了jsp的标签后可以弄的更加人性化

Windows Server之浅谈SMB以及SMB小案例分享

SMB由来 服务器消息区块(英语:Server Message Block,缩写为SMB,服务器消息区块),又称网络文件共享系统(英语:Common Internet File System,缩写为CIFS),一种应用层网络传输协议,由微软开发,主要功能是使网络上的机器能够计算机文件.打印机.串行端口和通讯等资源.它也提供经认证的进程间通信机能.它主要用在装有Microsoft Windows的机器上,在这样的机器上被称为Microsoft Windows Network. SMB版本 OS W

Thinkphp 生成订单号小案例

Thinkphp 生成订单号小案例小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢思梦PHP就带领大家去解读一下生成订单号的问题!首先,订单号我们要明确它有有3个性质:1.唯一性 2.不可推测性 3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程

几个数据库的小案例(一):将文本文件中的信息导入数据库的表中

从文本文件添加到数据库用户表的记录(有两个文件:frmMain.cs  SqlHelper.cs  ) //FrmMain.cs//作者:Meusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo