TodoFooter.vue

<template><footer class="footer"><span class="todo-count">剩余<strong>{{ count }}</strong></span><ul class="filters" @click="fn"><li><!-- 6.1 判断谁应该有高亮样式: 动态class6.2 用户点击要切换isSel里保存的值--><a :class="{selected: isSel === 'all'}" href="javascript:;" @click="isSel='all'">全部</a></li><li><a :class="{selected: isSel === 'no'}" href="javascript:;" @click="isSel='no'">未完成</a></li><li><a :class="{selected: isSel === 'yes'}" href="javascript:;" @click="isSel='yes'">已完成</a></li></ul><!-- 7. 目标: 清除已完成 --><!-- 7.0 点击事件 --><button class="clear-completed" @click="clearFn">清除已完成</button></footer>
</template><script>
// 5. 目标: 数量统计
export default {// 5.0 props定义props: ['farr'],// 5.1 计算属性 - 任务数量computed: {count(){return this.farr.length}},// 6. 目标: 点谁谁亮// 6.0 变量isSeldata(){return {isSel: 'all' // 全部:'all', 已完成'yes', 未完成'no'}},methods: {fn(){ // 切换筛选条件// 6.3 子 -> 父 把类型字符串传给App.vue this.$emit("changeType", this.isSel)},clearFn(){ // 清空已完成任务// 7.1 触发App.vue里事件对应clearFun方法this.$emit('clear')}}
}
</script>

Todoheader.vue

