前端页面全新的写法(第七课)Vue中的组件

简介: 前端页面全新的写法(第七课)Vue中的组件

VueCli框架的实操内容(第七课)Vue中的组件


组件是可复用的 Vue 实例, 把一些公共的模块抽取出来,然后写成单独的的工具组件或者页面,在需要的页面中就直接引入即可那么我们可以将其抽出为一个组件进行复用。例如 页面头部、侧边、内容区,尾部,上传图片,等多个页面要用到一样的就可以做成组件,提高了代码的复用率。

个人观点:Vue组件等价于模块思想

文档内容解释

 

(6条消息) VueCLi的安装步骤(第四课)_星辰镜的博客-CSDN博客

VueCli项目的创建结构图

 

控制器操作自己的页面信息

组件注册 | Vue.js (vuejs.org)

前面我们是将所有的逻辑放到一个App.vue中:


在之前的案例中,我们只是创建了一个组件App;


如果我们一个应用程序将所有的逻辑都放在一个组件中,那么这个组件就会变成非常的臃 肿和难以维护;


所以组件化的核心思想应该是对组件进行拆分,拆分成一个个小的组件;


再将这些组件组合嵌套在一起,最终形成我们的应用程序;


我们来分析一下下面代码的嵌套逻辑,假如我们将所有的代码逻辑都放到一个App.vue组件 中:


我们会发现,将所有的代码逻辑全部放到一个组件中,代码是非常的臃肿和难以维护的。


并且在真实开发中,我们会有更多的内容和代码逻辑,对于扩展性和可维护性来说都是非 常差的。


所以,在真实的开发中,我们会对组件进行拆分,拆分成一个个功能的小组件。

 

 

 

 

组件又是上面三张图的意思 将整个页面分开实现功能 在用组件思想 组合在一起 便于后期期维护


App.vue

  <div class="app">
    <!--!主模块的内容信息 -->
    <h1>主版块的内容信息</h1>
    <!-- 头部 -->
    <header-item  attribute="接收子组件转来的信息" name="张三" age="20" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="李四" age="ASDF" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="王五" age="202" height="111"></header-item>
    <header-item attribute="接收子组件转来的信息"  name="张璐" age="203" height="111"></header-item>
    <!-- 中部 -->
    <banner :info="obj"></banner>
    <!-- 脚步 -->
   <footers class="product" name="我叫张上偶" age="20" id="1001002"></footers>
   <footers :class="$attrs.class " name="我叫张上偶" age="20" id="1001002"></footers>
   <footers class="product" name="我是谁" age="20" id="1001002"></footers>
   <footers class="product" name="我来自哪里" age="20" id="1001002"></footers>
   <mysolt></mysolt>
   <four></four>
   <div></div>
   <vue-sum-egg-five></vue-sum-egg-five>
  </div>
<template>
  <div class="app">
    <!--!主模块的内容信息 -->
    <h1>主版块的内容信息</h1>
    <!-- 头部 -->
    <header-item  attribute="接收子组件转来的信息" name="张三" age="20" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="李四" age="ASDF" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="王五" age="202" height="111"></header-item>
    <header-item attribute="接收子组件转来的信息"  name="张璐" age="203" height="111"></header-item>
    <!-- 中部 -->
    <banner :info="obj"></banner>
    <!-- 脚步 -->
   <footers class="product" name="我叫张上偶" age="20" id="1001002"></footers>
   <footers :class="$attrs.class " name="我叫张上偶" age="20" id="1001002"></footers>
   <footers class="product" name="我是谁" age="20" id="1001002"></footers>
   <footers class="product" name="我来自哪里" age="20" id="1001002"></footers>
   <mysolt></mysolt>
   <four></four>
   <div></div>
   <vue-sum-egg-five></vue-sum-egg-five>
  </div>
</template>
<script>
import banner from "../src/components/banner.vue";
import footers from '../src/components/footer.vue';
import mysolt from '../src/components/mySoltOne.vue'
import four from '../src/components/four.vue'
import VueSumEggFive from "../src/components/V-X.vue"
// import footer_item from "./footers.vue"
export default { 
  // eslint-disa le-next-line vue/multi-word-component-names
  name: "app",
  data() {
    return {
      message: "Hello world vue cli",
      // 在父模块中定义对象
      obj:{
        id:"1001001",
        name:"我是李四上",
        age:"78",
        height:"178",
        weight:"78",
        color:"red",
        sex:'男'
      }
    };
  },
//   局部注册
  components: {
    banner,
    footers,
    mysolt,
    four,
    // eslint-disable-next-line vue/no-unused-components
    VueSumEggFive
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
  },
};
</script>
<style scoped>
*{
    /* background-color: rgb(0, 100, 0); */
    background-color: rgb(151, 219, 178);
    border-top: 4px solid rgb(244, 8, 86) ;
}
h2 {
  background-color: azure;
}
h1 {
  color: rgb(20, 87, 116);
  background-color: rgb(159, 248, 251);
  text-align: center;
}
h3 {
  background-color: antiquewhite;
  color: cyan;
}
</style>

One.vue

