惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
月光博客
月光博客
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
罗磊的独立博客
NISL@THU
NISL@THU
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
H
Help Net Security
L
LINUX DO - 最新话题
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
The Hacker News
The Hacker News
Apple Machine Learning Research
Apple Machine Learning Research
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Know Your Adversary
Know Your Adversary
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Secure Thoughts
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
C
CERT Recently Published Vulnerability Notes
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
F
Full Disclosure
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
T
Threat Research - Cisco Blogs
博客园 - 三生石上(FineUI控件)
S
Securelist
T
The Exploit Database - CXSecurity.com
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
V
Visual Studio Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tor Project blog
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org

追梦人物的博客

0x05:Merkle Tree & Patricia Trie 0x04:ECDSA - 以太坊设计与实现 LeetCode 105 从前序与中序遍历构造二叉树 迭代算法原理 + 完整证明 0x03:Address - 以太坊设计与实现 0x02:Secp256k1 - 以太坊设计与实现 0x00:专栏开篇 - 以太坊设计与实现 0x01:RLP 编码 - 以太坊设计与实现 Bellman-Ford 算法原理及其在 DeFi 套利中的应用 - 追梦人物的博客 迪杰斯特拉(Dijkstra)最短路径算法原理、实现与证明 - 追梦人物的博客 实战:CEX-DEX 稳定币套利监控程序开发 - 追梦人物的博客 CEX-DEX 稳定币套利模型 - 追梦人物的博客 Uniswap 手续费和协议费机制剖析 - 追梦人物的博客 Uniswap 流动性机制及相关数学原理分析 - 追梦人物的博客 uv 替代 pyenv + pipx + poetry 环境管理实践 Rust 项目从创建到发布 - 追梦人物的博客 VS Code 调试 Python - 追梦人物的博客 比特币跨市场套利的数学模型 - 追梦人物的博客 ERC-20 相关知识点总结 - 追梦人物的博客 Django 老项目如何从 SQLite 迁到 PostgreSQL 自动生成接口文档 - HelloDjango - django REST framework 教程 单元测试 - HelloDjango - django REST framework 教程 限制接口访问频率 - HelloDjango - django REST framework 教程 API 版本管理 - HelloDjango - django REST framework 教程 如何在 Windows 下搭建高效的 django 开发环境 拓展Python Markdown - 追梦人物的博客 加缓存为接口提速 - HelloDjango - django REST framework 教程 基于 drf-haystack 实现文章搜索接口 - HelloDjango 评论接口 - HelloDjango - django REST framework 教程 实现分类、标签、归档日期接口 - HelloDjango - django REST framework 教程 在接口返回Markdown解析后的内容 - HelloDjango - django REST framework 教程 文章详情接口 - HelloDjango - django REST framework 教程 分页 - HelloDjango - django REST framework 教程 使用视图集简化代码 - HelloDjango - django REST framework 教程 用类视图实现首页 API - HelloDjango - django REST framework 教程 实现博客首页文章列表 API - HelloDjango - django REST framework 教程 初始化 RESTful API 风格的博客系统 - HelloDjango django-rest-framework 是什么鬼? - HelloDjango - django REST framework 教程 结束 or 开始? - HelloDjango Coverage.py 统计测试覆盖率 - HelloDjango - Django博客教程(第二版) 单元测试:测试评论应用 - HelloDjango - Django博客教程(第二版) 单元测试:测试 blog 应用 - HelloDjango Django Haystack 全文检索与关键词高亮 - HelloDjango Django 博客实现简单的全文搜索 - HelloDjango - Django博客教程(第二版) 开启 Django 博客的 RSS 功能 - HelloDjango 统计各个分类和标签下的文章数 - HelloDjango - Django博客教程(第二版) 稳定易用的 Django 分页库,完善分页功能 - HelloDjango 通过 Django Pagination 实现简单分页 - HelloDjango 在脚本中使用 ORM:Faker 批量生成测试数据 - HelloDjango Django 官方推荐的姿势:类视图 - HelloDjango - Django博客教程(第二版) Django 使用 union 合并不同模型(Model) 的查询集(QuerySet) 开发博客文章阅读量统计功能 - HelloDjango - Django博客教程(第二版) 使用 Docker 让部署 Django 项目更加轻松 - HelloDjango 使用 Certbot 向 Let's Encrypt 免费申请 HTTPS 证书 - HelloDjango 使用 Fabric 自动化部署 - HelloDjango 博客代码开源啦 - 追梦人物的博客 (赠书)推荐一本django书籍:Django企业开发实战 - 追梦人物的博客 Nginx+Gunicorn+Supervisor 部署 Django 博客应用 - HelloDjango 优化博客功能细节,提升使用体验 - HelloDjango - Django博客教程(第二版) 交流的桥梁:评论功能 - HelloDjango - Django博客教程(第二版) 分类、归档和标签页 - HelloDjango - Django博客教程(第二版) 页面侧边栏:使用自定义模板标签 - HelloDjango - Django博客教程(第二版) 自动生成文章摘要 - HelloDjango - Django博客教程(第二版) Markdown 文章自动生成目录,提升阅读体验 - HelloDjango - Django博客教程(第二版) 让博客支持 Markdown 语法和代码高亮 - HelloDjango 开发博客文章详情页 - HelloDjango - Django博客教程(第二版) 创作后台开启,请开始你的表演 - HelloDjango - Django博客教程(第二版) 博客从“裸奔”到“有皮肤” - HelloDjango - Django博客教程(第二版) Django 的接客之道 - HelloDjango - Django博客教程(第二版) Django 迁移、操作数据库 - HelloDjango - Django博客教程(第二版) 创建 Django 博客的数据库模型 - HelloDjango 开始进入 django 开发之旅 - HelloDjango "空空如也"的博客应用 - HelloDjango - Django博客教程(第二版) 一种自顶而下的Python装饰器设计方法 - 追梦人物的博客 Python提取支付宝和微信支付二维码 - 追梦人物的博客 2018 - 我的学生生涯最后一年回顾 - 追梦人物的博客 批量清除todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 筛选练习参考答案 - Vue 2.x Todo 教程练习参考答案 删除todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 编辑todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 添加todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 标为完成练习参考答案 - Vue 2.x Todo 教程练习参考答案 入门仪式_Hello_Vue练习参考答案 - Vue 2.x Todo 教程练习参考答案 组件化todo应用 - Vue 2.x Todo 教程 批量清除todo - Vue 2.x Todo 教程 本地存储 - Vue 2.x Todo 教程 还剩多少todo未完成 - Vue 2.x Todo 教程 自定义指令实现自动聚焦 - Vue 2.x Todo 教程 全部标为完成 - Vue 2.x Todo 教程 删除todo - Vue 2.x Todo 教程 编辑todo - Vue 2.x Todo 教程 添加todo - Vue 2.x Todo 教程 标为完成 - Vue 2.x Todo 教程 UI - Vue 2.x Todo 教程 显示todo列表 - Vue 2.x Todo 教程 入门仪式:Hello Vue - Vue 2.x Todo 教程 在学习django-rest-framework时收集的学习资料推荐 - 追梦人物的博客 区块链理论与应用研究小组成员招募书 - 追梦人物的博客 Python界网红,豆瓣工程师董伟明加了我的QQ后 - 追梦人物的博客 招募Django学习小组项目组核心成员 - 追梦人物的博客
筛选 - Vue 2.x Todo 教程
2019-01-10 · via 追梦人物的博客

