为什么一个 Todolist 是不够的

界面是思维的一部分

我是那种思考很快, 但是记忆力很差的人, 有个笔记工具特别重要
极端地说, 我需要把笔记当作硬盘挂载到我的大脑
数据从界面解析传送到大脑, 从大脑持久化到计算机, 都应该尽量快
具备这样的方便, 我还可以借助图形界面更好地排序和评估任务
...或者你仅仅可以理解好记性不如烂笔头, 事情写下来就记牢了

这就像有时人们爱把思路画出来, 加上箭头, 让别人还有自己更清楚
或者到了下雨天, 你出门就会去看伞架, 因为雨伞存储在那儿
或者是当你需要什么东西, 就下意识去兜里去包包里翻看取出
或者是过马路时你下意识去看红绿灯, 再决定能不能走
思考不仅仅需要脑海里已有的数据, 界面也是思维的一部分

我需要 Todolist

我想要一个 Todolist, 而且我每天都会用到, 因而需要满足这样的要求:

  • 能随时记东西, 不管什么情况, 回车, 输入, 搞定. 一定要能快
  • 我可以拖拽修改顺序, 决定哪个任务是目前关注的
  • 任务可以被完成
  • 任务可以被延期, 不能同时看到太多任务, 会干扰情绪的
  • 界面要干净. 我在思考的时候比一般人都容易分心, 尽量干净
  • 背景颜色挺容易带给我压力, 要找轻松的壁纸

了解我的同学大概知道我在的公司就是做团队任务管理的
不过公司的产品功能大而全, 我过分的要求仅仅术语小众产品
而这渐渐也成了我学编程最大的动力, 没有看上的, 自己做
GitHub 上有个团队叫做 Memkits, 顾名思义, 思维的小工具
我经常用到的一些小工具的代码就托管在上边

React Todolist

首先我想要解决 Todolist 的问题, 我用过 Wunderlist, 养不成习惯
接触 Ractive 和 Vue 之后, 渐渐我能轻松实现 Todolist 了
我不仅要实现, 还需要能根据自己的需要定制, 加功能改样式
后来掌握了 React, 渐渐自己的想法比较容易实现, 有了第一个工具

我选择了在浏览器 localStorage 存储 Todolist 的数据
而且页面用本地的 Nginx 托管, 所以不会受到网速影响
我还花了不少时间选择图片, 以及稍微调了一下动画
我强制去掉了很多元素, 避免导致我分心, 同时, 谢天谢地, 代码量少了

试用 http://repo.tiye.me/react-todolist/
代码 https://github.com/Memkits/react-todolist


实际使用一段时间, 小修小改, 我注意到一些问题:

  • localStorage 并不靠谱, 同时打开多份页面, 保存会相互覆盖
  • 我有很多小任务, 相互之间还有关系的, 需要有分组
  • 想到文章思路的时候会记一下, 这时一行可不够用

localStorage 问题, 属于技术问题, 正确的方案是写一套后端
一套后端, 意味着服务器和数据库, 这还算简单, CURD 嘛
然而 WebSocket 也要, 万一两个标签在编辑, 不同步怎么办?
实际上问题到现在也没有解决掉, 我还是存储在标签缓存里的

Pudica Schedule

分组的问题倒是可以解决, 而且场景也很明确很常见,
写程序时候, 先做什么后做什么顺序非常明确, 而且需要不断调整
于是我做了个简单的列表, 可以拖拽, 可以编辑, 可以上下添加
后来还调整完成的任务显示在列表中间, 方便对比
有次看上夏天的绿色的枫叶, 干脆壁纸也换成了翠绿

试用 http://repo.tiye.me/pudica-schedule/
代码 https://github.com/Memkits/pudica-schedule


写组件头绪繁多的时候, 我常把步骤先整理好, 照做, 勾掉
原本完成的任务归档右侧的, 现在的缩进是随着使用调整的
当然, 这个界面依然在使用当中遇到解决不好的场景:

  • 事情多我有两组任务要进行怎么办, 我需要更多个组
  • 我的任务和同事一起做, 需要共享进度, 可这个页面没有同步功能

我考虑了下, 似乎场景不那么多, 而且那种程度就算有工具大概也用不上
而关于同步, 我也有打算建立新的项目, 不过技术栈有点高
我大概要花好长时间才能把同步的逻辑写到好用而且没 bug 吧
最近...忙, 所以 monilaria-schedule 项目无限期搁置吧
居然要写后端吗, 写完后端还有考虑部署, 维护数据库? 天呐...

Manuscript

看下另一个问题, 写文章的思路, 怎么方便快速地记录下来?
单单考虑需求的话, 有个侧边栏, 有个输入框, 能创建删除和切换就好了
我做了一个版本, 用久了发现按钮挺碍眼, 干脆按钮也去掉吧
侧边栏在创建删除时一闪一闪挺干扰的, 加动画, 用来做过渡以及提示

试用 http://repo.tiye.me/manuscript/
代码 https://github.com/Memkits/manuscript


