当前位置:   article > 正文

vue实现ToDoList待办事项/清单_vue待办事项

vue待办事项

1、这个功能运用的知识点比较多,computed计算,watch监听,directives自定义指令和methods定义事件,还有一些属性绑定,列表渲染,表单绑定指令,按键修饰符,表单修饰符等...

2、部分知识点

3、效果展示

功能说明:

1.在头部输入框内输入内容按回车键即可待办事项

2.单击待办项的前面选择框可实现未完成或已完成切换

3.双击待办内容可以修改里面的内容,修改完成后点击空白处或enter键都可实现修改,如果不想修改按Esc键可恢复初始内容。

4.单击待办事项最后删除按钮可删除该待办项

5.表头右边的数字是未完成和已完成的待办事项数量

6.另外待办事项的数据已存储在本地,保留已有数据(换浏览器需重新添加)

7.具体功能请亲自操作尝试

4、代码

vue.js引入(vue.js引入地址记得修改)

css代码:

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. list-style: none;
  6. }
  7. body {
  8. background-color: #cdcdcd;
  9. }
  10. .header {
  11. width: 100%;
  12. height: 50px;
  13. background-color: #323232;
  14. }
  15. .header div{
  16. width: 600px;
  17. height: 50px;
  18. margin: auto;
  19. }
  20. .header h1 {
  21. float: left;
  22. width: 100px;
  23. line-height: 50px;
  24. color: #DDD;
  25. font-weight: 400;
  26. font-size: 24px;
  27. cursor: pointer;
  28. }
  29. .header input {
  30. float: right;
  31. width: 60%;
  32. height: 24px;
  33. margin-top: 12px;
  34. text-indent: 10px;
  35. border-radius: 5px;
  36. box-shadow: 0 1px 0 rgba(255, 255, 255, 0.24), 0 1px 6px rgba(0, 0, 0, 0.45) inset;
  37. border: none;
  38. }
  39. .content {
  40. width: 600px;
  41. margin: auto;
  42. }
  43. h3 {
  44. font-size: 24px;
  45. width: 600px;
  46. height: 30px;
  47. margin: 20px 0;
  48. vertical-align: middle;
  49. }
  50. h3>span{
  51. width: 20px;
  52. height: 20px;
  53. float: right;
  54. font-size: 14px;
  55. color: #666;
  56. margin-top: 5px;
  57. text-align: center;
  58. border-radius: 50%;
  59. background-color: #e6e6fa;
  60. }
  61. .item {
  62. height: 32px;
  63. line-height: 32px;
  64. background: #fff;
  65. position: relative;
  66. margin-bottom: 10px;
  67. padding: 0 15px;
  68. border-radius: 3px;
  69. border-left: 5px solid #629A9C;
  70. box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);
  71. }
  72. .list:nth-of-type(2) .item{
  73. opacity: 0.5;
  74. }
  75. .item input:nth-of-type(1) {
  76. width: 22px;
  77. height: 22px;
  78. margin-top: 5px;
  79. }
  80. .item input:nth-of-type(2) {
  81. width: 200px;
  82. height: 22px;
  83. vertical-align: middle;
  84. margin-bottom: 13px;
  85. }
  86. .item span {
  87. vertical-align: top;
  88. }
  89. .item button {
  90. float: right;
  91. width: 22px;
  92. height: 22px;
  93. margin-top: 5px;
  94. }
  95. </style>

 html代码:

  1. <div id="app">
  2. <div class="header">
  3. <div>
  4. <h1>ToDoList</h1>
  5. <!-- .trim去除文本中的空格 -->
  6. <input type="text" placeholder="添加ToDo" v-model.trim="temp" @keyup.enter="addItem()">
  7. </div>
  8. </div>
  9. <div class="content">
  10. <h3>未完成<span>{{not()}}</span></h3>
  11. <div class="list">
  12. <!-- 遍历list数据 -->
  13. <div class="item" v-for="item in undolist " :key="item.title">
  14. <input type="checkbox" v-model="item.done">
  15. <!-- @dblclick 双击让临时数据设置为当前标题;修改状态为1代表编辑 -->
  16. <!-- v-show="item.state==0" 当编辑状态为0时候才显示 -->
  17. <span @dblclick="editTemp=item.title;item.state=1" v-show="item.state==0">{{item.title}}</span>
  18. <!-- v-model="editTemp" 绑定临时数据 -->
  19. <!-- @keyup.enter 回车键修改当前行的数据;更改编辑状态为0正常显示状态-->
  20. <!-- @blur="item.title=editTemp;item.state=0;" 失去焦点完成修改-->
  21. <!-- @keyup.esc esc键把当前行的编辑为0 正常;正在编辑的数据等于原来的数据-->
  22. <input type="text"
  23. v-model="editTemp"
  24. v-show="item.state==1"
  25. v-focus="item.state==1"
  26. @keyup.enter="item.title=editTemp;item.state=0;"
  27. @blur="item.title=editTemp;item.state=0;"
  28. @keyup.esc="item.state=0;editTemp=item.title;"
  29. >
  30. <!-- 删除按钮 -->
  31. <button @click="delItem(item)">X</button>
  32. </div>
  33. </div>
  34. <h3>已完成<span>{{finish()}}</span></h3>
  35. <div class="list">
  36. <!-- 遍历list数据 -->
  37. <div class="item" v-for="item in dolist " :key="item.title">
  38. <!-- 是否选中 -->
  39. <input type="checkbox" v-model="item.done">
  40. <!-- 标题 -->
  41. <span @dblclick="editTemp=item.title;item.state=1" v-show="item.state==0">{{item.title}}</span>
  42. <input type="text"
  43. v-model="editTemp"
  44. v-show="item.state==1"
  45. v-focus="item.state==1"
  46. @keyup.enter="item.title=editTemp;item.state=0;"
  47. @blur="item.title=editTemp;item.state=0;"
  48. @keyup.esc="item.state=0;editTemp=item.title;"
  49. >
  50. <!-- 删除按钮 -->
  51. <button @click="delItem(item)">X</button>
  52. </div>
  53. </div>
  54. </div>
  55. </div>

 js代码:

  1. <script>
  2. new Vue({
  3. el: "#app",
  4. data: {
  5. // list 清单列表数据
  6. // title清单的标题;done是否已经完成
  7. // 通过本地存储来获取数据
  8. list: JSON.parse(localStorage.getItem("list") || "[]"),
  9. temp: "", //临时标题
  10. editTemp: "", //编辑的临时数据
  11. editIndex: null, //记录编辑第几行
  12. },
  13. directives: {
  14. focus: {
  15. // 更新的时候执行
  16. update(el, binding) {
  17. console.log(binding.value)
  18. // 当自定义指令的值是true时候当前节点获取焦点
  19. if (binding.value) {
  20. el.focus();//输入框内容获取焦点
  21. // el.select();//输入框内容全选状态
  22. }
  23. }
  24. }
  25. },
  26. // 存 list数据,什么时候存?当list发送变化存,通过watch
  27. watch: {
  28. "list": {
  29. handler(nval) {
  30. localStorage.setItem("list", JSON.stringify(this.list))
  31. },
  32. deep: true
  33. }
  34. },
  35. // 计算出已经完成的数据,其实就是对list进行过滤,当done等于true保留
  36. computed: {
  37. // 未完成
  38. undolist() {
  39. // filter 过滤函数 当返回值是true 当前遍历的数据保留,返回为false当前数据过滤掉
  40. // 需要未完成保留 未完成done值为false 希望它保留取反!
  41. return this.list.filter(item => !item.done);
  42. },
  43. // 已完成
  44. dolist() {
  45. return this.list.filter(item => item.done);
  46. }
  47. },
  48. methods: {
  49. not(){
  50. var not = this.undolist.length;
  51. return not;
  52. },
  53. finish(){
  54. var finish = this.dolist.length;
  55. return finish;
  56. },
  57. editSure() {
  58. // 当editIndex为null就返回
  59. if (this.editIndex == null) {return};
  60. // 当确定编辑的时候,让list第正在编辑的标题等于 正在编辑的临时数据
  61. this.list[this.editIndex].title = this.editTemp;
  62. // 清空编辑临时数据
  63. this.editTemp = "";
  64. this.editIndex = null;
  65. },
  66. toEdit(title) {
  67. // 设置编辑的临时数据
  68. this.editTemp = title;
  69. // 查找出当前编辑的是第行数据
  70. this.editIndex = this.list.findIndex(item => item.title == title);
  71. },
  72. addItem() {
  73. // 创建一项清单
  74. var item = {title: this.temp,done: false,state: 0};
  75. // 在list的前面添加 item
  76. this.list.unshift(item);
  77. // 清空temp
  78. this.temp = "";
  79. },
  80. delItem(item) {
  81. console.log(item);
  82. // 查找item在list的下标
  83. // value遍历的元素当value的title值等于item的title
  84. var ind = this.list.findIndex(value => value.title === item.title);
  85. // 删除list第ind个
  86. // splice(从第几个,删除几个,添加内容)
  87. this.list.splice(ind, 1);
  88. }
  89. },
  90. })
  91. </script>

编写代码不易,记得点赞支持!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/223897
推荐阅读
相关标签
  

闽ICP备14008679号