资讯专栏INFORMATION COLUMN

ES6—项目小练习-TodoList(15)

iOS122 / 645人阅读

摘要:切换状态其实就是对应的数组值取反。要会写这个项目的和,注意实际项目中的引入方式。学习的思想,尝试使用通过修改数组的方式实现任务的增加删除和修改功能。

ES6技术本身非常容易,相信大家也体会到了。各种新特性都不难,但是为什么很多人学习起来困难呢?

其实ES6难的不是技术,而是实际工作环境的搭建。比如我们想写一个简单的ES6版本的TodoList.

很多同学学生是这么放弃的:

通过搜索引擎,发现很多教程都是直接引入Traceur.js 然后讲解ES6各种功能和语法的,但是好像实际并不是直接引入Traceur.js ,而是用babel。

使用babel的话好像需要安装node.js,还有会用npm

安装好npm 以后我是该使用gulp还是webpack呢?

嗯,应该webpack吧,这个好像目前更主流。好,就选它了。

webpack怎么安装?是不是需要webpack-cli?另外webpack 4.0好像更好用,但是好像安装又有兼容性问题?

纠结ing……

考虑了半天后,终于下定决心,就用最新版本,学老的没用。

安装好webpack 4.0,对了是不是要配置工作流?

对配置吧,这才是“工作的方式”,js需要压缩,装个压缩插件,webpack怎么用啊?有各种rule,plugins,还有entry.

开始头疼,耐着性子把网上的教程配置完,这个插件怎么报错了啊?

继续查,原来是webpack 4.0和它不兼容,换webpack 3.0还是换插件?

纠结半天后,终于鼓起勇气,换插件!

又配置出错了……

开始进入暴走模式,又气又恼。

好吧,折腾半天,请教大牛总算通过了。

那么问题来了,学了这么久css和js,我居然不知道往哪里写css……

好吧,听说得用sass……

配置完了,sass语法不会……

我就想写一个ES6的todoList,太费劲了,咋得学这么东西啊……

还是放弃吧,我感觉我不适合做前端。

虽然夸张了些,但是大部分前端都有类似的经历。


今天我就让大家彻底的学会如何工作中写ES6,我们依然用todoList举例,对了我们并不需要学习webpack,sass,插件等等。我们只学习ES6,对其它的统统不用学,你会用就可以,也不过几个命令而已。

ok,我们开始。

首先,拿到我配置好的工作流,直接在根目录下进入命令行,然后

</>复制代码

  1. npm install

安装完成后,使用

</>复制代码

  1. npm run dev

然后就可以用了,


就这几个文件,对应写html,js和css。

首先我们先写 html文件 。

</>复制代码

  1. TODOList
  2. TODO-LIST

    • 输入任务...

接着,写css美化一下

</>复制代码

  1. * {
  2. padding: 0;
  3. margin: 0;
  4. }
  5. li {
  6. list-style: none;
  7. }
  8. html {
  9. display: flex;
  10. justify-content: center;
  11. align-items: center;
  12. text-align: center;
  13. min-height: 100vh;
  14. box-sizing: border-box;
  15. font-family: Futura, "Trebuchet MS", Arial, sans-serif;
  16. background: #ffc600;
  17. }
  18. svg {
  19. fill: #fff;
  20. background: rgba(0,0,0,0.1);
  21. padding: 20px;
  22. border-radius: 50%;
  23. width: 100px;
  24. margin-bottom: 50px;
  25. }
  26. .container {
  27. padding: 20px;
  28. max-width: 350px;
  29. box-shadow: 0 0 0 10px rgba(0,0,0,0.1);
  30. background: #fff;
  31. }
  32. .container .item-area .title {
  33. text-align: center;
  34. margin: 10px 0;
  35. color: #aaa;
  36. font-weight: 200;
  37. }
  38. .container .item-area .item {
  39. background: #fff;
  40. border-radius: 4px;
  41. }
  42. .container .item-area .item .item-li-default {
  43. color: #46b7b9;
  44. }
  45. .container .item-area .item .item-li {
  46. width: 100%;
  47. border-bottom: 1px solid #eee;
  48. height: 30px;
  49. line-height: 30px;
  50. text-align: left;
  51. color: #f95959;
  52. }
  53. .container .item-area .item .item-li .delete-item {
  54. float: right;
  55. outline: none;
  56. width: 44px;
  57. height: 26px;
  58. border-radius: 4px;
  59. color: #f05941;
  60. background: #fafafa;
  61. }
  62. .container .item-area .item .item-li input:checked + .item-text {
  63. color: #196b69;
  64. text-decoration: line-through;
  65. }
  66. .container .input-area {
  67. padding-top: 10px;
  68. }
  69. .container .input-area .add-text {
  70. outline: 0;
  71. border: 1px solid rgba(0,0,0,0.1);
  72. height: 40px;
  73. border-radius: 4px;
  74. text-indent: 10px;
  75. }
  76. .container .input-area .add-button {
  77. outline: 0;
  78. height: 40px;
  79. border-radius: 4px;
  80. width: 60px;
  81. padding: 4px;
  82. background-color: #fff;
  83. border: 1px solid rgba(0,0,0,0.1);
  84. }