我经常有想了个开头的文章, 就在 Manuscript 当中记录一下
等到整体结构定下了, 就贴到豆瓣或者 SF 上边继续编辑
看效果勉强还行. 也会遇到一些问题影响使用的:

  • Markdown, 喂, 不能查看页面上的效果啊, 只有一部分能脑补出来
  • 思源黑体已经是很赞的字体, 但中英文搭配成了棘手的字体问题
  • 我经常需要贴代码, textarea 可不能同时呈现不等宽和等宽两种样式
  • 左边右边是两份文档, 查看和编辑手动滚动跟定位, 挺麻烦

动画和字体除了技术还有设计方面的难度, 我只能尽量调整了
一方面要更好的效果, 一方面要避免过渡而影响到使用时的注意力
引导和提示视觉的交互当然不是简单的事情, 字体也是, 暂且容忍吧
滚动的问题在实现上就难了, 程序要分析到字符做精确定位才行

Marked React Editor

富文本编辑器是个头疼的问题, Markdown 只是个程序员式的方案
对我而言写东西时考虑点击按钮会出现什么效果, 真是干扰
富文本编辑器是比较容易出问题的, 我还是先坚持用 Markdown
我需要能预览, 还能全屏预览文章, 那就用双击切换模式好了
因为 Air 屏幕小, 那一定要尽可能利用屏幕的空间才行
另外按自己的喜好增加一些样式, 字体, 顺手就可以了

试用 http://repo.tiye.me/marked-react-editor/
代码 https://github.com/jiyinyiyong/marked-react-editor


基本功能算是有了, 而且 Atom 编辑器也大概是这样的效果
SF 的 Markdown 编辑器就做得更全, 只是有时候细节太过
而我这个从细节上缺失功能太多了, 只不过我用不到而已. 不胜枚举

用代码构造你需要的

Bret Victor 曾经感慨设计师难以将灵光一现化为真实的物体:

A "user interface" is simply one type of dynamic picture. I spent a few years hanging around various UI design groups at Apple, and I met brilliant designers, and these brilliant designers could not make real things. They could only suggest. They would draw mockups in Photoshop, maybe animate them in Keynote, maybe add simple interactivity in Director or Quartz Composer. But the designers could not produce anything that they could ship as-is. Instead, they were dependent on engineers to translate their ideas into lines of text. Even at Apple, a designer aristocracy like no other, there was always a subtle undercurrent of helplessness, and the timidity and hesitation that come from not being self-reliant.

It's fashionable to rationalize this helplessness with talk of "complementary skillsets" and other such bullshit. But the truth is: An author can write a book. A musician can compose a song, an animator can compose a short, a painter can compose a painting. But most dynamic artists cannot realize their own creations, and this breaks my heart.

我当时听他视频很受触动, 因为我就是想做东西, 才开始自学编程
也因此我将强烈地追寻新技术, 而不愿消耗时间在编译器底层技术中
这可以说是我的指路明灯和前进动力, 也可以说是我技术生涯的限制
我希望技术能更快把想法变成现实, 这是真真切切的效率和生活的提升

然而某天突然意识到前端的工作, 越来越限制, 是去填补前面说到的缺失
做前端要关心框架, 关心后端数据, 关心可维护性, 关心项目进展
而且要尽可能满足设计的意图, 这样设计师才能精确地洞察设计的效果
作为团队磨合, 这无可厚非, 值得改进. 但想到个人发展, 经常感到烦闷
公司越大, 效率对分工的要求越高, 越需要职位智能精准

而这样的烦恼让我更加认为编程和设计是每个人应具备的技能
跨过一个人, 跨过一个职业, 一层层累积着的沟通成本, 难以被抵消
你看到问题, 你动手解决, 你绕过目前的障碍, 你不再被困扰
就像对于 Linux 用户来说, 不能定制桌面吗? 这操作系统怎么做的?

技术的瓶颈

最后作为程序员讨论下技术实现的问题, 这几乎就是每天的生活状态
实时同步的应用? 什么前端框架? 什么编程语言? 什么通信协议?
什么数据库抽象? 什么编程模式? 什么布局问题? 什么原因导致的 bug?
今天晚上我又看到一款产品, 叫做 Atomic, 可以拖拽生成手机交互

未来的人们真幸福啊, 拖拽几下就能把界面做出来了
等等, 我们要用 Emacs? Vim? Atom? nano? Sublime? Visual Studio?
好像现在出了 Bracket? LightTable? Nuclide? Polymer Design Tool?
前端框架用了吗? 是 MVC, MVP, MVVM, Flux, 或者只能说是 MV*
大能十多种主流前端框架, 大概十多种主流 Web 开发语言, 还可以更多

在外人看来, 做程序的人是不是都疯了, 凭空造出那么多术语来?
这些概念放在二十年前, 那时候 JavaScript 刚刚出现, 微软也还年轻
最近几十年技术疯狂地发展, 现在巨头们常常开发布会介绍新产品
这么多年, 可以想象会有很多聪明人, 大量资金投入在 IT 这个领域
技术发展到什么程度了? 为什么 Dribbble 上一个图实现起来很难吗?

