image.png
    1. 先使用静态组件的方式把页面效果实现出来。
    (1) App.vue
    (2) BugHeader.vue
    (3) BugList.vue
    (4) BugItem.vue
    (5) BugFooter.vue
    2. 在BugList.vue中提供bugList数据,实现动态数据展示。
    3. 保存bug:
    (1) 获取用户输入的信息采用双向数据绑定。
    ① 通过Date.now()获取时间戳的方式来搞定id。
    (2) 将BugList.vue中的bugList数据提升到父组件App.vue中。
    (3) 父组件向子组件传递,采用:bugList=”bugList”,在子组件当中使用props接收。
    (4) 子组件向父组件传递,父组件可以提前定义一个函数,将函数传递给子组件,在子组件中调用这个函数即可。
    (5) 该功能的小问题:
    ① 保存完成后自动清空。
    ② 输入为空时不能保存(可以加trim去除空白),并且提示必须输入。
    4. 修改bug的状态
    (1) 勾选和取消勾选,会触发click事件或者change事件。
    (2) 事件发生后,获取bug的id,将id传递给App组件中的回调函数,遍历数组,拿到要修改的bug对象,更改bug对象的resolved属性值。
    5. 删除bug
    (1) 删除时可以调用数组的filter方法进行过滤,将过滤之后的新数组赋值给this.bugList
    6. 统计bug
    (1) 第一种:普通计数器统计。
    (2) 第二种:数组的reduce方法完成条件统计。
    7. 全选和取消全选
    (1) 全选复选框的状态维护:
    ① 已解决的数量=== 总数量 时,勾选。② 全部删除后,应该取消勾选。
    (1) 全部删除了可以将footer隐藏。v-show
    (2) 全选和取消全选
    1. 清除已解决
    (1) 调用数组的filter方法进行过滤,生成新数组,将其赋值给this.bugList
    2. 实现编辑功能
    (1) 功能描述
    ① 鼠标移动到描述信息上之后,光标变成小手。
    ② 点击描述信息之后,将描述信息放入文本框。并且同时让文本框获得焦点。
    ③ 用户开始修改描述信息(要注意避免将信息修改为空)
    ④ 输入修改信息之后,文本框失去焦点,显示修改后的描述信息。
    (2) 实现功能的核心技术:
    ① 给bug对象扩展一个具有响应式的editState属性,如果是true表示处于编辑状态,false表示处于未编辑状态:this.$set(bug, ‘editState’, true)
    ② 获得焦点的动作如何完成:
    1) 在文本框上添加ref=”inputDesc”,然后通过this.$refs.inputDesc获取到dom元素,调用focus()让其获取焦点。
    2) 以上操作需要在下一次渲染DOM完成后执行:nextTick
    a. this.$nextTick(function(){this.$refs.inputDesc.focus()})