<template><header class="header"><h1>todos</h1><!-- 9. 目标: 全选状态9.0 v-model关联全选状态页面变化(勾选true, 未勾选false) -> v-model -> isAll变量--><input id="toggle-all" class="toggle-all" type="checkbox" v-model="isAll" /><label for="toggle-all"></label><!-- 3.0 键盘事件-回车按键3.1 输入框 - v-model获取值--><inputclass="new-todo"placeholder="输入任务名称-回车确认"autofocus@keydown.enter="downFn"v-model="task"/></header>
</template><script>
// 3. 目标 - 新增任务
export default {data() {return {task: "",};},methods: {downFn() {if (this.task.trim().length === 0) {alert("任务名不能为空");return;}// 3.2(重要) - 当前任务名字要加到list数组里// 子传父技术this.$emit("create", this.task);this.task = "";},},// 9.1 定义计算属性computed: {isAll: {set(checked) {// 只有true / false// 9.3 影响数组里每个小选框绑定的isDone属性this.arr.forEach((obj) => (obj.isDone = checked));},get() {// 9.4 小选框统计状态 -> 全选框// 9.5 如果没有数据, 直接返回false-不要让全选勾选状态return (this.arr.length !== 0 && this.arr.every((obj) => obj.isDone === true));},},},// 9.2 父 -> 子 list数组props: ["arr"],
};
</script>

TodoMain.vue

<template><ul class="todo-list"><!-- 2.2 循环任务-关联选中状态-铺设数据 --><!-- completed: 完成的类名 --><li :class="{completed: obj.isDone}" v-for="obj in arr" :key='obj.id'><div class="view"><input class="toggle" type="checkbox" v-model="obj.isDone"/><label>{{ obj.name }}</label><!-- 4.0 注册点击事件 --><button class="destroy" @click="delFn(obj.id)"></button></div></li></ul>
</template><script>
// 4. 目标: 删除list里数据
export default {// 2.1 定义propsprops: ['arr'],methods: {delFn(id){// 4.1 子传父this.$emit('del', id)}}
}
</script>

App.vue

<template><div class="todoapp"><TodoHeader :arr="list" @create="createFn"></TodoHeader><TodoMain :arr="showArr" @del="deleteFn"></TodoMain><TodoFooter :farr="showArr" @changeType="typeFn"@clear="clearFun"></TodoFooter></div>
</template><script>
// 1. 目标: 创建工程-准备相关组件文件-标签+样式 (静态)
// 1.0 样式引入
import "./styles/base.css"
import "./styles/index.css"
// 1.1 组件引入
import TodoHeader from './components/TodoHeader'
import TodoMain from './components/TodoMain'
import TodoFooter from './components/TodoFooter'
export default {// 1.2 组件注册components: {TodoHeader,TodoMain,TodoFooter},// 2. 目标: 铺设待办任务// 2.0 - 准备数据data(){return {// 8.1 默认从本地取值list: JSON.parse(localStorage.getItem('todoList')) || [],// 6.4 先中转接收类型字符串getSel: "all" // 默认显示全部}},methods: {createFn(taskName){ // 添加任务// 3.3 push到数组里let id = this.list.length == 0 ? 100 : this.list[this.list.length - 1].id + 1this.list.push({id: id,name: taskName,isDone: false})},deleteFn(theId){ // 删除任务let index = this.list.findIndex(obj => obj.id === theId)this.list.splice(index, 1)},typeFn(str){ // 'all' 'yes' 'no' // 修改类型this.getSel = str},clearFun(){ // 清除已完成this.list = this.list.filter(obj => obj.isDone == false)}},// 6.5 定义showArr数组 - 通过list配合条件筛选而来computed: {showArr(){if (this.getSel === 'yes') { // 显示已完成return this.list.filter(obj => obj.isDone === true)} else if (this.getSel === 'no') { // 显示未完成return this.list.filter(obj => obj.isDone === false)} else {return this.list // 全部显示}}},// 8. 目标: 数据缓存watch: {list: {deep: true,handler(){// 8.0 只要list变化 - 覆盖式保存到localStorage里localStorage.setItem('todoList', JSON.stringify(this.list))}}}
}
</script><style></style>

todos各个组件代码相关推荐

  1. 用element-ui的走马灯carousel轻松实现自适应全屏banner图 解决el-carousel默认高度300问题  组件代码

    用element-ui的走马灯carousel轻松实现自适应全屏banner图 解决el-carousel默认高度300问题  组件代码 <template><el-carousel ...

  2. 实训日记五 完善ui组件代码

    第五天,用Qt设计完ui生成.py文件,创建main.py文件编写组件代码. 七.图形用户界面 使用PyUIC工具进行转换,ui生成.py文件. 创建主程序文件 import sys import d ...

  3. MapWindow Gis 组件代码示例:

    MapWindow Gis 组件代码示例: 官方网站: http://www.mapwindow.org/ 该示例使用mapwindow 4 MapWinGIS.ocx X86,其它版本请参考官网相关 ...

  4. 微信小程序 配置自定义组件代码按需注入 lazyCodeLoading

    微信小程序 配置自定义组件代码按需注入 lazyCodeLoading 官方网址 在app.json最后一行加上,就可以了. "lazyCodeLoading": "re ...

  5. React使用ES6语法重构组件代码

    首次使用react,要注意react不同版本库,是ES5还是ES6的写法,如何做到统一.下面对于ES6语法重构组件的代码如下: (1)原始代码: <script type="text/ ...

  6. java组件代码_[java]常用组件

    代码: zujian.java public class zujian { public static void main(String args[]){ ComponentInWindow win ...

  7. android studio 扰码,Visual Studio 调试技巧 (三) -- 调试第三方组件代码

    上次我们提到,没有源代码而且没有调试符号,我们也可以 Debug.有人可能会问,我什么时候需要在这种情况下调试吗?! 是的.比方说,我们用了某些第三方的组件,这些组件里面难免也会有 Bug.就算是微软 ...

  8. Web 组件代码示例

    在本文中,我提供了对 Web 组件是什么以及如何使用它们的基本理解.使用现实生活中的示例,我将展示 Web 组件如何帮助使应用程序更可预测和更易于维护.此外,我分享了有关如何通过将 HTML/CSS/ ...

  9. Vue组件代码分块和懒加载

    前端开发中,随着业务和页面增加,以组件为基本单位的结构下,组件数量会增长极快,为了优化我们会很显然地想要进行一些工作: 代码分块 懒加载非必要资源文件 非必要资源,指的首次渲染出某页面所不必要的资源, ...

最新文章

  1. (转载)从无知到有知
  2. php dir opendir,php opendir()列出目录下文件的方法代码
  3. 服务器装系统无显示屏,服务器系统安装后没有桌面
  4. 云服务商正在杀死开源商业模式
  5. springboot启动原理分析
  6. 三个表格居中纵向html,前端技巧集:图与表三步垂直居中
  7. 7-8 数字三角形 (31 分)(思路+详解+动态规划)Come Baby!!!!!!!!!!!
  8. linux connect 阻塞超时时间,在linux下玩转带有超时时间的connect函数
  9. 限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我
  10. C++(20)--类型自动转换
  11. pandas时间处理操作
  12. 翻牌抽奖 php,PHP+jQuery开发简单的翻牌抽奖实例
  13. 一图说清:做数据分析,到底要懂多少业务知识?
  14. lesson 2.4 - Converting MEL Commands to Python
  15. python实现按照给定范围随机生成小数,偶数,奇数,整数,正态分布,均匀分布数据以及图片
  16. 在word中选择所有匹配查找内容的文档内容
  17. oracle中chr(39),oracle中chr含义
  18. AngularJS PrimeNG 的 自定义排序customSort
  19. 软件工程硕士研究生论文撰写事项
  20. [USACO12FEB]牛券Cow Coupons

热门文章

  1. 手机界面显示正常,点击输入框就放大,怎么破?看这里!
  2. 抖音最火刺激战场S5新赛季灵敏度:用过的都说好,建议收藏
  3. html怎样添加excel表格,html 使用 excel表格数据类型-如何给html页面添加excel表格
  4. Lumerical MODE solution FBG光栅透射谱的仿真,官网fbg.lms例子的详解
  5. Android Studio 选项菜单和动画结合_安卓手机关于“开发者选项”你该知道的几件事...
  6. 2012年3月2日专业学习
  7. 教你编写DOTA外挂
  8. 发外链的平台有哪些,分享六个免费发外链的平台
  9. wkhtmltopdf参数详解
  10. 新疆、内蒙、青海三省区骆驼齐聚柴达木上演“激情与速度”