Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)

Vue2.x 项目实战(一)

内容参考链接Vue2.x全家桶
Vue2.x 全家桶参考链接

Vue2.x项目(一)
Vue2.x 实现一个任务清单

Vue2.x项目(二)
Vue2.x 实现GitHub搜索案例

Vue3.x项目(三)
Vue3.x 实现一个任务清单

文章目录

Vue2.x 实现 todoList

1、前言

如果你对 vue 的基础知识还很陌生,推荐先去学习一下 vue 基础

  • 如果你 刚学完 vue 基础知识, 想检查一下自己的学习成果
  • 如果你 已学完 vue 基础知识, 想快速回顾复习
  • 如果你 已精通 vue 基础知识, 想做个小案例
  • 那不妨看完这篇文章, *我保证你一定会有收获的!

2、项目演示(一睹为快)

todoList 项目演示

Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)

; 3、涉及知识点

  • Vue基础:插值语法,常用指令,键盘事件,列表渲染,计算属性,事件监听,生命周期
  • Vue进阶:props(父传子),自定义事件(任意组件间通信),自定义事件的解绑,$nextTick 异步
    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:20c3182a-e75e-4398-bac9-0537dd6980f0
    [En]

    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:fbbfa127-0b2a-4455-b77c-405bbe8b2cd5

  • 第三方库:nonoid(下载导入即可使用)

备注:

  1. 任意组件间的通信方式有很多种(全局事件总线,消息订阅预发布…), 熟练掌握一种即可(推荐自定义事件,配置简单,容易理解)
  2. 本文是 vue 基础的练习项目, 不涉及 vue 周边(Vuex,Vue-router)

4、项目详情(附源码及解析)

该项目有 五个组件 构成:

(1)App.vue 父组件,以上四个子组件 最终归并的地方,并实现很多功能相关方法

(2)MyHeader.vue 子组件:头部,用于用户文本框 输入添加任务事项

(3)MyList.vue 子组件:躯干,用于 呈现任务的列表

(4)MyItem.vue 子中子组件,Mylist.vue 的子组件,用于 呈现每个任务及编辑删除

(5)MyFooter 子组件,用于 显示所选个数和总个数及删除已完成任务

App.vue 父组件

  • 所有子组件的汇集点
  • 里面定义里很多方法,通过 props 父传子,供子组件们去使用
    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:58f0bec7-8610-4192-ae10-d5bd42c7379b
    [En]

    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:9addaec8-4857-47cd-84e3-316250a416f2

<template>  <!-- 最外层容器 -->  <div class="todo-container">    <div class="todo-wrap">      <!-- 头部子组件,子传父,自定义 addTodo事件,添加一个 todo对象 -->      <MyHeader @addTodo="addTodo" />      <!-- 任务列表子组件,父传子,动态绑定对应事件 -->      <MyList :updateTodo="updateTodo" :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo" />      <!-- 底部子组件,子传父,全选和全清除 -->      <MyFooter        :todos="todos"        @checkAllTodo="checkAllTodo"        @clearAllTodo="clearAllTodo"      />    </div>  </div></template><script>import MyHeader from "./components/MyHeader.vue";import MyList from "./components/MyList.vue";import MyFooter from "./components/MyFooter.vue";export default {  name: "App",  components: { MyHeader, MyList, MyFooter },  data() {    return {      todos: JSON.parse(localStorage.getItem("todos")) || [],    };  },  methods: {    addTodo(todoObj) {      this.todos.unshift(todoObj);    },    checkTodo(id) {      this.todos.forEach((todo) => {        if (todo.id === id) todo.done = !todo.done;      });    },    updateTodo(id, title) {      this.todos.forEach((todo) => {        if (todo.id === id) todo.title = title;      });    },    deleteTodo(id) {      this.todos = this.todos.filter((todo) => todo.id !== id);    },    checkAllTodo(done) {      this.todos.forEach((todo) => {        todo.done = done;      });    },    clearAllTodo() {      this.todos = this.todos.filter((todo) => {        return !todo.done;      });    },  },  watch: {    todos: {      deep: true,      handler(value) {        localStorage.setItem("todos", JSON.stringify(value));      },    },  },  beforeDestroy() {    this.$off(['addTodo', 'checkAllTodo', 'clearAllTodo'])  }};</script><style>body {  background: #fff;}.btn {  display: inline-block;  padding: 4px 12px;  margin-bottom: 0;  font-size: 14px;  line-height: 20px;  text-align: center;  vertical-align: middle;  cursor: pointer;  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),    0 1px 2px rgba(0, 0, 0, 0.05);  border-radius: 4px;}.btn-danger {  color: #fff;  background-color: #da4f49;  border: 1px solid #bd362f;}.btn-edit {  margin-right: 5px;  background-color: skyblue;  border: 1px solid rgb(102, 158, 180);}.btn-danger:hover {  color: #fff;  background-color: #bd362f;}.btn:focus {  outline: none;}.todo-container {  width: 600px;  margin: 10px auto;}.todo-container .todo-wrap {  padding: 10px;  border: 1px solid #ddd;  border-radius: 5px;}</style>

