700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 微信小程序 五 npm 包 安装 vant组件 promise组件 全局数据共享 分包!!! 自定义 tabBar 案例

微信小程序 五 npm 包 安装 vant组件 promise组件 全局数据共享 分包!!! 自定义 tabBar 案例

时间:2022-11-07 05:05:08

相关推荐

微信小程序 五 npm 包  安装 vant组件 promise组件 全局数据共享  分包!!! 自定义 tabBar 案例

总结

能够知道如何安装和配置 vant-weapp 组件库

参考 Vant 的官方文档能够知道如何使用MobX实现全局数据共享

安装包、创建 Store、参考官方文档进行使用能够知道如何对小程序的 API 进行 Promise 化

安装包、在 app.js 中进行配置能够知道如何实现自定义 tabBar的效果

Vant 组件库 + 自定义组件 + 全局数据共享

1.0 使用 npm 包

1.1 小程序对 npm 的支持与限制

目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用

npm 包有如下 3 个限制:

不支持依赖于Node.js 内置库的包不支持依赖于浏览器内置对象的包不支持依赖于C++ 插件的包

总结:虽然 npm 上的包有千千万,但是能供小程序使用的包却“为数不多”。

1.2 Vant Weapp

Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库,助力开发者快速搭建小程序应用。它所使用的是MIT 开源许可协议,对商业使用比较友好。

官方文档地址 https://youzan.github.io/vant-weapp

1.3 安装 Vant 组件库