接下来就是筛选功能,有了之前筛选全部未完成的 todo 的经验,相信实现其它的筛选思路也就非常清晰了,我们这里有三种筛选:

  • 全部:显示全部 todo
  • 进行中:显示未完成的 todo
  • 已完成:显示已完成的 todo

为了增强用户体验,选中的按钮应该高亮显示,我们这里把它标红了。

现在唯一的问题是,我们如何知道应该筛选出哪中类型的 todo 呢?用户是想要进行中的 todo 还是已完成的todo?可以发现用户会点击相应的按钮来表明他的意图。如果我们在用户点击按钮时把他的意图传递给 Vue 对象,Vue 就知道该怎么做了。

因此我们给 data 增加一个属性 intention,来记录用户的意图。我们定义三种意图:

  • all:想查看全部 todo
  • ongoing:想查看未完成的 todo
  • completed:想查看已完成的 todo
var app = new Vue({
        el: '#todo-app',
        data: function () {
            return {
                todos: [],
                newTodoTitle: '',
                editedTodo: null,
                intention: 'all', // 默认为 all
            }
        },
        ...
    })

然后我们需要根据用户的意图从 todos 中筛选 todo,之前说过,从 Vue 已绑定的数据中计算新的结果是计算属性的典型应用场景,所以我们加一个 filteredTodos 计算属性:

