#  实现逻辑:

> * 技术栈
> 1. 生命周期,creatd( 创建后执行)
> 2. methods': 调用事件方法,结果不会缓存
> 3. Watch : 监听器,监听输入的字数
> 4. Filters: 过滤器,时间
> 5. prevent : 修饰符,阻止默认事件
> 6. computed: 计算属性,计算结果会被缓存

 <template>
<div>
<H3>柚子小哥哥</H3>
// 这是一个输入框,双向绑定,给一个回车事件
<input type="text" v-model="inputVal" @keydown.enter="add" />
// 这是一个为完成的,通过计算属性来得出,没有完成的条数
<h3>未完成 ( {{ NoList }} )</h3>
<ul>
// 这是一个循环遍历一个数组,v-show,这里是显示在页面上,因为添加的时候,已经是false,现在取反就是显示在页面上。
<li v-for="(item, index) in TodoList" :key="index" v-show="!item.dome">
// 这是一个复选框,给一个点击事件,和一个修饰符,阻止默认事件在事件方法,传一个对象化,和布尔值,true,一个切换功能
<input type="checkbox" @click.prevent="change(item, true)" />
// 这是一个双击修改数据,先if判断取反,判断条件是缩影不等于负一,在双击的方法里面穿一个对象和下标
<span v-if="index != updateIndex" @dblclick="update(item, index)">
// 输入框出来的内容
{{ item.inputVal }}
</span>
// 这是一个输入框,判断下标等于负一,同时双向绑定内容,一个回车事件,和一个失去焦点事件
<input
v-if="index == updateIndex"
type="text"
v-model="item.inputVal"
@keydown.enter="updateServe"
@blur="updateServe"
/>
// 这是一个点赞,功能,说白就是在添加的,一个数量的累加。
<span @click="Str(item)"> 点赞: {{ item.Strt }} </span>
// 这是一个事件的过滤器可以准确的计算出来。你什么时候发布的信息,
<span> {{ item.createTime | FiltersTime }} </span>
// 这是一个删除功能
<span @click="del(index)"> ×</span>
</li>
</ul>
//一个计算属性,计算出完成的条数
<h3>已完成 ( {{ YesList }} )</h3>
// 这是已完成的内容,和上面的内容差不多是相反的
<li v-for="(item, index) in TodoList" :key="index" v-show="item.dome">
<input type="checkbox" checked @click.prevent="change(item, false)" />
<span v-if="index != updateIndex" @dblclick="update(item, index)">
{{ item.inputVal }}
</span>
<input
v-if="index == updateIndex"
type="text"
v-model="item.inputVal"
@keydown.enter="updateServe"
@blur="updateServe"
/>
<span @click="Str(item)"> 点赞: {{ item.Strt }} </span>
<span> {{ item.createTime | FiltersTime }} </span>
<span @click="del(index)"> ×</span>
</li>
<h3>
筛选部分
</h3>
// 这是一个诗选功能,一个下拉列表
<select v-model="screen">
<option value="">请选择</option>
<option value="whole">全部</option>
<option value="NO">未完成</option>
<option value="YES">已完成</option>
</select>
// 筛选成功之后,在fo循环遍历出来的数据
<ul>
<li v-for="(item, index) in ShowList" :key="index">
<span> {{ item.inputVal }}</span>
</li>
</ul>
</div>
</template> <script>
export default {
data() {
return {
screen: "",
// 筛选添加的数组
ShowList: [],
// 一个双向绑定的空字符串
inputVal: "",
// 操作的是这数组
TodoList: [],
// 声明一个变量为-1,用来判断双击修改
updateIndex: -1,
// 修改要存放一个空字符串中
kong: "",
// 字数默认为0
small: 0,
// 不能超过为10
Big: 10,
// 这个是一个监听字体数量,输入的字体超过范围,则不能添加,这个ref;true就是可以添加的到页面的数据
referring: true,
};
}, // 这是一个声明周期一个方法,创建后自行,
created() {
// 这几行代码的意思就是,localStorage。初始化本地存储
let TodoList = localStorage.TodoList;
if (TodoList) {
this.TodoList = JSON.parse(TodoList);
}
// 这个是发布的事件排序
this.TodoList.sort(function(a, b) {
return b.createTime - a.createTime;
});
},
// 这个就是筛选功能,
watch: {
screen(newSerl) {
this.ShowList = [];
switch (newSerl) {
case "whole":
this.ShowList = this.TodoList;
break;
case "NO":
this.TodoList.map((item) => {
if (!item.dome) {
this.ShowList.push(item);
}
});
break;
case "YES":
this.TodoList.map((item) => {
if (item.dome) {
this.ShowList.push(item);
}
});
break;
}
},
},
// 这个就是一个时间的一个过滤器,
filters: {
FiltersTime(msg) {
let data = new Date();
let noe = data.getTime();
let time = (noe - msg) / 1000 / 60;
let Str = "";
if (time <= 1) {
Str = "刚刚";
} else if (time <= 2) {
Str = "1分钟前";
} else if (time <= 3) {
Str = "2分钟前";
} else {
let data = new Date();
data.setTime(msg);
// 这是一个模版字符串,时,分,秒
Str = `${data.getHours()}:${data.getMonth()}:${data.getSeconds()}`;
}
return Str;
},
},
// 计算属性,计算法已完成和未完成的条数
computed: {
//未完成的方法
NoList() {
let num = 0;
this.TodoList.map((item) => {
if (!item.dome) {
num++;
}
});
return num;
},
// 已完成的监听的条数
YesList() {
let num = 0;
this.TodoList.map((item) => {
if (item.dome) {
num++;
}
});
return num;
},
},
// 调用事件的方法,结果不会缓存
methods: {
// 点赞拱功能,一个对象的累加,保存到本地存储
Str(item) {
item.Strt++;
this.serve();
},
// 添加
add() {
// 这个就是判断,输入的字数超过了规定的字数,就是不执行一下的方法,return返回过去
if (!this.referring) {
alert("超过字数限制");
return;
}
// 这是一个判断,判断输入框不能为空,
if (this.inputVal != "") {
alert("添加成功");
this.TodoList.push({
inputVal: this.inputVal,// 一个输入框的双向绑定的一个
dome: false, // 这是一个复选框切换
Strt: 0, // 点赞功能
createTime: new Date().getTime(), // 这是一个时间戳
});
} else {
alert("不能为空");
}
// 清空
this.inputVal = "";
// 调用保存方法
this.serve();
// 这是一个时间的排序
this.TodoList.sort(function(a, b) {
return b.createTime - a.createTime;
});
},
// 复选框的切换功能
change(item, checked) {
if (checked) {
item.dome = true;
} else {
item.dome = false;
}
},
// 双击修改
update(item, index) {
this.kong = item.inputVal;
this.updateIndex = index;
},
// 还原数据
updateServe() {
this.updateIndex = -1;
this.inputVal = "";
this.serve();
},
// 删除
del(index) {
this.TodoList.splice(index, 1);
this.serve();
},
// 保存
serve() {
localStorage.TodoList = JSON.stringify(this.TodoList);
},
},
};
</script>
<style scoped></style>

