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

推荐订阅源

IT之家
IT之家
Y
Y Combinator Blog
月光博客
月光博客
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
博客园 - 司徒正美
V
Visual Studio Blog
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
The Cloudflare Blog

追梦人物的博客

小度智能设备接入 Home Assistant,支持小爱同学语音控制 - 追梦人物的博客 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 教程
标为完成 - Vue 2.x Todo 教程
2019-01-07 · via 追梦人物的博客

用户点击标为完成按钮,则将对应的 todo 标为完成,为了标记 todo 是已完成还是未完成的状态,我们需要稍微改造一下我们的 todo 模型,一开始我们的 todo 有 id、title 两个属性,现在加一个 completed 属性,默认值是 false,表示未完成。

todo = {id:1, title:'todo', completed:false}

当然我们对应的 addTodo 方法也要修改一下:

addTodo: function () {
    this.todos.push(
        // 修改后的 todo 模型
        {id: id++, title: this.newTodoTitle, completed: false}
    );
    this.newTodoTitle = '';
}

标为已完成的思路和之前是一样的,监听用户点击标为完成按钮的 click 事件,然后调用相应的处理方法,把 todo 的 completed 的属性由 false 改为 true 即可。这里的一个关键是,我们如何知道用户点击的是哪一个 todo,或者说我们可以通过坐在用户身边的方式用肉眼观察用户点击了哪个 todo,但是 Vue 如何知道?

好在 Vue 允许我们向绑定的方法传递参数,我们可以把当前循环中 todo 的对象传给绑定的方法,绑定的方法代码如下:

<div id="todo-app">
  ...
  <!--todo list-->
  <ul>
    <li v-for='todo in todos' :key='todo.id'>
      <span>{{ todo.title }}</span>
      <input type="button" 
             value="标为完成"
             @click="markAsCompleted(todo)"/>
      ...
    </li>
  </ul>
  <!-- end todo list -->
  ...
</div>

注意到我们给标为完成的按钮的点击事件绑定了一个 markAsCompleted 方法,这个方法将用来处理将 todo 标为完成的动作。同时和之前绑定的的方法不同的是,我们还给他传递了一个参数,其值为 todo,这个 todo 是我们在 v-for='todo in todos' 获取,当前循环的是哪个 todo,这个 todo 就指向哪个 todo 对象。从而 Vue 就知道了原来我们我们想要操作 todos 列表中这个 todo 对象。

markAsCompleted的逻辑非常简单:

var app = new Vue({
    ...
    methods: {
        addTodo: function () {
            ...
        },
        markAsCompleted: function (todo) {
            todo.completed = true
        }
    }
})

视觉上我们应该让已经标记了已完成的 todo 显示为已删除的状态,一条横线穿过。这需要为我们的内容增加一点样式,这又要用到我们动态绑定样式的方法了:

<li v-for='todo in todos' :key='todo.id'>
    <span :class="{completed: todo.completed}">{{ todo.title }}</span>
    <input type="button" value="标为完成"
           @click="markAsCompleted (todo)"/>
    ...
</li>

这个completed 的样式我们定义在html文档最开头的head标签的style标签里,为元素提供贯穿线的样式。这里根据 todo.completed 来决定是否应该给元素添加 class=‘completed’ 的样式。

练习

练习一:目前我们点击标为完成按钮后,这个按钮是不会消失的,为了更好的用户体验,已完成的 todo 后面不该再显示一个标为完成的按钮了,想办法把它去掉。

练习二:进一步地,如果用户突然发现其实事情还没有做完,他想把这个 todo 标记回未完成状态,添加一个标为未完成的按钮实现这个需求,要注意不同按钮出现的场合应该符合逻辑。

-- EOF --