【Vue3从零开始-实战】S4:组件拆分和使用vue指令精简页面代码

简介: 【Vue3从零开始-实战】S4:组件拆分和使用vue指令精简页面代码

@@DVBVTGC2D7ROIYF4YK_@O.png


前言


实战已经开始了!在前面几篇文章中,我们把首页的布局和样式都完成了,但是将所有内容都写在App.vue里面了。这样就导致App.vue里面的代码很难维护,所以本章将会把App.vue里面的代码全部拆分出来,这样就比较符合Vue框架的风格,也会更加容易维护。


_Z)N@F0%2V()T][(@EUC0TQ.png


根据我们前面写的代码来看,整个首页可以分为三个模块:顶部静态资源、中间店铺列表、底部tabbar。


拆分组件


  1. 在views文件夹下面新建一个home文件夹,表示这里面存放首页的组件。


  1. 然后在home文件夹下面新建一个Home.vue


H4H6DR)@0PYD5UFS9@_X%95.png


  1. 将App.vue中的代码全部放到Home.vue中


  1. 将Home.vue当做组件引入到App.vue里面渲染出来


<template>
  <div>
    <Home />
  </div>
</template>
<script>
import Home from './views/home/Home'
export default {
  name: 'App',
  components: {
    Home
  }
}
</script>
<style>
</style>
复制代码


注意:由于Home.vue相对于App.vue有好几层文件夹包裹住的,所以之前引入的css文件,就需要重新确定上层文件了。


@import "../../style/viriables.scss";
@import "../../style/mixins.scss";
复制代码

顶部静态资源


  1. 在home文件夹中新建一个StaticPart.vue


BX3E0Y328W5~9EVFS~N]%N8.png


  1. 将Home.vue中关于顶部的DOM元素和样式都复制到StaticPart.vue中


  1. 然后在Home.vue中引入StaticPart.vue组件


<script>
import StaticPart from './StaticPart'
export default {
  name: 'Home',
  components: {
    StaticPart
  }
}
</script>
复制代码

店铺列表


  1. 在home文件中新建一个Nearby.vue


NK1B(PK_S]FZE2~ZYYL1RF3.png


  1. 将Home.vue中关于店铺列表的DOM元素和样式都复制到Nearby.vue中


  1. 然后在Home.vue中引入Nearby.vue组件


<script>
import StaticPart from './StaticPart'
import Nearby from './Nearby'
export default {
  name: 'Home',
  components: {
    StaticPart,
    Nearby
  }
}
</script>
复制代码

tabbar


tabbar的拆分和上面的组件差不多,所以不在赘述了。


7W)}XEBC@$X~K%SQ)5M_B[R.png


拆分完成


<template>
  <div>
    <div class="wrapper">
      <StaticPart />
      <Nearby />
    </div>
    <Tabbar />
  </div>
</template>
<script>
import StaticPart from './StaticPart'
import Nearby from './Nearby'
import Tabbar from './Tabbar'
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: 'Home',
  components: {
    StaticPart,
    Nearby,
    Tabbar
  }
}
</script>
<style lang="scss">
.wrapper {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0.5rem;
  right: 0;
  padding: 0 0.18rem;
  overflow-y: auto;
}
</style>
复制代码


  • 这一块就是拆分完成之后,Home.vue的代码内容了。


  • 这样看起来相比于之前一个页面包含所有代码的时候要精简许多了。


  • 看到首字母大写的标签即表示组件,也方便寻找对应的组件。


  • 拆分出来之后,每个组件大约100行代码左右,维护起来也会更加容易。


使用vue指令精简代码


⭐️ 通过上面的拆分组件之后,其实页面上很多DOM元素其实是重复的,可能只是里面渲染的内容不一样而已,但是标签和样式都是一致的。


🔥 在以前的基础知识章节中,我们学过一些vue指令:v-for、v-if、v-bind、v-html等。下面精简代码的时候就会使用到这些指令。


🎁 在实际项目中,我们获取的数据是从接口端拿到的,相比于我们自定义数据对象会更加精简了。


💥 由于精简代码的过程都差不多,所以下面只是举一个例子,其他的大家可以自行尝试一下。(对应的精简代码会在最后贴出来的)


tabbar