ok,使用

</>复制代码

  1. npm satrt


架子搭完了,很简单,甚至是不需要你写这些东西,但是你必须要会写,不过写这个的意义并不大,因为我们的重点是学ES6,好我们直捣黄龙。

</>复制代码

  1. import style from "./main.css";

把css引入js文件,你就把它当成link就行。

开始核心部分,

</>复制代码

  1. const add = document.querySelector(".add-item");//找到添加事件的变表单,之所以需要监听form而不是input是因为这样用户回车时也会触发事件
  2. add.addEventListener("submit", addItem);

点击按钮,添加一个代办事件,看看addItem怎么写。

</>复制代码

  1. //定义一个用来存放任务的数组
  2. var items = JSON.parse(localStorage.getItem("items")) || [];
  3. function addItem(e){
  4. e.preventDefault(); //阻止表单提交的默认行为
  5. const text = (this.querySelector("[name=item]")).value;
  6. const item ={
  7. text,
  8. done: false
  9. };
  10. items.push(item);
  11. //调用populateList,将items数组中的事件添加到html页面中
  12. populateList(items, container);
  13. localStorage.setItem("items", JSON.stringify(items));
  14. this.reset();
  15. }

把任务扔到数组里,然后让数组去生成列表,最后重置表单。我们看看待办事件列表怎么生成的

</>复制代码

  1. //将items数组中的事件添加到html页面中
  2. const container = document.querySelector(".item");//找到将事项加入的元素
  3. function populateList(plate, plateList) {
  4. plateList.innerHTML=plate.map( (item, i) => {
  5. return`
  6. ${item.text}
  7. `
  8. }).join("");
  9. }
  10. populateList(items, container);

ok,非常简单。我看看看如何删除一个任务。

</>复制代码

  1. //删除事件
  2. function deleteDone(e) {
  3. const msg ="确定删除该项事件?"
  4. if(!e.target.matches("input[type="button"]")) return; // 只有复选框才可以执行事件
  5. const el = e.target;
  6. const index = el.dataset.index;
  7. if(confirm(msg)){
  8. items.splice(index,1); //将选中数组删除
  9. localStorage.setItem("items", JSON.stringify(items));
  10. populateList(items, container);
  11. }else{
  12. return;
  13. }
  14. }
  15. container.addEventListener("click", deleteDone);

其实最关键的就一句话,

</>复制代码

  1. items.splice(index,1); //将选中数组删除

玩的就是数组,这个例子虽然简单用的却是MVC的思想。

接下来我们再看看切换任务状态,

</>复制代码

  1. //切换checked状态
  2. function toggleDone(e) {
  3. if(!e.target.matches("input[type="checkbox"]")) return; // 只有复选框才可以执行事件
  4. const el = e.target;
  5. const index = el.dataset.index;
  6. items[index].done =!items[index].done;
  7. localStorage.setItem("items", JSON.stringify(items));
  8. populateList(items, container);
  9. }
  10. container.addEventListener("click", toggleDone);

我们结合着本地存储的数据结构看,这样就更好理解。

切换状态其实就是对应的数组值取反。

好了,到现在为止,我们看看整体代码:

完整代码如下:

</>复制代码

  1. import style from "./main.css";
  2. const add = document.querySelector(".add-item");//找到添加事件的变表单,之所以需要监听form而不是input是因为这样用户回车时也会触发事件
  3. const container = document.querySelector(".item");//找到将事项加入的元素
  4. var items = JSON.parse(localStorage.getItem("items")) || [];
  5. // 将添加的待办事件push进items数组中
  6. function addItem(e){
  7. e.preventDefault(); //阻止表单提交的默认行为
  8. const text = (this.querySelector("[name=item]")).value;
  9. const item ={
  10. text,
  11. done: false
  12. };
  13. items.push(item);
  14. populateList(items, container);
  15. localStorage.setItem("items", JSON.stringify(items));
  16. this.reset();
  17. }
  18. // 将items数组中的事件添加到html页面中
  19. function populateList(plate, plateList) {
  20. plateList.innerHTML=plate.map( (item, i) => {
  21. return`
  22. ${item.text}
  23. `
  24. }).join("");
  25. }
  26. // 切换checked状态
  27. function toggleDone(e) {
  28. if(!e.target.matches("input[type="checkbox"]")) return; // 只有复选框才可以执行事件
  29. const el = e.target;
  30. const index = el.dataset.index;
  31. items[index].done =!items[index].done;
  32. localStorage.setItem("items", JSON.stringify(items));
  33. populateList(items, container);
  34. }
  35. // 删除事件
  36. function deleteDone(e) {
  37. const msg ="确定删除该项事件?"
  38. if(!e.target.matches("input[type="button"]")) return; // 只有复选框才可以执行事件
  39. const el = e.target;
  40. const index = el.dataset.index;
  41. if(confirm(msg)){
  42. items.splice(index,1); //将选中数组删除
  43. localStorage.setItem("items", JSON.stringify(items));
  44. populateList(items, container);
  45. }else{
  46. return;
  47. }
  48. }
  49. add.addEventListener("submit", addItem);
  50. container.addEventListener("click", toggleDone);
  51. container.addEventListener("click", deleteDone);
  52. populateList(items, container);

写完了上线

</>复制代码

  1. npm run build

好,我们总结一下:

1.不要陷入到开发环境里,我们是学习ES6,而不是webpack,所以直接用我写的webpack工作流就好。

2.要会写这个项目的html和css,注意实际项目中css的引入方式。

3.学习mvc的思想,尝试使用通过修改数组的方式实现任务的增加、删除和修改功能。

4.掌握本地存储的用法。

好,本文就到这里,下节课我们再做一个更贴近工作的例子。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109695.html

相关文章

  • Day15 - LocalStorage

    摘要:完整中文版指南及视频教程在从零到壹全栈部落。当页面重新刷新或者关闭之前,执行清除页面的缓存。慎用,尤其在生产环境中。 Day15 - LocalStorage (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班首期班(10.28号正式开班,欢迎抢座) 作者:©黎跃春-追时间的人 简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 ...

    用户84 评论0 收藏0
  • 如何使用React Hooks建立一个待办事项列表

    摘要:构建事项列表待办事项清单是使用广泛的例子,理由很充分它们是很棒的练习工具。对表单使用我们的表单应该跟踪的值并在保存提交时执行方法。记得敲哦对事项列表使用我们的事项列表也需要。在中传递这个函数我们使用方法把所有不符合的事项保存下来。 原文地址:How to Build a Todo List with React Hooks showImg(https://segmentfault.c...

    waruqi 评论0 收藏0
  • todolist--初学者练习使用vuejs方法

    摘要:我们都知道,现在的前端开发的最火的三大框架之一,它极大地方便了我们的前端工作者的工作,这是笔者整理的一份用写的一个的整个过程。 我们都知道,现在Vuejs的前端开发的最火的三大框架之一,它极大地方便了我们的前端工作者的工作,这是笔者整理的一份用vue写的一个todolist的整个过程。 1.新建一个文件夹,配置环境变量 安装的命令行有: npm init -y npm i -S tod...

    NSFish 评论0 收藏0
  • React + Ramda: 函数式编程尝鲜

    摘要:每当的值改变后,我们只需要重新调用方法即可现在,让我们来实现一个类似风格的归约函数,以不断的递增。归约函数是不允许修改当前状态的,所有最简单的实现方式就是。 原文:Functional Components with React stateless functions and Ramda 阅读本文需要的知识储备: 函数式编程基本概念(组合、柯里化、透镜) React 基本知识(组件、...

    tomener 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<