IMWeb训练营作业-toDoList

第一个Vue的demo => toDoList。没网2天了,课程没跟上。localstorage部分就没学了。暂时完成到这个版本。之后更新保持,先放demo页面链接。
http://xzchen.github.io/project/vue/todolist/
运行效果图

展示这个demo的动态图片


html 分为header、doing、done三部分。
header里面包括一个input通过指令v-model=createToDo与实例里data.createTodo的值进行双向绑定。用来创建doingList,
doing和done主体部分都是一个ul列表,通过指令v-for来渲染DOM。


doing||done下的tip功能由指令v-show通过控制元素的display来控制显隐。

与v-if的其一差别在于v-if每次切换会被销毁和重建。

每个li的children == [input,p,span];
1. 其中type=checkbox的input通过v-model=doing.flag来保证checkbox在样式上永远保证未勾选状态并且在doing和done下对于数据进行切换。
2. 其中p的childNodes == [doing||done.text, input];
      2.1 doing||done.text来显示文本内容。
      2.2通过给v-bind:class={showEditInput:doing === editText}** 来控制能编辑p[0]的p.input空间的显隐。
      2.3其中p.input 又通过自定义指令v-focus=”editText === doing”使得光标在input出现后就自动聚焦和v-on:blur=editText =”v-on:keyup.13=editText=’ ‘ v-on:keyup.esc=doing.text = oldText;editText = ” “适时提交修改||未修改的数据。
3.其中span在v-on:click=”deleteList(done, doneLists)”执行删除list的方法


核心HTML代码。

<div id="toDoList">

    <!-- v-model指令对于表单控件进行双向绑定,方便进行数据的修改 -->
    <input type="text" 
    v-on:keyup.13="fnCreateToDo()"
    v-on:blur="fnCreateToDo()" 
    id="createToDo" 
    placeholder="增加要完成的todo,回车键入">

    <div>
        <!-- 此处通过v-show控制两个p标签的display进行提示 -->
        <p v-show="!doingLists.length">没有待完成的任务</p>
        <p v-show="doingLists.length">正在进行<span>{{doingLists.length}}</span></p>
        <ul>
            <li v-for="doing in doingLists" >
                <input type="checkbox" name=""  v-on:click = "doingToDone(doing)" v-model="doing.flag">
                <p v-bind:title="doing.text" v-on:click="showEditInput(doing)">
                    {{doing.text}}
                    <input type="text" v-bind:class="{showEditInput:doing === editText}" v-focus="editText === doing"  v-on:blur="editText = ''" v-model="doing.text" v-on:keyup.13="editText = ''" v-on:keyup.esc="doing.text = oldText;editText = ''">
                    <!-- blur清空editText,因为本来通过input的v-model使得doing的text的值是改变了,而editText又是和doing共用1个内存。修改1个对象,另外1个对象的值也跟着改变。但是清空1个对象,另外个对象还是存在。所以清空editText的值,doing的值不变 -->
                </p>
                <span v-on:click = "deleteList(doing, doingLists)"></span>
            </li>
        </ul>
    </div>
    //done部分结构一样。写到着想到可能可以用template写。
</div>

JS部分

new Vue({
    el:"#toDoList",
    data:{
        createToDo:"v-model执行双向绑定,根据这里的数据去添加到doingLists数组里",
        editText: "", //获得当前要编辑doing||list。是doingLists||doneLists数组下某一个对象
        oldText: "", //取消编辑前,记录之前存储的内容
        doingLists:[
            {
                text: "doingLists和doneLists数组里包含的都是多个json对象。键text的值存放的是文本",
                flag: false
            }
    methods:{
        fnCreateToDo(){
            //这里的this指的是当前Vue实例
            if(this.createToDo.trim()) {  //如果不是添加的空任务就确认push到doingLists数组
                var json = {
                    text: this.createToDo.trim(),
                    flag: false
                }
                this.doingLists.push(json);
                this.createToDo = "";
            }

        },
        //勾选某个li下的checkbox就会再doing和done之间进行数据交换。其实就是数组的操作
        doingToDone(doing) {
            doing.flag = false; //保证checkbox仍然是未勾选状态
    this.doneLists.push(this.doingLists.splice(this.doingLists.indexOf(doing), 1)[0]) //因为返回的是一个数组,取第一个的就成。不然格式不对。
        },
        deleteList(list, lists){
            lists.splice(lists.indexOf(list), 1);
        },
        showEditInput(list) {
            //对象的复制是引用空间,这里值得注意。
            this.editText = list;
            this.oldText = list.text;
        }
    },
    directives: {
        "focus": {
            update(el, binding) {
                //如果元素上绑定的表达式为真 editText === doing || done;
                if (binding.value) {
                    el.focus();
                }
            }
        }
    }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,你可以使用内置的crypto模块来实现HMAC-SHA256算法。下面是一个示例代码: ```javascript const crypto = require('crypto'); const secret = 'Secret_Key'; const message = 'timestampGET/users/self/verify'; const hmac = crypto.createHmac('sha256', secret); hmac.update(message); const sign = hmac.digest('base64'); console.log(sign); ``` 在这个示例中,我们首先引入了crypto模块。然后,我们定义了密钥(secret)和要加密的消息(message)。接下来,我们使用createHmac方法创建了一个HMAC对象,并指定了算法为SHA256,并传入密钥。然后,我们使用update方法将消息传入HMAC对象进行更新。最后,我们使用digest方法以base64编码格式输出加密后的签名。 请注意,这个示例中的密钥和消息只是示意用法,你需要根据实际情况替换为你自己的密钥和消息。 #### 引用[.reference_title] - *1* [Typescript/Nodejs 使用HmacSHA256 & Base64对接口调用签名](https://blog.csdn.net/HumorChen99/article/details/117548951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [Hmac SHA256 加密在原生 Java 及 Node.js 的实现](https://blog.csdn.net/frgod/article/details/122025192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [腾讯IMWeb团队是如何使用 NodeJS 实现 JWT 原理](https://blog.csdn.net/lunahaijiao/article/details/109881868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值