总结

  1. 能够知道如何安装和配置 vant-weapp 组件库
    参考 Vant 的官方文档
  2. 能够知道如何使用 MobX 实现全局数据共享
    安装包、创建 Store、参考官方文档进行使用
  3. 能够知道如何对小程序的 API 进行 Promise 化
    安装包、在 app.js 中进行配置
  4. 能够知道如何实现自定义 tabBar 的效果
    Vant 组件库 + 自定义组件 + 全局数据共享

1.0 使用 npm 包

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

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

  1. 不支持依赖于 Node.js 内置库 的包
  2. 不支持依赖于 浏览器内置对象 的包
  3. 不支持依赖于 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 步:(去网站教程看)

  1. 通过 npm 安装(建议指定版本为@1.3.3)
  2. 构建 npm 包
  3. 修改 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 定制全局主题样式

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

https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties

  1. 这个是原生的方法,定义的变量名字 前面要加 - -, 调用的时候,前面要加 var(变量名),这个调用是有局限性的,html中定义,表示全局调用,某个 .class名字里面调用, 就是 那个 .class 里面的组件才能用。
普通 js 文件
html {
// 定义 css变量--main-color: #c00000l
}
.box1, .box2 {background-color: var(--main-color);
}
  1. app.wxss 中,写入 CSS 变量,即可对全局生效:
app.wxsspage {// 订制警告按钮的背景颜色和边框颜色--button-danger-background-color: #cooooo;--button-danger-border-color: #D60000;
}

所有可用的颜色变量,请参考 Vant 官方提供的配置文件:
https://github.com/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 api
promisifyAll(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: 'https://www.escook.cn/api/get',data: {name: 'zs', age: 20}})console.log(res);},

3.0 全局数据共享

全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题
开发中常用的全局数据共享方案有:Vuex、Redux、MobX 等。

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

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

  1. mobx-miniprogram 用来创建 Store 实例对象
  2. 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 分包的好处

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

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

4.12 分包前项目的构成

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

4.13 分包后项目的构成

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

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

4.14 分包的加载规则

  1. 在小程序启动时,默认会下载主包并启动主包内页面
    tabBar 页面需要放到主包中
  2. 当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示
    非 tabBar 页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

4.15 分包的体积限制

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

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

4.2 分包 - 使用分包

  1. 小程序目录结构
app.js
app.json
app.wxss
pages     // 主包的所有页面indexlogs
packageA  // 第一个分包pages   // 第一个分包的所有页面catdog
packageB  // 第二个分包pages   // 第二个分包的所有页面applebanana
utils
  1. 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 打包原则

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

4.22 引用原则

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

4.3 分包 - 独立分包

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

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

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

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

4.32 独立分包的应用场景

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

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

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

4.33 独立分包的配置方法

  1. 首先 目录结构是一样的
  2. 只需要在普通分包中, 添加 一个 “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 引用原则

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

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

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

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

5.0 案例 - 自定义 tabBar

  1. 案例效果
    在此案例中,用到的主要知识点如下:
    ⚫ 自定义组件
    ⚫ Vant 组件库
    ⚫ MobX 数据共享
    ⚫ 组件样式隔离
    ⚫ 组件数据监听器
    ⚫ 组件的 behaviors
    ⚫ Vant 样式覆盖

  2. 实现步骤
    自定义 tabBar 分为 3 大步骤,分别是:
    ① 配置信息
    ② 添加 tabBar 代码文件
    ③ 编写 tabBar 代码
    详细步骤,可以参考小程序官方给出的文档:
    https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html

5.1 详情

  1. 在 app.json 中 声明自定义 tabBar的配置信息
    https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html
    查看文档
 app.json 文件中"tabBar": {"custom": true,    设置为 true ,原本的 list 文件不能删除}添加 custom-tab-bar 文件夹 已经里面的 文件(选择 新建Component )    
  1. 添加 tabBar 的代码文件 基于Vant 组件库添加
引入  在app.json或index.json中引入组件,详细介绍见快速上手。
"usingComponents": {"van-tab": "@vant/weapp/tab/index","van-tabs": "@vant/weapp/tabs/index"
}
  1. 自定义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>
  1. 渲染并美化 数字微标样式 (修改 --tabbar-item-margin-bottom 类型 , )