我记得人们经常在意, 为什么世界上有那么多编程语言? 然后回答说:

People take ideas from different languages and combine them into a new languages. Some features are improved (inheritance mechanisms, type systems), some are added (garbage collection, exception handling), some are removed (goto statements, low-level pointer manipulations).

Programmers start using a language in a particular way that is not supported by any language constructs. Language designers identify such usage patterns and introduce new abstractions/language constructs to support such usage patterns.

人们多半没意识到问题的每个细节不断深入会有那么多细节
随着不断的改进, 功能不断组合, 新领域不断混入, 交织出更多的细节来
编程语言就这样疯长了, 其他的方面看来也是, 一切都难逃其命运
即便是说不清楚, 从编程领域繁多的工具分类也可见一斑了

总结

如果扎进技术当中, 会发现存在数不尽的问题, 心情恐怕更烦闷了
抛开技术来说, 当我尝试做出了一个自己想要的 Todolist 问题随之而来
我发现现实生活中种种的需求接踵而来, 我不断改进应用, 却难以追上
仅仅是针对个人习惯做改进或许好一点, 但一套 Todolist 往往不够

技术社区的历史常常更多的互联网用户身上发生的事情的缩影
比如 StackOverflow 的问答和积分系统, 渐渐在更多社交网站上发生
比如代码版本控制, 渐渐演变到文章, 法律, 设计的版本控制
技术社区因为每个人有能力提出问题解决问题, 进入到无止境的分类
大概当每个人都有能力去改变他想要应用, 会发现永无止境
有那么多种任务需要有记录, 一个 Todolist 怎么可能够?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的 Todo List 的 JavaScript 代码实现: ``` const form = document.querySelector("form"); const input = document.querySelector("input"); const ul = document.querySelector("ul"); form.addEventListener("submit", (event) => { event.preventDefault(); const value = input.value; if (!value) return; const li = document.createElement("li"); li.textContent = value; ul.appendChild(li); input.value = ""; }); ``` 这段代码使用了 HTML 表单、输入框和无序列表来实现 Todo List 的功能。它通过监听表单的 `submit` 事件并使用 `preventDefault` 方法阻止默认的表单提交行为,来实现 Todo List 条目的添加。 ### 回答2: 在使用JavaScript编写一个todolist时,我会使用HTML和CSS来创建页面结构和样式,并通过JavaScript来实现动态添加和删除任务的功能。 首先,我会创建一个输入框和一个提交按钮,用于添加新的任务。用户在输入框中输入任务,点击提交按钮时,会触发一个JavaScript函数。 在JavaScript函数中,我会获取输入框的值,并根据需求进行验证。如果输入框没有值,或者输入的值已存在于任务列表中,我会提醒用户输入有效的任务。 一旦输入的任务通过验证,我会创建一个新的列表项,将其添加到任务列表中。列表项会显示任务的内容以及一个删除按钮。删除按钮会触发另一个JavaScript函数,用于删除对应的任务。 当用户点击删除按钮时,我会找到被点击的按钮的父元素,也就是列表项,在列表中删除这个项,并更新页面上的显示。 此外,我还会添加一个全选按钮和一个清除按钮。全选按钮可以选择或取消选择所有任务,清除按钮可以删除所有已完成的任务。 最后,我会使用本地存储技术,将todolist的任务保存在用户的浏览器中。这样,当用户重新打开页面时,之前添加的任务将会保留下来。 总之,以上就是我用JavaScript编写todolist的大致思路。通过合理的HTML结构、CSS样式和JavaScript功能,可以实现一个简单并实用的todolist。 ### 回答3: 为了使用JavaScript编写一个ToDoList,您需要经历以下步骤: 1. 创建一个HTML文件,包含一个文本输入框用于输入任务,并一个按钮用于添加任务。此外,还需要一个用于显示任务的列表。 2. 在JavaScript文件中,首先使用DOM方法获取所需的HTML元素。例如,使用`getElementById`选择文本输入框和按钮,并使用`querySelector`选择任务列表。 3. 使用事件监听器,为按钮添加点击事件。当按钮被点击时,将触发一个函数。 4. 在该函数中,首先获取输入框中用户输入的任务。可以使用`value`属性获取输入框的值。 5. 创建一个新的列表项元素,并使用`createElement`方法创建一个`li`元素。 6. 将输入框中的任务作为文本内容添加到新创建的`li`元素中。可以使用`innerText`属性设置元素的文本内容。 7. 将新创建的`li`元素添加到任务列表中,可以使用`appendChild`方法将`li`元素添加到任务列表元素中。 8. 清除输入框中的任务,可以使用`value`属性将任务输入框的值设置为空。 9. 重复步骤3到步骤8,以添加更多的任务。 10. 可以为每个任务添加删除功能,当点击任务时,将其从任务列表中移除。可以使用`addEventListener`方法为每个任务添加点击事件监听器,并在监听器函数中使用`removeChild`方法将任务从任务列表中移除。 以上步骤为您提供了一个基本的ToDoList的JavaScript实现框架。您可以根据个人需求和设计进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值