【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还有一些公共组件进行开发。

相关文章
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
JavaScript 算法 API
Vue 3有哪些新特性
【8月更文挑战第16天】Vue 3有哪些新特性
15 1
|
3天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
3天前
|
JavaScript
如何查看Vue使用的版本
这篇文章介绍了如何在项目中查看Vue及其相关库的版本信息,比如element-ui和element-china-area-data。要查看Vue的版本,需要查看项目中的`package.json`文件,在`dependencies`部分可以找到Vue的版本号。如果需要查询不同版本的兼容性,可以访问相应的官方文档或资源网站。
|
JavaScript 数据安全/隐私保护
work02_vue页面打印水印
work02_vue页面打印水印
317 0
work02_vue页面打印水印
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
3天前
|
JavaScript
Vue devDependencies 与 dependencies 能别
Vue devDependencies 与 dependencies 能别
10 3