[HNXZVS12506682%ZQQW]`Q.png


精简之前我们需要对元素进行拆解,在稿图中会发现tabbar中主要元素就是icon和title,所以我们就可以在setup函数中定义一个数组,将tabbar上的icon和title都封装成一个对象。


setup () {
    const tabbarList = [
      { icon: '&#xe64f;', title: '首页' },
      { icon: '&#xe61a;', title: '购物车' },
      { icon: '&#xe737;', title: '订单' },
      { icon: '&#xe8a0;', title: '我的' }
    ]
    return {
      tabbarList
    }
}
复制代码


有了数据之后,我们就可以对DOM元素中相同的标签进行循环了。


<div class="tabbar">
  <div class="tabbar__item" v-for="item in tabbarList" :key="item.icon">
    <div class="iconfont">{{item.icon}}</div>
    <div class="tabbar__title">{{item.title}}</div>
  </div>
</div>
复制代码
  • 循环的时候别忘了加上key,key是循环对象中唯一值就行。


5P1T0DG~[F$JB{$I}7ITM3Y.png


❓精简tabbar代码并渲染到浏览器之后会发现,title并没有什么不对,但是icon好像变成了一个字符串,并不是我们想要的icon图标。


⭕️ 这是因为vue的插值表达式会对渲染的数据进行转义,导致出来的效果都是一个字符串。想要解决这个问题,就要用到以前学过的一个指令:v-html


<div class="tabbar">
  <div class="tabbar__item" v-for="item in tabbarList" :key="item.icon">
    <div class="iconfont" v-html="item.icon"></div>
    <div class="tabbar__title">{{item.title}}</div>
  </div>
</div>
复制代码


[L$DI_T1O[W[}QLUND01BL6.png


通过v-html在对数据进行转义之后,页面上就可以渲染出想要的效果了。


精简后的完整代码


⭐️ 下面会对每个拆分出来的组件进行精简,由于内容差不多,所以只将代码贴出来。


Nearby.vue


<template>
  <div>
    <div class="nearby">
      <h3 class="nearby__title">附近店铺</h3>
      <div class="nearby__item" v-for="item in nearbyList" :key="item.id">
        <img :src="item.imgUrl" class="nearby__item__img">
        <div class="nearby__content">
          <div class="nearby__content__title">{{item.title}}</div>
          <div class="nearby__content__tags">
            <span class="nearby__content__tag" v-for="(innerItem, innerIndex) in item.tags" :key="innerIndex">{{innerItem}}</span>
          </div>
          <p class="nearby__content__highlight">{{item.desc}}</p>
        </div>
      </div>
    </div>
  </div>
</template>
复制代码


🔥 这里的DOM元素中使用了一个嵌套的v-for循环指令。


<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: 'Nearby',
  setup () {
    const nearbyList = [
      {
        id: 1,
        imgUrl: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a8a16cef-f2b9-4644-b216-3b95bcb12602/e9e2929d-f491-489d-8fa5-bd6223e67b06.png',
        title: '沃尔玛',
        tags: [
          '月售1万+',
          '月售1万+',
          '月售1万+'
        ],
        desc: 'VIP尊享满89元减4元运费券(每月3张)'
      },
      {
        id: 2,
        imgUrl: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a8a16cef-f2b9-4644-b216-3b95bcb12602/e9e2929d-f491-489d-8fa5-bd6223e67b06.png',
        title: '沃尔玛',
        tags: [
          '月售1万+',
          '月售1万+',
          '月售1万+'
        ],
        desc: 'VIP尊享满89元减4元运费券(每月3张)'
      }
    ]
    return { nearbyList }
  }
}
</script>
复制代码

StaticPart.vue


<div class="icons">
  <div class="icons__item" v-for="item in iconsList" :key="item.desc">
    <img class="icons__item__img" :src="item.imgUrl" />
    <p class="icons__item__desc">{{item.desc}}</p>
  </div>
</div>
复制代码
setup () {
    const iconsList = [
      {
        imgUrl: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a8a16cef-f2b9-4644-b216-3b95bcb12602/32b200e6-9af9-474d-865b-e11ae4709a68.png',
        desc: '超市便利'
      }
    ]
    return {
      iconsList
    }
  }
复制代码


这里只是精简了顶部静态数据中的N宫格代码,由于静态数据页面里面只有中间的宫格部分需要循环,而且都是一样的数据,所以这里是展示部分代码,具体的可以自己复制实现。


总结


本篇文章主要是将前面几篇布局章节中的代码进行了拆分和精简,让代码更加符合vue的规范,也让后续更加容易维护。

首页的内容至此就完成了,后面会在写其他页面文章时,使用路由、axios还有一些公共组件进行开发。

相关文章
|
28天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
128 64
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
32 8
|
28天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
1月前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
2月前
|
JavaScript
Vue 指令速查表
【10月更文挑战第12天】Vue 指令速查表
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
505 4
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
180 1
|
1月前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
2月前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
30 1