首页 > 其他分享 >vue3微信公众号商城项目实战系列(7)自定义底部tabbar组件

vue3微信公众号商城项目实战系列(7)自定义底部tabbar组件

时间:2023-04-18 14:46:04浏览次数:46  
标签:vue tabbar 自定义 微信 name item tab 组件 页面

在开始之前,先看看官方对组件的定义:

 

vue3的生态非常丰富,有各种各样的开源组件库可以拿来就用,比如vant、element-ui等,本系列不使用任何第3方组件,

完全使用原生的语法来写,只为聚焦vue3技术本身,本篇写一个自定义tabbar组件,效果如下图所示:

要实现如下功能:

1. 底部tab项固定3个:首页、购物车、我的;

2. 购物车项加数字角标,显示购物车中商品的数量,当在首页添加商品时数量要同步更改。

3.点击tab项跳转相应页面。

4. 组件的使用尽可能简单,理论上页面引用的时候只要传递一个当前页面的名称就可以了,其他逻辑全部在组件内部完成。

明确了需求,下面从0开始构建一个tabbar组件。

第1步:新建文件和文件夹,如下图:

各文件说明如下:

1. TabBar.vue 是要实现的组件文件,放在 components 目录下,以和页面区分。

2. tabBarIcon 是存放组件使用的图标目录,名称中有数字1的表示选中的 tab 项对应的图标,为彩色,所有图标如下:

 

3. 为了处理简洁,我们用约定的方式来处理点击 tab 项时的页面跳转,如下:

Home.vue 是首页,Cart.vue是购物车页,Mine.vue 是我的页(页面是特殊的组件,也可称页面组件),放在 views 目录,

这3个文件都要引用 TabBar.vue 这个自定义组件,根据官方的建议(见下图),组件名称用 PascalCase 的标签名。

页面引用方式如下:

 

了解了基本用法,来看TabBar.vue 代码如下:

布局块代码:

<template>
    <div class="tab-bar">
        <template v-for="item in arrTab">
            <div :class="item.tabClass" @click="onClick(item.tabName)"> 
                <img class="tab-bar-item-img" :src="item.tabIcon" />
                <span>{{ item.tabText }}</span>
            </div> 
        </template> 
    </div>    
</template>

模板块使用 v-for 循环输出各 tab 项,数组 arrTab 是在脚本块定义的 ,动态取值的部分直接绑定对象值。

其中 HTML元素的属性绑定 " : ", 属性中的内容用 "{{ }}" 来绑定,方法用 "@" 绑定。

脚本块代码:

 1 <script setup> 
 2 import { reactive, onMounted } from 'vue';
 3 import {useRouter} from 'vue-router';
 4 const router = new useRouter();
 5 function onClick(routerName){
 6     router.push({name:routerName});
 7 }
 8 
 9 const arrTab = reactive([
10     {tabName:'home', tabClass:'tab-bar-item', tabText:'首页', tabIcon:'/src/components/tabBarIcon/home.png'},
11     {tabName:'cart', tabClass:'tab-bar-item', tabText:'购物车', tabIcon:'/src/components/tabBarIcon/cart.png'},
12     {tabName:'mine', tabClass:'tab-bar-item', tabText:'我的', tabIcon:'/src/components/tabBarIcon/mine.png'},
13 ]);
14 
15 const props = defineProps(['name']) 
16 onMounted(() => {
17     console.log(props.name);
18     arrTab.forEach((item,index)=>{
19         if(item.tabName===props.name){
20             item.tabClass="tab-bar-item1";
21             item.tabIcon=item.tabIcon.replace(".png","1.png");
22         }
23     });
24 })
25 </script>

这里使用组合式API书写脚本(有setup标记),各行作用如下:

第2行:导入vue中的函数,reactive 是获取响应式对象的,onMounted 是生命周期钩子函数,在页面加载完 DOM 对象后触发,

当点击 tab 项跳转页面时需要在这个钩子函数中将选中的项置为选中的状态,见第 16~24 行的代码。

 

第3-7行:导入路由对象,当用户点 tab 项时做页面跳转。

 

第9-13行:定义响应式数组对象,一个对象只要用 reactive( ) 函数处理一下就可以做双向数据绑定,这就是响应式编程的优势之一。

布局块中的 tab 项的内容就是用这个数据对象输出的。

 

第15行:给这个组件定义一个属性,这样引用的页面就可以在这个组件上给name属性赋值

,props对象就可以取到这个值,第19 行的 if 语句就是基于 这个属性值来决定哪个 tab 项用彩色图片和文字来显示的。

 

最后,看一个 Home.vue 、 Cart.vue、Mine.vue 中的代码:

Home.vue 代码:

<template>
    <div>
        <span>公众号商城首页</span> 
        <TabBar name="home" />
    </div>    
</template>


<script setup>
import TabBar from '@/components/TabBar.vue';
 
</script>

 Cart.vue 代码:

<template>
    <div>
        <span>购物车</span> 
        <TabBar name="cart" />
    </div>    
</template>


<script setup>
import TabBar from '@/components/TabBar.vue';
 
</script>

Mine.vue 代码:

<template>
    <div>
        <span>我的</span> 
        <TabBar name="mine" />
    </div>    
</template>


<script setup>
import TabBar from '@/components/TabBar.vue';
 
</script>

这3个文件中  <TabBar name="xxxx" /> 的 name 属性就是对应  const props = defineProps(['name']) 这里的 name 字符串

,defineProps 是一个仅 <script setup> 中可用的编译宏命令,并不需要显式地导入,其传入的参数是一个字符数组

, 如果有多个属性,加到这个数组当中就可以了,形如:const props = defineProps(['name', 'title', 'text']) 。

 

 

 

以上就是一个简单的自定义组件的用法,这里还有一个功能 " 购物车加数字角标 " 没有实现

,留着写加购物车功能的时候再完成更合适一些。

 

标签:vue,tabbar,自定义,微信,name,item,tab,组件,页面
From: https://www.cnblogs.com/pfm33/p/17322431.html

相关文章

  • 微信小程序实现简单登录界面和登录功能
    微信小程序实现简单登录界面和登录功能问题背景客户端开发和学习过程中,登录功能是一个很常见的场景。本文将介绍,微信小程序开发过程中是如何实现登录界面和登录功能的。问题分析话不多说,直接上代码。(1)index.js文件,代码如下:Page({/***页面的初始数据*/data:{......
  • 视频剪辑软件,制作画中画,自定义中画的位置、按比例缩放尺寸
    最近有很多朋友在问,如何剪辑视频,比如说给多个视频制作画中画特效,该如何实现呢?今天小编给大家分享一个新的剪辑技巧,下面一起来试试。所需工具安装一个媒体梦工厂视频素材若干操作步骤步骤1:运行【媒体梦工厂】,在“画中画”中,依次导入视频素材作为底画和中画步骤2:然后设定中画在底画的......
  • zabbix agent自定义监控项,监控交换机vlan流量
    脚本目的:需要对华为ac中的ssid流量进行监控,但acweb页面中与snmp取值差异很大。正好ac的用户流量配置了本地转发,用户vlan的网关在一台交换机上。交换机可以配置vlanstatistic以统计vlan内的流量。但vlan流量统计后,没有对应的snmpoid,考虑使用python脚本来进行取值。在zabbix......
  • js将后端返回的文件流导出,并自定义下载文件名(pdf导出)
    这里调接口时记得加上responseType:'blob'/***@description:下载文件*@param{string}data文件流*@param{string}filename文件名*@return{*}*/exportfunctiondownloadFile(data:string,filename:string){constblob=newBlob([data])const......
  • Three.js教程:自定义顶点UV坐标
    推荐:将NSDT场景编辑器加入你的3D工具链其他工具集:NSDT简石数字孪生自定义顶点UV坐标学习自定义顶点UV坐标之前,首先保证你对BufferGeometry的顶点数据、纹理贴图都有一定的理解。#顶点UV坐标的作用顶点UV坐标的作用是从纹理贴图上提取像素映射到网格模型Mesh的几何体表面上。浏览器......
  • 微信小程序开始实现骨架屏
    微信小程序开始实现骨架屏问题背景客户端开发和学习过程中,骨架屏是一种很常见的场景。应用打开时加载资源和复杂逻辑导致耗时较长,可能出现白屏等场景,此时增加骨架屏可以极大改善用户的体验。本文将介绍微信小程序中是如何实现骨架屏的。问题分析(1)微信开发者工具,可以很方便的给......
  • 使用whoops作为tp6的自定义异常
    安装composerrequirefilp/whoops在app/ExceptionHandle.php中的renderpublicfunctionrender($request,Throwable$e):Response{//添加自定义异常处理机制if(ENV('APP_DEBUG')){//如果是HttpResponseException异常则原样输出//JUMP插......
  • vue3微信公众号商城项目实战系列(6)用户登录
    1.一个商城要实现购物的功能,需要能识别用户的身份,这样才能完成加购物车,下单,付款等操作。但微信公众号商城和PC端商城有些不一样,区别在于微信公众号商城使用微信支付的时候需要一个openid的参数(以后再具体讲)这个参数必须访问微信公众号提供的接口才能获取到,基于这个原因,用户登录......
  • 自动化脚本:一键安装python自定义版本
     1:环境:centos7python2.72:脚本内容:#!/usr/bin/envpythonimportosimportsysimportrequestsimporttarfileimportshutilimportsubprocess#Installnecessarypackagestry:subprocess.check_call(["yum","install","-y&qu......
  • 自定义bpmn 属性面板
    点击查看代码<template><divclass="custom-properties-panelmy-card"><divv-if="selectedElements.length<=0"class="empty">请选择一个节点</div><divv-else-if="selectedElements.length>1&......