MyHeader.vue 组件

  • 终端键入 npm i nanoid,安装 nanoid
  • <style></code> 标签里的 scoped,表示里面定义的样式 <strong>仅在当前组件中生效</strong></li></ul><pre><code class="prism language-javascript"><span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"todo-header"</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 双向数据绑定 title,绑定键盘 enter 键,点击触发 add 事件,添加 title <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token string">"text"</span> placeholder<span class="token operator">=</span><span class="token string">"请输入你的任务名称,按回车键确认"</span> v<span class="token operator">-</span>model<span class="token operator">=</span><span class="token string">"title"</span> @keyup<span class="token punctuation">.</span>enter<span class="token operator">=</span><span class="token string">"add"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span></li> </ul> <p><span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> nanoid <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"nanoid"</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">"MyHeader"</span><span class="token punctuation">,</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span></p> <pre><code> <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <p><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></p> <pre><code> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>title<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"输入不能为空"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> todoObj <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token function">nanoid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span>title<span class="token punctuation">,</span> <span class="token literal-property property">done</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token string">"addTodo"</span><span class="token punctuation">,</span> todoObj<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>title <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> </code></pre> <p><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></p> <p><span class="token operator"><</span>style scoped<span class="token operator">></span> <span class="token punctuation">.</span>todo<span class="token operator">-</span>header input <span class="token punctuation">{</span> <span class="token literal-property property">width</span><span class="token operator">:</span> 578px<span class="token punctuation">;</span> <span class="token literal-property property">height</span><span class="token operator">:</span> 28px<span class="token punctuation">;</span> font<span class="token operator">-</span>size<span class="token operator">:</span> 14px<span class="token punctuation">;</span> <span class="token literal-property property">border</span><span class="token operator">:</span> 1px solid #ccc<span class="token punctuation">;</span> border<span class="token operator">-</span>radius<span class="token operator">:</span> 4px<span class="token punctuation">;</span> <span class="token literal-property property">padding</span><span class="token operator">:</span> 4px 7px<span class="token punctuation">;</span> margin<span class="token operator">-</span>bottom<span class="token operator">:</span> 10px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>header input<span class="token operator">:</span>focus <span class="token punctuation">{</span> <span class="token literal-property property">outline</span><span class="token operator">:</span> none<span class="token punctuation">;</span> border<span class="token operator">-</span>color<span class="token operator">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token number">82</span><span class="token punctuation">,</span> <span class="token number">168</span><span class="token punctuation">,</span> <span class="token number">236</span><span class="token punctuation">,</span> <span class="token number">0.8</span><span class="token punctuation">)</span><span class="token punctuation">;</span> box<span class="token operator">-</span>shadow<span class="token operator">:</span> inset <span class="token number">0</span> 1px 1px <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0.075</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token number">0</span> 8px <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token number">82</span><span class="token punctuation">,</span> <span class="token number">168</span><span class="token punctuation">,</span> <span class="token number">236</span><span class="token punctuation">,</span> <span class="token number">0.6</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> </code></pre><p>MyList.vue 组件</p><ul><li>该组件即为 ul 标签包裹着 MyItem.vue 组件的果皮</li><li>真正的果肉在 MyItem.vue 组件里面~~</li></ul><pre><code class="prism language-javascript"><span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span>ul <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"todo-main"</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> <span class="token operator">:</span>todo,动态绑定,供 MyItem<span class="token punctuation">.</span>vue 使用 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 自定义 updateTodo 事件,子传父,供子组件编辑更新数据 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>MyItem v<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"todoObj in todos"</span> <span class="token operator">:</span>key<span class="token operator">=</span><span class="token string">"todoObj.id"</span> <span class="token operator">:</span>todo<span class="token operator">=</span><span class="token string">"todoObj"</span> <span class="token operator">:</span>checkTodo<span class="token operator">=</span><span class="token string">"checkTodo"</span> <span class="token operator">:</span>deleteTodo<span class="token operator">=</span><span class="token string">"deleteTodo"</span> @updateTodo<span class="token operator">=</span><span class="token string">"updateTodo"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span></p> <p><span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">import</span> MyItem <span class="token keyword">from</span> <span class="token string">"./MyItem.vue"</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">"MyList"</span><span class="token punctuation">,</span> <span class="token literal-property property">components</span><span class="token operator">:</span> <span class="token punctuation">{</span> MyItem <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">props</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"todos"</span><span class="token punctuation">,</span> <span class="token string">"checkTodo"</span><span class="token punctuation">,</span> <span class="token string">"deleteTodo"</span><span class="token punctuation">,</span> <span class="token string">"updateTodo"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></p> <p><span class="token operator"><</span>style scoped<span class="token operator">></span> <span class="token punctuation">.</span>todo<span class="token operator">-</span>main <span class="token punctuation">{</span> margin<span class="token operator">-</span>left<span class="token operator">:</span> 0px<span class="token punctuation">;</span> <span class="token literal-property property">border</span><span class="token operator">:</span> 1px solid #ddd<span class="token punctuation">;</span> border<span class="token operator">-</span>radius<span class="token operator">:</span> 2px<span class="token punctuation">;</span> <span class="token literal-property property">padding</span><span class="token operator">:</span> 0px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>empty <span class="token punctuation">{</span> <span class="token literal-property property">height</span><span class="token operator">:</span> 40px<span class="token punctuation">;</span> line<span class="token operator">-</span>height<span class="token operator">:</span> 40px<span class="token punctuation">;</span> <span class="token literal-property property">border</span><span class="token operator">:</span> 1px solid #ddd<span class="token punctuation">;</span> border<span class="token operator">-</span>radius<span class="token operator">:</span> 2px<span class="token punctuation">;</span> padding<span class="token operator">-</span>left<span class="token operator">:</span> 5px<span class="token punctuation">;</span> margin<span class="token operator">-</span>top<span class="token operator">:</span> 10px<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> </code></pre><p>MyItem.vue 组件</p><ul><li>获取焦点的时候要用 <code>$nextTick</code> (等 DOM 节点更新后执行),或者用 setTimeout 异步包裹也能达到同样的效果</li><li>Vue2.x <strong>不能监测</strong> 到 <strong>对象属性的添加或删除</strong>。因为 Vue.js 在 <strong>初始化实例时</strong> 将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue2.x 转换它,才能让它是响应的。</li><li>所以,当我们想要在 data 中或者 data 中的对象添加新的属性时,我们需要使用 <code>Vue.set()</code> 和 <code>vm.$set()</code>,否则是无法触发视图更新的。</li></ul><pre><code class="prism language-javascript"><span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span>li<span class="token operator">></span> <span class="token operator"><</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 复选框,<span class="token operator">:</span>checked 单向绑定 todo 是否已完成,@change 检测复选框的变化 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token string">"checkbox"</span> <span class="token operator">:</span>checked<span class="token operator">=</span><span class="token string">"todo.done"</span> @change<span class="token operator">=</span><span class="token string">"handleCheck(todo.id)"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 非编辑状态下,在 sapn 标签中展示 todo <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>span v<span class="token operator">-</span>show<span class="token operator">=</span><span class="token string">"!todo.isEdit"</span><span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span> todo<span class="token punctuation">.</span>title <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>span<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 绑定失去焦点事件,更新内容。ref 打标识,用于自动获取焦点 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token string">"text"</span> style<span class="token operator">=</span><span class="token string">"height: 22px"</span> v<span class="token operator">-</span>show<span class="token operator">=</span><span class="token string">"todo.isEdit"</span> <span class="token operator">:</span>value<span class="token operator">=</span><span class="token string">"todo.title"</span> @blur<span class="token operator">=</span><span class="token string">"handleBlur(todo, $event)"</span> ref<span class="token operator">=</span><span class="token string">"inputTitle"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 删除 todo <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>button <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"btn btn-danger"</span> @click<span class="token operator">=</span><span class="token string">"handleDelete(todo.id)"</span><span class="token operator">></span>删除<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 编辑状态下,展示输入框,隐藏编辑按钮。 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>button v<span class="token operator">-</span>show<span class="token operator">=</span><span class="token string">"!todo.isEdit"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"btn btn-edit"</span> @click<span class="token operator">=</span><span class="token string">"handleEdit(todo)"</span><span class="token operator">></span>编辑<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span></p> <p><span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">"MyItem"</span><span class="token punctuation">,</span></p> <p><span class="token literal-property property">props</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"todo"</span><span class="token punctuation">,</span> <span class="token string">"checkTodo"</span><span class="token punctuation">,</span> <span class="token string">"deleteTodo"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span></p> <pre><code><span class="token function">handleCheck</span><span class="token punctuation">(</span><span class="token parameter">id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">checkTodo</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">handleDelete</span><span class="token punctuation">(</span><span class="token parameter">id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">confirm</span><span class="token punctuation">(</span><span class="token string">"确定删除当前任务吗?"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">deleteTodo</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">handleEdit</span><span class="token punctuation">(</span><span class="token parameter">todo</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Reflect<span class="token punctuation">.</span><span class="token function">has</span><span class="token punctuation">(</span>todo<span class="token punctuation">,</span> <span class="token string">'isEdit'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> todo<span class="token punctuation">.</span>isEdit <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$set</span><span class="token punctuation">(</span>todo<span class="token punctuation">,</span> <span class="token string">"isEdit"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>inputTitle<span class="token punctuation">.</span><span class="token function">focus</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">handleBlur</span><span class="token punctuation">(</span><span class="token parameter">todo<span class="token punctuation">,</span> e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> todo<span class="token punctuation">.</span>isEdit <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>value<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'输入内容不能为空!'</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token string">'updateTodo'</span><span class="token punctuation">,</span> todo<span class="token punctuation">.</span>id<span class="token punctuation">,</span> e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> </code></pre> <p><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></p> <p><span class="token operator"><</span>style scoped<span class="token operator">></span> span <span class="token punctuation">{</span> <span class="token literal-property property">color</span><span class="token operator">:</span> orange<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p>li <span class="token punctuation">{</span> list<span class="token operator">-</span>style<span class="token operator">:</span> none<span class="token punctuation">;</span> <span class="token literal-property property">height</span><span class="token operator">:</span> 36px<span class="token punctuation">;</span> line<span class="token operator">-</span>height<span class="token operator">:</span> 36px<span class="token punctuation">;</span> <span class="token literal-property property">padding</span><span class="token operator">:</span> <span class="token number">0</span> 5px<span class="token punctuation">;</span> border<span class="token operator">-</span>bottom<span class="token operator">:</span> 1px solid #ddd<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p>li label <span class="token punctuation">{</span> <span class="token literal-property property">cursor</span><span class="token operator">:</span> pointer<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p>input <span class="token punctuation">{</span> margin<span class="token operator">-</span>right<span class="token operator">:</span> 5px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p>li label li input <span class="token punctuation">{</span> vertical<span class="token operator">-</span>align<span class="token operator">:</span> middle<span class="token punctuation">;</span> margin<span class="token operator">-</span>right<span class="token operator">:</span> 6px<span class="token punctuation">;</span> <span class="token literal-property property">position</span><span class="token operator">:</span> relative<span class="token punctuation">;</span> <span class="token literal-property property">top</span><span class="token operator">:</span> <span class="token operator">-</span>1px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p>li button <span class="token punctuation">{</span> <span class="token literal-property property">float</span><span class="token operator">:</span> right<span class="token punctuation">;</span> <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span> margin<span class="token operator">-</span>top<span class="token operator">:</span> 3px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token literal-property property">li</span><span class="token operator">:</span>before <span class="token punctuation">{</span> <span class="token literal-property property">content</span><span class="token operator">:</span> initial<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token literal-property property">li</span><span class="token operator">:</span>last<span class="token operator">-</span>child <span class="token punctuation">{</span> border<span class="token operator">-</span>bottom<span class="token operator">:</span> none<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token literal-property property">li</span><span class="token operator">:</span>hover <span class="token punctuation">{</span> background<span class="token operator">-</span>color<span class="token operator">:</span> #ddd<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token literal-property property">li</span><span class="token operator">:</span>hover button <span class="token punctuation">{</span> <span class="token literal-property property">display</span><span class="token operator">:</span> block<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> </code></pre><p>MyFooter.vue 组件</p><ul><li>底部的展示,当没有任务时隐藏该组件</li><li>reduce() 是一个高阶函数,接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值 <a href="https://www.runoob.com/jsref/jsref-reduce.html">参考链接</a></li></ul><pre><code class="prism language-javascript"><span class="token operator"><</span>template<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> total 不为 <span class="token number">0</span> 则显示底部,否则隐藏 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"todo-footer"</span> v<span class="token operator">-</span>show<span class="token operator">=</span><span class="token string">"total"</span><span class="token operator">></span> <span class="token operator"><</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 是否全选,双向绑定 isAll <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token string">"checkbox"</span> v<span class="token operator">-</span>model<span class="token operator">=</span><span class="token string">"isAll"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 插值语法呈现数值 <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>span <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"done"</span><span class="token operator">></span>已完成 <span class="token punctuation">{</span><span class="token punctuation">{</span> doneTotal <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">span> </span><span class="token regex-delimiter">/</span></span> <span class="token operator"><</span>span <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"total"</span><span class="token operator">></span>全部 <span class="token punctuation">{</span><span class="token punctuation">{</span> total <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>span<span class="token operator">></span> <span class="token operator"><</span>button <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"btn btn-danger"</span> @click<span class="token operator">=</span><span class="token string">"clearAll()"</span><span class="token operator">></span>清除已完成任务<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>template<span class="token operator">></span></p> <p><span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">"MyFooter"</span><span class="token punctuation">,</span> <span class="token literal-property property">props</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"todos"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">computed</span><span class="token operator">:</span> <span class="token punctuation">{</span></p> <pre><code><span class="token function">total</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>todos<span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">doneTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>todos<span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">pre<span class="token punctuation">,</span> todo</span><span class="token punctuation">)</span> <span class="token operator">=></span> pre <span class="token operator">+</span> <span class="token punctuation">(</span>todo<span class="token punctuation">.</span>done <span class="token operator">?</span> <span class="token number">1</span> <span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">isAll</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>doneTotal <span class="token operator">===</span> <span class="token keyword">this</span><span class="token punctuation">.</span>total <span class="token operator">&&</span> <span class="token keyword">this</span><span class="token punctuation">.</span>total <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">set</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token string">"checkAllTodo"</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> </code></pre> <p><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span></p> <pre><code><span class="token function">clearAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token string">"clearAllTodo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> </code></pre> <p><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></p> <p><span class="token operator"><</span>style scoped<span class="token operator">></span> <span class="token punctuation">.</span>done <span class="token punctuation">{</span> font<span class="token operator">-</span>weight<span class="token operator">:</span> bold<span class="token punctuation">;</span> <span class="token literal-property property">color</span><span class="token operator">:</span> skyblue<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>total <span class="token punctuation">{</span> font<span class="token operator">-</span>weight<span class="token operator">:</span> bold<span class="token punctuation">;</span> <span class="token literal-property property">color</span><span class="token operator">:</span> palevioletred<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>footer <span class="token punctuation">{</span> <span class="token literal-property property">height</span><span class="token operator">:</span> 40px<span class="token punctuation">;</span> line<span class="token operator">-</span>height<span class="token operator">:</span> 40px<span class="token punctuation">;</span> padding<span class="token operator">-</span>left<span class="token operator">:</span> 6px<span class="token punctuation">;</span> margin<span class="token operator">-</span>top<span class="token operator">:</span> 5px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>footer label <span class="token punctuation">{</span> <span class="token literal-property property">display</span><span class="token operator">:</span> inline<span class="token operator">-</span>block<span class="token punctuation">;</span> margin<span class="token operator">-</span>right<span class="token operator">:</span> 20px<span class="token punctuation">;</span> <span class="token literal-property property">cursor</span><span class="token operator">:</span> pointer<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>footer label input <span class="token punctuation">{</span> <span class="token literal-property property">position</span><span class="token operator">:</span> relative<span class="token punctuation">;</span> <span class="token literal-property property">top</span><span class="token operator">:</span> <span class="token operator">-</span>3px<span class="token punctuation">;</span> vertical<span class="token operator">-</span>align<span class="token operator">:</span> middle<span class="token punctuation">;</span> margin<span class="token operator">-</span>right<span class="token operator">:</span> <span class="token operator">-</span>10px<span class="token punctuation">;</span> <span class="token punctuation">}</span></p> <p><span class="token punctuation">.</span>todo<span class="token operator">-</span>footer button <span class="token punctuation">{</span> <span class="token literal-property property">float</span><span class="token operator">:</span> right<span class="token punctuation">;</span> margin<span class="token operator">-</span>top<span class="token operator">:</span> 5px<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> </code></pre><h3><a id="5_532"></a>5、写在最后的话</h3><p>如果你是 <strong>看完全篇</strong> 阅读到了这里,我相信你一定是有收获的!</p><p>那么下面不妨打开自己的电脑,启动自己的编译器,<strong>来跟着做 / 自己做一遍吧!</strong></p><p><strong>好吧,我骗了你,真正学会它可能不止两个小时,但再多花点时间,你对 vue 的理解可能会有质的提升,加油~</strong></p><p>如果这篇文章对你有些许帮助的话,不妨 <strong>三连 + 关注</strong> 支持一下~~</p><p><strong>下一篇是 github 的搜索 demo,也是使用的 vue2.x 实现的,一起期待一下吧~</strong></p><p><img src="https://img-blog.csdnimg.cn/45fc82a82c6542bdb2ff4986377d8db3.png"></p></style>

    Original: https://blog.csdn.net/qq_45902692/article/details/126738430
    Author: 前端杂货铺
    Title: Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/560868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球