!注意 一开始要在小程序中 先 npm init -y (安装 包管理配置文件package.json

在小程序项目中,安装 Vant 组件库主要分为如下 3 步:(去网站教程看)

通过 npm 安装(建议指定版本为@1.3.3)构建 npm 包修改 app.json

详细的操作步骤,大家可以参考 Vant 官方提供的快速上手教程:

https://youzan.github.io/vant-weapp/#/quickstart#an-zhuang

1.4 使用 Vant 组件

安装完 Vant 组件库之后,可以在 app.json 的usingComponents节点中引入需要的组件,即可在 wxml 中直接使用组件。示例代码如下:

// app.json"usingComponents": {"van-button": "@vant/weapp/button/index"}// 页面 .wxml 结构<van-button type="primary"></van-buttin>

1.5 定制全局主题样式

Vant Weapp 使用 CSS 变量来实现定制主题。 关于 CSS 变量的基本用法,请参考 MDN 文档:

/zh-CN/docs/Web/CSS/Using_CSS_custom_properties

这个是原生的方法,定义的变量名字 前面要加 - -, 调用的时候,前面要加 var(变量名),这个调用是有局限性的,html中定义,表示全局调用,某个 .class名字里面调用, 就是 那个 .class 里面的组件才能用。

普通 js 文件html {// 定义 css变量--main-color: #c00000l}.box1, .box2 {background-color: var(--main-color);}

app.wxss中,写入 CSS 变量,即可对全局生效:

app.wxsspage {// 订制警告按钮的背景颜色和边框颜色--button-danger-background-color: #cooooo;--button-danger-border-color: #D60000;}

所有可用的颜色变量,请参考 Vant 官方提供的配置文件:

/youzan/vant-weapp/blob/dev/packages/common/style/var.less

2.0 使用 npm 包 - API Promise化

2.1 基于回调函数的异步 API 的缺点

默认情况下,小程序官方提供的异步 API 都是基于回调函数实现的,例如,网络请求的 API 需要按照如下的方式调用:

wx.request({method: '',url: '',data: {},success: () => {}, // 请求成功的回调函数fail: () => {}, // 请求失败的回调函数complete: () => {} // 请求完成的回调函数})

缺点:容易造成回调地狱的问题,代码的可读性、维护性差!

2.2 API Promise 化

API Promise化,指的是通过额外的配置,将官方提供的、基于回调函数的异步 API,升级改造为基于Promise 的异步 API,从而提高代码的可读性、维护性,避免回调地狱的问题。

2.3 实现 API Promise 化

在小程序中,实现 API Promise 化主要依赖于 miniprogram-api-promise 这个第三方的 npm 包。它的安装和使用步骤如下:( )

npm install --save miniprogram-api-promise@1.0.4安装好以后, 要删除 miniprogram_npm 文件, 然后 在工具中 再次 构建 npm 刷新一下

// 在小程序入口文件中(app.js),只需调用一次 PromisifyAll() 方法,// 即可实现异步 API 的 Promise 化import {promisifyAll } from 'miniprogram-api-promise'const wxp = wx.p = {}// promisify all wx's apipromisifyAll(wx, wxp)

2.4 调用 Promise 化之后的异步 API

<van-button type="danger" bindtap="getInfo">vant按钮</van-button>// 在页面的 .js 文件中, 定义对应的 tap 事件处理函数async getInfo() {const {data: res } = await wx.p.request({method: 'GET',url: '/api/get',data: {name: 'zs', age: 20}})console.log(res);},

3.0 全局数据共享

全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题

开发中常用的全局数据共享方案有:Vuex、Redux、MobX 等。

3.1 小程序中的全局数据共享方案

在小程序中,可使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。其中:

mobx-miniprogram 用来创建 Store 实例对象mobx-miniprogram-bindings 用来把 Store 中的共享数据或方法,绑定到组件或页面中使用

3.2 安装 MobX 相关的包

在项目中运行如下的命令,安装 MobX 相关的包:

npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1

注意:MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm。

3.3 创建 MobX 的 Store 实例

在页面中 跟 pages 文件夹平级,新建store文件夹, 新建 store.js 文件,在其中创建实例

import {observable, action } from 'mobx-miniprogram'export const store = observable({// 数据字段numA: 1,numB: 2,// 计算属性get sum() {return this.numA + this.numB},// actions 方法,用来修改 store 中的数据updateNum1: action(function(step) {this.numA += step}),updateNum2: action(function(step) {this.numB +=step})})

3.4 将 Store 中的成员绑定到页面中

// pages/home/home.js 页面 .js 文件中import {createStoreBindings } from 'mobx-miniprogram-bindings'import {store } from '../../store/store'Page({/*** 生命周期函数--监听页面加载*/onLoad: function (options) {this.storeBindings = createStoreBindings(this, {store,fields: ['numA', 'mumB' , 'sum'],actions: ['updateNum1']})},/*** 生命周期函数--监听页面卸载*/onUnload: function () {this.storeBindings.destroyStoreBindings()},})

3.5 在页面上使用 Store 中的成员

// 页面的 .wxml 结构<view>{{numA}} + {{numB}} = {{sum}}</view><van-button type="primary" bindtap="btnHandler1" data-step="{{1}}">numA + 1</van-button><van-button type="danger" bindtap="btnHandler1" data-step="{{-1}}">numA - 1</van-button>// 按钮 tap 事件的处理函数btnHandler1(e) {this.updateNum1(e.target.dataset.step)}

3.6 将 Store 中的成员绑定到组件中

import {storeBindingsBehavior} from 'mobx-miniprogram-bindings'import {store } from '../../store/store'Component({behaviors: [storeBindingsBehavior], // 通过 storeBindingsBehavior 来实现自动绑定storeBindings: {store, // 指定要绑定的 Storefields: {// 指定要绑定的字段数据numA: () => store.numA, // 绑定字段的 第一种方式numB: (store) => store.numB, // 绑定字段的 第二种方式sum: 'sum' // 绑定字段的 第三种方式},actions: {// 指定要绑定的方法updateNum2: 'updateNum2'}}})

3.7 在组件中使用 Store 中的成员

// 页面的 .wxml 结构<view>{{numA}} + {{numB}} = {{sum}}</view><van-button type="primary" bindtap="btnHandler2" data-step="{{1}}">numA + 1</van-button><van-button type="danger" bindtap="btnHandler2" data-step="{{-1}}">numA - 1</van-button>// 按钮 tap 事件的处理函数methods: {btnHandler2(e) {this.updateNum2(e.target.dataset.step)}}

4.0 分包

分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载

4.1 分包的好处

对小程序进行分包的好处主要有以下两点:

可以优化小程序首次启动的下载时间在多团队共同开发时可以更好的解耦协作

4.12 分包前项目的构成

分包前,小程序项目中所有的页面和资源都被打包到了一起,导致整个项目体积过大,影响小程序首次启动的下载时间

4.13 分包后项目的构成

分包后,小程序项目由 1 个主包 + 多个分包组成:

主包:一般只包含项目的启动页面或 TabBar 页面、以及所有分包都需要用到的一些公共资源分包:只包含和当前分包有关的页面和私有资源

4.14 分包的加载规则

在小程序启动时,默认会下载主包并启动主包内页面

tabBar 页面需要放到主包中当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示

非 tabBar 页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

4.15 分包的体积限制

目前,小程序分包的大小有以下两个限制:

整个小程序所有分包大小不超过16M(主包 + 所有分包)单个分包/主包大小不能超过2M

4.2 分包 - 使用分包

小程序目录结构

app.jsapp.jsonapp.wxsspages// 主包的所有页面indexlogspackageA // 第一个分包pages // 第一个分包的所有页面catdogpackageB // 第二个分包pages // 第二个分包的所有页面applebananautils

app.jsonsubpackages节点中 声明分包的结构

{"pages": [ // 主包的所有页面"pages/home/home","pages/message/message","pages/contact/contact"],"subpackages": [ // 通过 subpackages 节点, 声明分包结构{"root": "packageA/pages", // 第一个分包的 根路径"pages": [ // 当前分包下,所有页面的相对存放路径"pages/cat/cat","pages/dog/dog"]},{"root": "packageB/pages", // 第二个分包的根路径"name": "pack2",// 分包的别名"pages": [ // 当前分包下, 所有页面的相对存放路径"pages/apple/apple","pages/banana/banana"]}],}

4.21 打包原则

小程序会按subpackages的配置进行分包,subpackages 之外的目录将被打包到主包中主包也可以有自己的 pages(即最外层的 pages 字段)tabBar 页面必须在主包内分包之间不能互相嵌套

4.22 引用原则

主包无法引用分包内的私有资源分包之间不能相互引用私有资源分包可以引用主包内的公共资源

4.3 分包 - 独立分包

独立分包本质上也是分包,只不过它比较特殊,可以独立于主包和其他分包而单独运行

4.31 独立分包和普通分包的区别

最主要的区别:是否依赖于主包才能运行

普通分包必须依赖于主包才能运行独立分包可以在不下载主包的情况下,独立运行

4.32 独立分包的应用场景

开发者可以按需,将某些具有一定功能独立性的页面配置到独立分包中。原因如下:

当小程序从普通的分包页面启动时,需要首先下载主包而独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度

注意:一个小程序中可以有多个独立分包。

4.33 独立分包的配置方法

首先 目录结构是一样的只需要在普通分包中, 添加 一个 “independent”: true

通过此节点, 声明当前 分包 为 独立分包

{"pages": [ // 主包的所有页面"pages/home/home","pages/message/message","pages/contact/contact"],"subPackages": [ // 通过 subpackages 节点, 声明分包结构{"root": "packageA/pages", // 第一个分包的 根路径"pages": [ // 当前分包下,所有页面的相对存放路径"pages/cat/cat","pages/dog/dog"]},{"root": "packageB/pages", // 第二个分包的根路径"name": "pack2",// 分包的别名"pages": [ // 当前分包下, 所有页面的相对存放路径"pages/apple/apple","pages/banana/banana"],"independent": true // 通过此节点,声明当前 分包 为 独立分包}],}

4.34 引用原则

独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源

例如:

主包无法引用独立分包内的私有资源独立分包之间,不能相互引用私有资源独立分包和普通分包之间,不能相互引用私有资源特别注意:独立分包中不能引用主包内的公共资源

4.4 分包 - 分包预下载

分包预下载指的是:在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度。

4.41 配置分包的预下载

预下载分包的行为,会在进入指定的页面时触发。在app.json中,使用preloadRule节点定义分包的预下载规则,

示例代码如下:

// app.json"preloadRule": {// 分包预下载的规则"pages/contact/contact": {// 触发分包预下载的页面路径// network 表示 在指定的网络模式下 进行预下载// 可选值为:all(不限制网络)和 wifi (仅在 wifi 模式下下载)// 默认值 为 wifi"network": "all",// packages 表示进入页面后, 预下载哪些分包// 可以通过 root 或 name 指定预下载哪些分包"packages": ["pkgA"]}}

4.42 分包预下载的限制

同一个分包中的页面享有共同的预下载大小限额 2M

不允许,分包 A+B+C 体积大于 2M允许,分包 A+B+C 体积小于 2M

5.0 案例 - 自定义 tabBar

案例效果

在此案例中,用到的主要知识点如下:

⚫ 自定义组件

⚫ Vant 组件库

⚫ MobX 数据共享

⚫ 组件样式隔离

⚫ 组件数据监听器

⚫ 组件的 behaviors

⚫ Vant 样式覆盖

实现步骤

自定义 tabBar 分为 3 大步骤,分别是:

① 配置信息

② 添加 tabBar 代码文件

③ 编写 tabBar 代码

详细步骤,可以参考小程序官方给出的文档:

https://developers./miniprogram/dev/framework/ability/custom-tabbar.html

5.1 详情

在 app.json 中 声明自定义 tabBar的配置信息

https://developers./miniprogram/dev/framework/ability/custom-tabbar.html

查看文档

app.json 文件中"tabBar": {"custom": true, 设置为 true ,原本的 list 文件不能删除}添加 custom-tab-bar 文件夹 已经里面的 文件(选择 新建Component )

添加 tabBar 的代码文件 基于Vant 组件库添加

引入 在app.json或index.json中引入组件,详细介绍见快速上手。"usingComponents": {"van-tab": "@vant/weapp/tab/index","van-tabs": "@vant/weapp/tabs/index"}

自定义tabBar的图标和文本( wx:for wx:key 渲染)

<!--custom-tab/index.wxml--><van-tabbar active="{{active}}" bind:change="onChange" active-color="#13A7A0"><van-tabbar-item wx:for="{{list}}" wx:key="index" info="{{item.info ? item.info : ''}}"><imageslot="icon"src="{{ item.iconPath }}"mode="aspectFit"style="width: 25px; height: 25px;"/><imageslot="icon-active"src="{{ item.selectedIconPath }}"mode="aspectFit"style="width: 25px; height: 25px;"/>{{item.text}}</van-tabbar-item></van-tabbar>

渲染并美化 数字微标样式 (修改 --tabbar-item-margin-bottom 类型 , )

Component({options: {// 在这里设置,表示只有这个页面才修改styleIsolation: 'shared'},})

按需渲染数字微标把Store中的 sum的值渲染为数字微标实现 tabBar 页面切换使用全局数据共享解决 tabBar选中项不准备的问题

// custom-tab/index.js import {storeBindingsBehavior} from 'mobx-miniprogram-bindings'import {store } from '../store/store'Component({behaviors: [storeBindingsBehavior], storeBindings: {store, // 指定要绑定的 Storefields: {// 指定要绑定的字段数据sum: 'sum' , active: 'active' },actions: {updateActive: 'updateActiveTabBarIndex'}},observers: {'sum': function(e) {this.setData({'list[1].info': e})}},options: {styleIsolation: 'shared'},/*** 组件的属性列表*/properties: {},/*** 组件的初始数据*/data: {list: [{pagePath: "/pages/home/home",text: "首页",iconPath: "/images/tabs/home.png",selectedIconPath: "/images/tabs/home-active.png"},{pagePath: "/pages/message/message",text: "消息",iconPath: "/images/tabs/message.png",selectedIconPath: "/images/tabs/message-active.png",info: ''},{pagePath: "/pages/contact/contact",text: "联系我们",iconPath: "/images/tabs/contact.png",selectedIconPath: "/images/tabs/contact-active.png"}]},/*** 组件的方法列表*/methods: {onChange(event) {// event.detail 的值为当前选中项的索引// this.setData({ active: event.detail });this.updateActive(event.detail) // 这里把 active 的数据 转移到了 store 上面wx.switchTab({// 这里是切换页面 pagePath 前面记得加上 /url: this.data.list[event.detail].pagePath,})},}})

// store 页面import {observable, action } from 'mobx-miniprogram'export const store = observable({// 数据字段numA: 1,numB: 2,active: 0,// 计算属性get sum() {return this.numA + this.numB},// actions 方法,用来修改 store 中的数据updateNum1: action(function(step) {this.numA += step}),updateNum2: action(function(step) {this.numB +=step}),updateActiveTabBarIndex: action(function(index) {this.active = index})})

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。