• Vue中组件化编码使用(实战练习一)


    Vue中组件化编码的大致流程(初接触)、组件之间的参数传递(最基础的形式)、组件之间的配合完成一个需求

    1、在Vue中进行组件化编码

    1.1、组件化编码流程:

    • (1)、拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。

    • (2)、实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:

      ​ 1)、一个组件在用:放在组件自身即可。

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

    • (3)、实现交互:从绑定事件开始。

    1.2、props适用于:

    • (1)、父组件 ==> 子组件 通信

    • (2)、子组件 ==> 父组件 通信(要求父先给子一个函数)

    1.3 、注意事项

    使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的

    props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

    2、任务需求(需要实现的效果)

    在这里插入图片描述
    在这里插入图片描述

    3、项目结构

    在这里插入图片描述

    4、代码实例

    4.1 TheFooter.vue

    <template>
      <div class="todo-footer" >
    
          
          <input type="checkbox" />
    
        <span> 已完成2/全部3span>
        <button class="btn btn-danger">清除已完成任务button>
      div>
    template>
    
    <script>
    export default {
      name: "TheFooter",
    
      methods: {},
    };
    script>
    
    <style scoped>
    /*footer*/
    .todo-footer {
      height: 40px;
      line-height: 40px;
      padding-left: 6px;
      margin-top: 5px;
    }
    
    .todo-footer label {
      display: inline-block;
      margin-right: 20px;
      cursor: pointer;
    }
    
    .todo-footer label input {
      position: relative;
      top: -1px;
      vertical-align: middle;
      margin-right: 5px;
    }
    
    .todo-footer button {
      float: right;
      margin-top: 5px;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4.2 TheHeader.vue

    <template>
      <div class="todo-header">
        <input type="text" placeholder="请输入你的任务名称,按回车键确认" />
      div>
    template>
    
    <script>
    export default {
      name: "TheHeader",
    
      data() {
        return {};
      },
      methods: {},
    };
    script>
    
    <style scoped>
    /*header*/
    .todo-header input {
      width: 560px;
      height: 28px;
      font-size: 14px;
      border: 1px solid #ccc;
      border-radius: 4px;
      padding: 4px 7px;
    }
    
    .todo-header input:focus {
      outline: none;
      border-color: rgba(82, 168, 236, 0.8);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),
        0 0 8px rgba(82, 168, 236, 0.6);
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    4.3 TheItem.vue

    <template>
      <div>
        <li>
          <label>
            <input type="checkbox" />
            <span>吃饭span>
          label>
          <button>删除button>
        li>
    
        <li>
          <label>
            <input type="checkbox" />
            <span>睡觉span>
          label>
          <button>删除button>
        li>
    
        <li>
          <label>
            <input type="checkbox" />
            <span>打豆豆span>
          label>
          <button>删除button>
        li>
      div>
    template>
    
    <script>
    export default {
      name: "MyItem",
      data() {},
    
      methods: {},
    };
    script>
    
    <style scoped>
    /*item*/
    li {
      list-style: none;
      height: 36px;
      line-height: 36px;
      padding: 0 5px;
      border-bottom: 1px solid #ddd;
    }
    
    li label {
      float: left;
      cursor: pointer;
    }
    
    li label li input {
      vertical-align: middle;
      margin-right: 6px;
      position: relative;
      top: -1px;
    }
    
    li button {
      float: right;
    
      margin-top: 3px;
    }
    
    li:before {
      content: initial;
    }
    
    li:last-child {
      border-bottom: none;
    }
    
    li:hover {
      background-color: #ddd;
    }
    
    li:hover button {
      display: block;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    4.4 TheList.vue

    <template>
      <ul class="todo-main">
        <TheItem />
      ul>
    template>
    
    <script>
    import TheItem from "./TheItem";
    
    export default {
      name: "TheList",
      components: { TheItem },
    
    };
    script>
    
    <style scoped>
    /*main*/
    .todo-main {
      margin-left: 0px;
      border: 1px solid #ddd;
      border-radius: 2px;
      padding: 0px;
    }
    
    .todo-empty {
      height: 40px;
      line-height: 40px;
      border: 1px solid #ddd;
      border-radius: 2px;
      padding-left: 5px;
      margin-top: 10px;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    4.5 App.vue

    <template>
      <div id="root">
        <div class="todo-container">
          <div class="todo-wrap">
            <TheHeader />
            <TheList />
            <TheFooter />
          div>
        div>
      div>
    template>
    
    <script>
    import TheHeader from "./components/TheHeader";
    import TheList from "./components/TheList";
    import TheFooter from "./components/TheFooter.vue";
    
    export default {
      name: "App",
      components: { TheHeader, TheList, TheFooter },
      data() {
        return {};
      },
      methods: {},
    };
    script>
    
    <style>
    /*base*/
    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-danger:hover {
      color: #fff;
      background-color: #bd362f;
    }
    .btn:focus {
      outline: none;
    }
    .todo-container {
      width: 600px;
      margin: 0 auto;
    }
    .todo-container .todo-wrap {
      padding: 10px;
      border: 1px solid #ddd;
      border-radius: 5px;
    }
    style>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    4.6 main.js

    // The Vue build version to load with the `import` command
    // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    import Vue from 'vue'
    import App from './App'
    import router from './router'
    
    
    
    Vue.config.productionTip = false
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      router,
      components: { App },
      template: '<App/>'
    })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5、静态页面效果(功能还未添加)

    在这里插入图片描述


    在这里插入图片描述

  • 相关阅读:
    OpenCv读/写视频色差 方案
    软件质量评估的通用模型
    flink故障恢复的流程(从检查点恢复状态)
    线性回归算法
    基于 Next.js实现在线Excel
    解决你的R语言乱码问题
    [附源码]计算机毕业设计JAVA课程资源系统管理
    SpringBoot
    亚马逊云科技Amazon SageMaker推出新功能,提供强大、高效、更具成本效益的生成式AI服务
    基于《环境影响评价技术导则生态影响》(HJ 19—2022)下的生态环境影响评价技术方法及图件制作与案例
  • 原文地址:https://blog.csdn.net/weixin_43304253/article/details/126218585