computed: {
            leftTodosCount: function () {
                return this.todos.filter(todo => !todo.finished).length
            },
            filteredTodos: function () {
                if (this.intention === 'ongoing') {
                    return this.todos.filter(todo => !todo.finished)
                } else if (this.intention === 'finished') {
                    return this.todos.filter(todo => todo.finished)
                } else {
                    // 其它未定义的意图我们为其返回全部 todos,
                    // 这里面已经包含了 all 意图了
                    return this.todos
                }
            },
        },

当然我们会发现未完成的 todo 分别在 filteredTodosleftTodosCount 两个计算属性中被计算了两次,为了优化一下计算效率,我们可以重构一下代码:

computed: {
            leftTodos: function () {
                return this.todos.filter(todo => !todo.finished)
            },
            leftTodosCount: function () {
                return this.leftTodos.length
            },
            filteredTodos: function () {
                if (this.flag === 'ongoing') {
                    return this.leftTodos
                } else if (this.flag === 'finished') {
                    return this.todos.filter(todo => todo.finished)
                } else {
                    // 其它未定义的意图我们为其返回全部 todos,
                    // 这里面已经包含了 all 意图了
                    return this.todos
                }
            }
        },

filteredTodos 就是我们根据用户意图返回的结果。

打开浏览器,刷新看看效果!发现怎么点击筛选按钮返回的还是全部 todo。好吧,我想你也想到了,我么只是在 vue 中定义了计算属性,但是用户点击按钮并没有把它们的意图传给 Vue 对象。我们来设置一下,让用户的意图在点击按钮时传给 Vue,这样 Vue 才知道如何操作。给各个筛选按钮绑定一个 click 事件。

<div>
    <span>剩余<span style="font-weight: bold;"> {{leftTodosCount}} </span>项未完成 ---</span>
    <span>筛选:
      <input type="button" value="全部"
             class="selected"
             @click="intention='all'"/>
      <input type="button" value="进行中"
             @click="intention='ongoing'"/>
      <input type="button" value="已完成"
             @click="intention='finished'"/>
      <input type="button" value="清除已完成">
      <input type="button" value="清除全部">
    </span>
  </div>

特别注意不要忘了 "intention='all'" all 两边的引号,因为这是一个字符串。

再次打开浏览器看效果,好吧,怎么点还是没反应。忘了刷新?刷新一下,还是没反应!哪里出错了?F12 打开控制台调试,Vue 显示欢迎消息没有任何错误提示!!

尝试着自己找找原因~~

我们之前在循环显示 todo 列表时使用的是 this.todos 的数据,当然你无论如何点击按钮循环的始终都是 todos 的数据。把循环的内容改为 filteredTodos

<li v-for='todo in filteredTodos' :key='todo.id'>
    <span :class="{finished: todo.finished}"
          @dblclick="editTodo(todo)">{{ todo.title }}</span>
    ...
</li>

大功告成!

练习

现在筛选的功能基本完成了,但是有一个地方还没有实现,用户点击相应意图的按钮,对应的按钮应该高亮显示,而现在始终只有全部按钮高亮,因为我们在 html 中为其设置了 class 始终为 selected。尝试修改代码实现需求。(hint:别忘了 Vue 的动态样式绑定。如何判断用户点击了哪个按钮呢?)

-- EOF --