Component({options: {      // 在这里设置,表示只有这个页面才修改styleIsolation: 'shared'},
})
  1. 按需渲染数字微标
  2. 把Store中的 sum的值渲染为数字微标
  3. 实现 tabBar 页面切换
  4. 使用全局数据共享解决 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})
})

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

  1. 原生微信小程序引入npm和安装Vant Weapp

    目录 一.引入npm+安装Vant Weapp 1.引入npm 2.安装Vant Weapp 3.修改 app.json 4.修改 project.config.json 二.构建npm 一.引入np ...

  2. 微信小程序——使用npm包、分包

    使用npm包 支持与限制 不支持依赖于 Node.js 内置库的包 不支持依赖于浏览器内置对象的包 不支持依赖于 C++ 插件的包 vant weapp 安装 初始化文件 npm init -y np ...

  3. 微信小程序使用 npm 包,举例图文详解

    使用 npm 包前提条件: 下载安装,配置npm环境变量,不懂得可以上网查教程,本文不再描述 小程序使用 npm 包简述 1.初始化 package.json 2.勾选允许使用 npm(新版微信小程序 ...

  4. 小程序在输入npm命令_微信小程序使用npm包步骤

    这里以npm引入小程序官方UI组件库weui-miniprogram为例 1.在小程序根目录内,初始化npm(官方文档上是没写出这一步,这里做个补充) npm init 2.在小程序中执行命令安装 n ...

  5. 微信小程序使用npm包的方法步骤

    提示:用于自己学习 文章目录 前言 一.npm初始化 二.安装npm包 三.npm包构建 四.报错未找到package.json 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智 ...

  6. [绍棠] 微信小程序使用npm包的易错点

  7. 设置微信小程序支持npm(解决微信小程序npm构建时提示“没有找到可以构建的NPM包,请确认需要参与构建的npm都在miniprogramroot目录内,或配置project...”错误)的方法

    提示:通过微信开发者工具创建小程序工程后,默认是不开启npm的,需要修改小程序npm配置参数,否则将会提示"没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 minipro ...

  8. 微信小程序 - 使用npm(第三方包)

    使用示例: 1. 开启"使用npm模块" 2. 新建 node_modules 文件夹 3. cd到新建 node_modules 所在的目录(非node_modules文件夹内) ...

  9. 微信小程序的npm使用心得

    研究小程序的npm没多久,也就是稍微花了点时间研究了下,并记录一下我的理解和心得,有疏漏的地方,望各位指教. 首先,这里介绍的只囊括了如何使用npm,以及小程序npm基本的模块加载原理(没有太深入), ...

最新文章

  1. 一键移植工具_【产品推广】让UI设计畅通无阻 — 信息系统人机界面增强工具(HFE Designer)...
  2. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...
  3. IT市场10大技术伟人 Linux之父居首(转)
  4. 蓝光模式引爆欧洲杯 神马搜索陪你度过激情夏日
  5. iOS中的SEl和IMP到底是什么
  6. 数据集_自动驾驶数据集
  7. 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化...
  8. 学习Python+numpy数组运算和矩阵运算看这254页PPT就够了
  9. 连续特征离散化--汇总
  10. Hyper-V 之04 SCVMM 2012 R2安装
  11. word2vec模型
  12. Mac新手必备技巧之如何批量修改图片大小
  13. Python查询四六级成绩
  14. 基于Arduino UNO的光驱写字机制作
  15. html excel导出的路径,html 导出多个excel表格数据-如何将html页面中的表格导出到excel表格...
  16. 【每日新闻】诺基亚展示未来工厂:5G自动化机器人与人类和谐共处
  17. Java-绘图软件(Windows画板)
  18. P2320 [HNOI2006] 鬼谷子的钱袋
  19. 360怎样修改wifi服务器,360路由器怎么改wi-fi密码(无线密码)?
  20. 网络攻击与防御技术期末习题

热门文章

  1. uniapp 图片模糊解决方案
  2. 计算机怎样保存文件格式,word文档怎样保存为pdf格式
  3. 安科瑞预付费系统在电力系统中的应用
  4. Hadoop性能调优
  5. 关于“城市超脑DIGITAL TWIN”的一些保姆级干货
  6. mfc连接oracle12c,MFC ADO连接Oracle12c数据库 类库文件
  7. html+css+js按键定位搜索框
  8. Pyhton3 下载Telegram 频道数据
  9. 笑话大全API 实战项目 开心一笑app
  10. PDF格式的“在线阅读”和“下载”