import banner from "../src/components/banner.vue";
import footers from '../src/components/footer.vue';
import mysolt from '../src/components/mySoltOne.vue'
import four from '../src/components/four.vue'
import VueSumEggFive from "../src/components/V-X.vue"
// import footer_item from "./footers.vue"
export default { 
  // eslint-disa le-next-line vue/multi-word-component-names
  name: "app",
  data() {
    return {
      message: "Hello world vue cli",
      // 在父模块中定义对象
      obj:{
        id:"1001001",
        name:"我是李四上",
        age:"78",
        height:"178",
        weight:"78",
        color:"red",
        sex:'男'
      }
    };
  },
//   局部注册
  components: {
    banner,
    footers,
    mysolt,
    four,
    // eslint-disable-next-line vue/no-unused-components
    VueSumEggFive
  }
<template>
  <div class="header">
    <div>
      <h1>我是第一模块</h1>
      <h1>我是头部提示信息{{ age }}</h1>
      <h1>{{ message }}{{ name }}___{{ age }}___{{ height }}</h1>
      <h2>我是头部信息</h2>
      <h3>
        <nav><span>11111</span>&nbsp;&nbsp;<span>22222</span></nav>
      </h3>
    </div>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "header",
  // 
  props: {
    age: {
      type: Number,
      required: true,
      default: 18,
    },
  },
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {},
};
</script>
<style scoped>
* {
  font-size: 23px;
  background-color: rgb(17, 96, 123);
  color: white;
}
</style>

Banner.vue

<template>
  <div class="banner">
    <div>
      <h1>Two</h1>
      <h2>我是身体的一部分</h2>
      <ul>
        <!-- 用户转入的对象信息 -->
        <!-- 子模块 -->
        <h4>{{info}}</h4>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.id}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.name}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.sex}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.height}}cm</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.weight}}kg</li>
      </ul>
      <product class="product"></product>
      <h1>{{count}}</h1>
      <product @sonCom="getSon"  class="product"></product>
    </div>
  </div>
</template>
<script>
import Product from './product.vue';
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "banner",
  props:["info"],
  emits:{
    getSon:function(e){
      return e
    }
  },
  components:{
    Product 
  },
  data() {
    return {
      message: "Hello world vue cli",
      count:0
    };
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
    getSon(e){
      if(e){
        this.count--
      }else{
        this.count++
      }
      // console.log(e)
    }
  },
};
</script>
<style scoped>
*{
  font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
  font-size: 20px;
  background-color: rgb(4, 117, 77);
  color: rgb(255, 255, 255);
}
</style>

产品组件

<template>
    <div>
    <h1 >学生信息表格</h1>
    <table @click="emits">
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>爱好</th>
      </tr>
      <tr>
        <td>1001</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10012</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10012</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10014</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10015</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10016</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10017</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10018</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10019</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10010</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
    </table>
    <button @click="emitse(false)"> -1</button>
    <button @click="emitse(true)"> +1</button>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "product",
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("我是第一条的数据信息内容");
    },
    // 字组件专递个父组件的对象
    emits(flag){
      this.$emit("sonCom",flag)
      // this.$emit("sonCom", 监听事件
      // this.$emit("sonCom",{
        // name:"我叫对象",
        // age:123,
        // height:190,
        // weight:78,
        // sex:"男",
      // })
    }
  },
};
</script>
<style scoped>
*{
    /* background-color: rgb(0, 100, 0); */
    font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
    font-size:20px;
    border: 2px solid rgb(125, 193, 232);
    border-bottom: 1px solid rgb(255, 0, 0);
    margin: 2px;
    background-color: rgb(10, 79, 101);
}
table {
  width: 100%;
  border-collapse: collapse;
  margin: auto;
  border: 2px solid rgb(0, 0, 0);
  text-align: center;
}
th td {
  border: 1px solid rgb(255, 0, 0);
}
td{
  background-color: lightblue;
    border-left: 3px solid rgb(255, 166, 0);
   border-bottom: 2px solid rgb(9, 74, 97); 
}
h1{
  text-align: center;
}
</style>

export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "product",
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("我是第一条的数据信息内容");
    },
    // 字组件专递个父组件的对象
    emits(flag){
      this.$emit("sonCom",flag)
      // this.$emit("sonCom", 监听事件
      // this.$emit("sonCom",{
        // name:"我叫对象",
        // age:123,
        // height:190,
        // weight:78,
        // sex:"男",
      // })
    }
  }

footer.vue

<template>
  <div class="footers">
    <div>
      <!--  字模块-->
      <h1>{{attribute}}__{{name}}_{{age}}_{{id}}</h1>
      <h2>我是脚本信息</h2>
      <h3>信息脚本</h3>
      <h2>我是动态的脚本信息内容</h2>
    </div>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "footers",
  props:["attribute","name","age","id"],
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
  },
};
</script>
<style scoped>
*{
    background-color: rgb(173, 227, 229);
    color: rgb(6, 6, 6);
    font-size: 20px;
}
</style>

four.vue

<template>
    <div class="four">
    <h1>我是文本的信息内容介绍four</h1>
    </div>
</template>
<script>
export default{
    // eslint-disable-next-line vue/multi-word-component-names
    name:'four',
    data(){
        return{
            message:"Hello world vue cli"
        }
    },
    methods:{
        btnclick(){
            console.log("为难忘")
        }
    }
}
</script>
<style scoped>
*{
    background-color: chartreuse;
}
</style>

mySoltOne.vue

<template>
    <div class="mysolt">
        <h1>开始</h1>
        <slot>
            <h1>我的内容展示</h1>
        </slot>
        <h1>结尾</h1>
    </div>
</template>
<script>
export default{
    // eslint-disable-next-line vue/multi-word-component-names
    name:'mysolt',
    data(){
        return{
        }
    },
    methods:{
    }
}
</script>
<style scoped>
div{
    border-top: 4px solid rgb(13, 71, 96);
    background-color: rgb(255, 140, 0);
    border-radius: 20px;
    font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
    font-size: 24px;
}
</style>

这个项目自己理解一下会对你有帮助 后期会有项目实战

相关文章
|
14天前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
4天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
163 64
|
2月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
231 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
57 8
|
2月前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
19 1
.自定义认证前端页面
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
2月前
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。

热门文章

最新文章