##  实现效果:

vue 入门, todoList的更多相关文章

  1. VUE 入门笔记

    前端的MVVM概念今年来也算是如火如荼,了解完 MVVM的概念,也该找个去尝试下 首先我先试了下 国内小而美的 VUE 试着照着文档敲出入门文件,内容都在注释里 <!doctype html&g ...

  2. Vue 入门之组件化开发

    Vue 入门之组件化开发 组件其实就是一个拥有样式.动画.js 逻辑.HTML 结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue 的组件和也做的非常 ...

  3. 一、Vue入门

    vue官网:https://cn.vuejs.org/ 学习路线:VueJs2.0建议学习路线 在浏览器上安装 Vue Devtools工具 1.vue入门 <script src=" ...

  4. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  5. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  6. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  7. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  8. Vue 入门指南 JS

    Vue 入门指南 章节导航 英文:http://vuejs.org/guide/index.html 介绍 vue.js 是用来构建web应用接口的一个库 技术上,Vue.js 重点集中在MVVM模式 ...

  9. vue入门 vue与react和Angular的关系和区别

    一.为什么学习vue.js vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn.vuejs.org/ 手册:http://cn.vuejs.org/ ...

  10. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

随机推荐

  1. 什么是cookie?

    cookie是什么? 其实cookies是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络浏览行为有关,所以存储在你电脑上的cookies就好像你的一张身份证,你电脑上的cooki ...

  2. 【软工】[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE

    [技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE 官方文档与重要参考资料 官方demo 官方API调用样例 Playground 官方API Doc,但其搜索框不支持模 ...

  3. Java—JSON串转换成实体Bean对象模板

    介绍 模板需求说明   开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的. 依赖 <dependency> <groupId& ...

  4. [FlashDevelop] 001.FlashDevelop + LayaFlash环境搭建

    产品简介: 唯一使用Flash直接开发或转换大型HTML5游戏的全套解决方案. 开发工具 FlashDevelop + JDK + flashplayer_18_sa_debug + LayaFlas ...

  5. Chisel3 - Chisel vs. Scala

    https://mp.weixin.qq.com/s/mTmXXBzSizgiigFYVQXKpw     介绍Chisel与Scala的不同与关联.   ​​   一. 层次高低   Chisel是 ...

  6. Java实现 LeetCode 778 水位上升的泳池中游泳(二分+DFS)

    778. 水位上升的泳池中游泳 在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时,此时雨水导致 ...

  7. Java实现 LeetCode 520 检测大写字母

    520. 检测大写字母 给定一个单词,你需要判断单词的大写使用是否正确. 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA". 单词中所有字母都不是 ...

  8. Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树

    106. 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序 ...

  9. Java实现 LeetCode 64 最小路径和

    64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], ...

  10. portapack h1 买回来刷hackrf与使用说明

    买回来很兴奋,别着急,先不用装扩展板!刷好支持扩展屏的固件,才能用!-------------------------------------hackrf连接电脑windows系统win7/win10 ...