#  实现逻辑:

> * 技术栈
> 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. Android_存储之文件存储

    前面几篇随笔 讲到的关于存储的,SharedPreferences.Room.数据库等 最终都是以文件形式 存储到手机上的(除特殊的存储于手机内存的:如Room可以创建内存数据库). 这些存储方式,A ...

  2. Maven快速入门(二)手动创建maven项目hellomaven

    之前讲过Maven介绍及环境搭建,介绍了maven的作用和如何搭建maven环境.接下来就以一个helloworld的例子来说一说如何创建maven项目以及maven项目的项目结构,最后讲maven如 ...

  3. Unity 离线建造系统

    很多游戏,特别是养成类手游,都会有自己独特的建造系统,一个建造装置的状态循环或者说生命周期一般是这样的: 1.准备建造,设置各项资源的投入等 2.等待一段倒计时,正在建造中 3.建造结束,选择是否收取 ...

  4. 02 . Redis哨兵

    Redis高可用概述 ​ 在 Web 服务器中,高可用 是指服务器可以 正常访问 的时间,衡量的标准是在 多长时间 内可以提供正常服务(99.9%.99.99%.99.999% 等等).在 Redis ...

  5. 集合遍历元素的3种方法:for、foreach、迭代器iterator

    1.for循环方式(Set集合不能使用,因为Set是无序的没有索引) for (int i = 0; i < list.size(); i++) { Object o = list.get(i) ...

  6. Johnson-Trotter(JT)算法生成排列

        对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列.假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n ...

  7. Java实现 蓝桥杯 算法训练 Lift and Throw

    试题 算法训练 Lift and Throw 问题描述 给定一条标有整点(1, 2, 3, -)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这 ...

  8. Java实现 LeetCode 229 求众数 II(二)

    229. 求众数 II 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2, ...

  9. Java实现 蓝桥杯VIP 算法训练 字符串编辑

    算法训练 字符串编辑 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个字符串(长度<=40个字符),并以字符 '.' 结束.编辑功能有: 1 D:删除一个字符,命令的方式为 ...

  10. Java实现 蓝桥杯 历届试题 错误票据

    问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成 ...