• Vue_Todo_list案例(第一版)、自我任务复选框


    文件:

     

    目录

    总结:

        1.组件化编码流程

           2.props适用于:

            3.使用v-model时切记

            4.props传过来的若是对象类型的值,

    一、main.js

    二、App.vue

    三、components

       1.Item.vue

       2.List.vue

       3.MyFooter.vue

       4.MyHeader.vue


    总结:

        1.组件化编码流程

              ①拆分静态组件:组件要按照功能点拆分,命名不要与html冲突

              ②实现动态组件:考虑好数据存放位置,数据是一个组件在用,还是一些组件在用

                  一个组件用:放在组件自身即可

                  一些组件用:放在他们共同的父组件上(状态提升)

               ③实现交互:从绑定事件开始

           2.props适用于:

                父组件==》 子组件通信

                 子组件==》父组件通信(要求父先给子一个函数)

            3.使用v-model时切记

                 v-model绑定的值不能是props传过来的值,因为props是不可以修改的

             

            4.props传过来的若是对象类型的值,

                 修改对象中的属性时Vue不会报错,但是不推荐这样做

    一、main.js

    1. // 该文件是整个项目的入口文件
    2. // 引入vue,这个vue不能解析template配置项
    3. import Vue from 'vue'
    4. // 下面这个是引入完整版的vue。这个vue能解析template配置项
    5. // import Vue from 'vue/dis/vue'
    6. // 引入APP组件,它是所有组件的父组件
    7. import App from './App.vue'
    8. // 关闭vue的生产提示
    9. Vue.config.productionTip = false
    10. // 创建vue实例对象---vm
    11. new Vue({
    12. el:'#app',
    13. render: h => h(App),
    14. })

    二、App.vue

    1. <script>
    2. // 引入组件
    3. import MyFooter from './components/MyFooter.vue'
    4. import MyHeader from './components/MyHeader.vue'
    5. import List from './components/List.vue'
    6. import Item from './components/Item.vue'
    7. export default {
    8. name:'App',
    9. // 注册组件
    10. components:{
    11. MyFooter,
    12. MyHeader,
    13. List,
    14. Item,
    15. },
    16. data(){
    17. return{
    18. // done:true 这个地方不要加引号,否则会能跑,被误认为字符串
    19. todos:[
    20. {id:'001',title:'抽烟',done:true},
    21. {id:'003',title:'喝酒',done:false},
    22. {id:'002',title:'开车',done:true},
    23. ]
    24. }
    25. },
    26. methods:{
    27. // 添加一个todo
    28. addTodo(todoObj){
    29. this.todos.unshift(todoObj)
    30. },
    31. // 勾选or取消一个todo
    32. checkTodo(id){
    33. // 对上面的数据进行遍历
    34. this.todos.forEach( (todo)=>{
    35. if(todo.id === id){
    36. // 取反
    37. todo.done = !todo.done
    38. }
    39. })
    40. },
    41. // 删除一个todo
    42. deleteTodo(id){
    43. // 过滤器
    44. this.todos = this.todos.filter((todo)=>{
    45. // 将符合条件的留下
    46. return todo.id !== id
    47. })
    48. },
    49. // 底部复选框,将所有的todo都按照底部复选框的形式,(底部选就都选
    50. checkAllTodo(done){
    51. this.todos.forEach((todo)=>{
    52. todo.done = done
    53. })
    54. },
    55. // 清除所有已经完成的todo
    56. clearAllTodo(){
    57. this.todos = this.todos.filter((todo)=>{
    58. // 留下done为false的
    59. return !todo.done
    60. })
    61. }
    62. }
    63. }
    64. script>
    65. <style >
    66. /*base*/
    67. body {
    68. background: #fff;
    69. }
    70. .btn {
    71. display: inline-block;
    72. padding: 4px 12px;
    73. margin-bottom: 0;
    74. font-size: 14px;
    75. line-height: 20px;
    76. text-align: center;
    77. vertical-align: middle;
    78. cursor: pointer;
    79. box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    80. border-radius: 4px;
    81. }
    82. .btn-danger {
    83. color: #fff;
    84. background-color: #da4f49;
    85. border: 1px solid #bd362f;
    86. }
    87. .btn-danger:hover {
    88. color: #fff;
    89. background-color: #bd362f;
    90. }
    91. .btn:focus {
    92. outline: none;
    93. }
    94. .todo-container {
    95. width: 600px;
    96. margin: 0 auto;
    97. }
    98. .todo-container .todo-wrap {
    99. padding: 10px;
    100. border: 1px solid #ddd;
    101. border-radius: 5px;
    102. }
    103. style>

    三、components

       1.Item.vue