微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包

news2024/11/15 20:05:39

目录

  • 一、小程序对npm 的限制
  • 二、使用Vant Weapp组件库
    • 1、安装组件
    • 2、使用组件
    • 3、定制全局样式
  • 三、API Promise化
    • 1、下载miniprogram-api-promise
    • 2、引入
    • 3、使用
  • 四、全局数据共享
  • 五、分包
    • 1、分包概念
    • 2、使用分包
    • 3、独立分包
    • 4、分包预下载

一、小程序对npm 的限制

在小程序中使用npm包有3个限制:① 不支持依赖于Node.js内置库的包 ② 不支持依赖于浏览器内置对象的包 ③ 不支持依赖于C++插件的包

二、使用Vant Weapp组件库

Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库,使用的是MIT 开源许可协议

1、安装组件

① 通过npm安装
② 构建npm包
③ 修改app.json
详细步骤:安装Vant组件库

2、使用组件

在app.json 的usingComponents节点中引入需要的组件,即可在wxml 中直接使用组件

// 通过 npm 安装
// app.json
"usingComponents": {
  "van-button": "@vant/weapp/button/index"
}

3、定制全局样式

Vant Weapp 使用 CSS 变量来实现定制主题。在app.wxss中写入全局css变量

Page{
	--button-danger-background-color:#efefef;
}

css变量的基本使用可以参考MDN文档:css自定义属性
所有可用的颜色变量可参考 Vant 官方文件:Vant官方提供的配置文件

三、API Promise化

小程序提供的异步API是基于回调函数实现的,容易造成回调地狱问题,并且代码可读性和维护性较差。
API Promise化,指的是通过额外的配置,将官方提供的、基于回调函数的异步 API,升级改造为基于Promise 的异步 API。

1、下载miniprogram-api-promise

在小程序中,实现 API Promise 化主要依赖于 miniprogram-api-promise 这个第三方的 npm 包。

npm i --save miniprogram-api-promise@1.0.4

2、引入

在小程序的入口文件app.js中,调用一次proimisifyAll()方法,即可实现异步API的Promise化

import { promisifyAll } from "miniprogram-api-promise";

const wxp = wx.p = {};
// promisify all wx's appi
promisifyAll(wx,wxp)

3、使用

使用wx.p.request()方法

asyn addbtn() {
	await wx.p.request({
		method:'GET',
		url:"https://www.abc.com",
		data:{name:'憨瓜'}
	})
}

四、全局数据共享

开发中常用的全局数据共享方案有:Vuex、Redux、MobX 等。
在小程序中,可以使用mobx-miniprogrammobx-miniprogram-bindings实现全局数据共享
mobx-miniprogram是用来创建Store实例对象
mobx-miniprogram-bindings是用来把Store中的共享数据或方法,绑定到组件或页面中使用

《1》安装Mobx

npm i mobx-miniprogram  mobx-miniprogram-bindings --save

注意:Mobx相关的包安装完毕之后,必须删除miniprogram_npm目录后,重新构建npm

《2》创建Mobx的Store实例

// 引入
import { observable, action } from "mobx-miniprogram";

// 创建Store实例
export const store = observable({
	// 数据字段
    numA:1,
    numB:2,
    // 计算属性
    get sum () {
        return this.numA + this.numB
    },
    // actions方法,用来修改 store 中的数据
    updateNum:action(function(step){
        this.numA += step
    })
})

《3》将Store中的成员绑定到页面中

// 页面.js文件
import { creatStoreBindings } from "mobx-miniprogram-bindings";
import {store} from "../../store/store";
Page({
    // 监听页面加载
    omLoad:function(){
        this.storeBindings = creatStoreBindings(this.{
            store,
            fields:["numA","numB","sum"],
            actions:["updateNum"]
        })
    },
    // 监听页面卸载
    onUnLoad:function(){
        this.storeBindings.destroyStoreBindings()
    }
})

《4》在页面中使用Store中的成员

// 页面的.wxml结构
<view>{{numA}} + {{numB}} = {{sum}}</view>
<button bindtap="btnHandle" data-step="{{1}}">numA + 1</button>

// 按钮tap 事件的处理函数
btnHandle(e) {
    this.updatedNum(e.target.dataset.step),
}

《5》 将 Store 中的成员绑定到组件中

import { storeBindingBehavior } from "mobx-miniprogram-bindings";
import {store} from "../../store/store";
Component({
    // 通过 storeBindingBehavior 来实现自动绑定
    behaviors:[storeBindingBehavior],
    storeBindings:{
        store,
        fields:{
            numA:()=>store.numA, // 绑定字段的方法一
            numB:(store)=>store.numB, // 绑定字段的方法二
            sum:"sum" // 绑定字段的方法三
        } 
    },
  // 指定要绑定的方法
   actions:{
    updatedNum:'updateNum'
   }
})

《6》在组件中使用Store中的成员

// 组件的.wxml结构
<view>{{numA}} + {{numB}} = {{sum}}</view>
<button bindtap="btnHandle" data-step="{{1}}">numA + 1</button>

// 按钮tap 事件的处理函数
methods:{
	btnHandle(e) {
    	this.updatedNum(e.target.dataset.step),
	}
}

五、分包

1、分包概念

分包是指将一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载
在这里插入图片描述

分包前,整个项目体积过大,影响首次启动的下载时间
分包后,项目由1个主包+多个分包组成
主包:包含项目的启动页或TabBar页面、以及所有分包都需要用到的一些公共资源
分包:只包含当前分包有关的页面和私有资源

《1》分包加载机制
小程序启动时,默认会下载主包并启动主包内页面,tabBar页面需要放到主包内
当用户进入分包内某个页面时,客户端会吧对应的分包下载下来,非tabBar页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

《2》分包的体积限制
整个小程序所有分包大小不超过 16M(主包 + 所有分包)
单个分包/主包大小不能超过 2M

2、使用分包

《1》配置方法
app.jsonsubpackages 节点中声明分包的结构

{
    "pages": [
        "pages/index/index"
    ],
    "subpackages": [ // 通过 subpackages 节点,声明分包的结构
    	{ 
	        "root": "/package1",  // 分包的根路径
	        "pages": ["pages/cat/cat","pages/dog/dog"],// 当前分包下所有的页面相对存放路径
	        "name": "pg1" // 分包的别名  
	   	 },{
	        "root": "/package2",
	        "pages": ["pages/man/man","pages/woman/woman"]
	    }
	 ]
}

在这里插入图片描述《2》打包原则
① 小程序会按 subpackages 的配置进行分包,subpackages 之外的目录将被打包到主包中
② 主包也可以有自己的 pages(即最外层的 pages 字段)
③ tabBar 页面必须在主包内
④ 分包之间不能互相嵌套

《3》引用原则
① 主包无法引用分包内的私有资源
② 分包之间不能相互引用私有资源
③ 分包可以引用主包内的公共资源

3、独立分包

独立分包可以独立于主包和其他分包而单独运行
优点:不依赖于主包运行,可以提升分包页面的启动速度,一个小程序可以有多个独立分包
《1》配置方法
通过 independent 节点 声明独立分包

"subpackages": [{
    "root": "/package1",
    "pages": ["pages/cat/cat","pages/dog/dog"],
    "independent": true  // 通过independent节点声明当前 package1分包为独立分包
},

《2》引用原则
独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源(独立分包不能引用主包的公共资源)

4、分包预下载

在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度。
《1》定义预下载规则
在app.json中通过 preloadRule 节点定义分包的预下载规则,预下载分包的行为,会在进入指定的页面时触发

"preloadRule": { // 分包预下载规则
    "pages/home/home":{ // 触发分包预下载规则的页面路径
        "network": "all", // 在指定的网络模式下进行预下载,默认值为wifi,可选值all/wifi
        "packages": ["package1"] // 进入页面后,预下载哪些分包,可以通过root/name指定预下载哪些分包
    }
},

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数值方法笔记2:解决非线性方程

1. 不动点定理及其条件验证2. 收敛阶、收敛检测与收敛加速2.1 如何估计不动点迭代的收敛阶xk1g(xk){x}_{{k}1}{g}\left({x}_{{k}}\right)xk1​g(xk​)2.2 给定精度的情况下&#xff0c;如何预测不动点迭代需要迭代的次数2.3 如何加快收敛的速度2.4 停止不定点迭代的条件2.5 不动…

基于Transformer的NLP处理管线

HuggingFace transformers 是一个整合了跨语言、视觉、音频和多模式模态与最先进的预训练模型并且提供用户友好的 API 的AI开发库。 它由 170 多个预训练模型组成&#xff0c;支持 PyTorch、TensorFlow 和 JAX 等框架&#xff0c;能够在代码之间进行互操作。 这个库还易于部署&…

【Leedcode】数据结构中链表必备的面试题(第一期)

链表必备的面试题 &#xff08;附图解和源码&#xff09;&#xff08;第一期&#xff09; 文章目录链表必备的面试题 &#xff08;附图解和源码&#xff09;&#xff08;第一期&#xff09;一、第一题1.题目2.思路图解&#xff08;1&#xff09;pos是首链表&#xff08;2&#…

基于SpringBoot+Vue的鲜花商场管理系统

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

【Vue3源码】第三章 readonly详解 从零实现Vue3 readonly API

【Vue3源码】第三章 readonly详解 从零实现Vue3 readonly API 前言 上一章节我们实现了effect函数的stop和onstop功能&#xff0c;至此effect函数源码的编写就暂时告一段落了&#xff0c;这一章我们继续解读Vue3源码&#xff0c;开始实现Vue3 Reactivity &#xff1a;core 中…

Java基础361问14问——为什么非静态内部类会默认持有外部类的引用?

在内存泄露问题排查中最常遇到就是 【非静态内部类默认持有外部类的引用】 文章目录1 字节码分析javac Activity.javajavap -c Activity.class2 静态内部类会持有外部类引用吗?参考文档// 简化处理相关代码 public class Activity {private Handler inner new Handler();priv…

C++面向对象(中)

文章目录前言1.类的6个默认成员函数介绍2.构造函数3.析构函数1.概念2.析构函数特征4.拷贝构造1.概念2.拷贝构造函数特征3.注意事项5.赋值运算符重载1.概念6.补充知识const成员函数7.取地址运算符和const取地址运算符重载8.总结前言 本文主要介绍C中的六个天选之子&#xff0c;…

MicroBlaze系列教程(6):AXI_IIC的使用

文章目录 @[toc]AXI_IIC简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第6篇文章。 AXI_IIC简介 一般情况下,使用FPGA实现I2C协议主要有两种方式:一种是基于Verilog实现起始位、停止位、ACK产生和判断、数据的发送和接收…

程终止、进程睡眠、进程对信号处理过程中等的方法

上一章学习了调度的方式&#xff0c;分为主调度器和周期性调度器&#xff0c;明白了进程切换分为自愿(voluntary)和强制(involuntary)两种。 自愿切换&#xff1a; 是指任务由于等待某种资源&#xff0c;将state改为非running状态后&#xff0c;主动调用schedule让出CPU 任务…

html中元素居中的五种方法

在网页开发中&#xff0c;经常会有嵌套元素中将子元素居中的要求。下边将五种常用的居中方法进行总结。 1&#xff1a;原始图&#xff08;父子元素无border&#xff0c;无padding&#xff09;&#xff1a; 2&#xff1a;实现居中效果&#xff1a; 一&#xff1a;使用margin…

一篇文章带你学会Anisble中的如何处理失败任务

目录 一、循环 1、简单循环 2、循环散列或字典列表 3、练习 二、条件 三、触发器 四、处理失败任务 1、ignore_errors 2、force_handlers 3、changed_when 4、failed_when 5、block 练习 一、循环 作用&#xff1a;循环迭代任务 1、简单循环 loop: ##赋值列表 -…

[软件工程导论(第六版)]第4章 形式化说明技术(复习笔记)

文章目录4.1 概述4.2 有穷状态机4.3 Petri网4.4 Z语言按照形式化程度&#xff0c;可以把软件工程使用的方法划分成非形式化、半形式化、形式化三类非形式化方法&#xff1a;使用自然语言描述需求规格说明半形式化方法&#xff1a;使用数据流图或实体-联系图建立模型形式化方法&…

P2P视频聊天技术分析

整个P2P视频过程需要知道双方的媒体类型、流和候选者&#xff0c;所以这里就会用到一下技术&#xff1a; ​ 信令服务器socket.io ​ 状态机 ​ ICE服务器 ​ WebRTC框架 ​ 媒体协商 信令服务器Socket.io 信令服务器说白了作用就是发消息的中转站&#xff0c;A把msg发到…

网络流与图(二)

上一节我们讲到了退化圈方向搜索算法&#xff0c;它能得到全局最优解。然而算法运行过程中需要选择一个可行改进圈方向&#xff0c;对于一个大型网络流来说&#xff0c;这并非容易的。我们需要找到在每次循环中确认可行改进圈方向或者证明不存在的方法。我们现在就来探讨这个问…

Andriod入门级开发

这学期有个课设&#xff0c;我们组我负责一个手机APP的开发&#xff0c;虽然刚开始说要实现什么智能导航&#xff0c;类似高德地图那种&#xff0c;但最后阉割的只剩一个Socket通信了&#xff0c;因为之前没有接触过&#xff08;可能之后也不会再接触&#xff09;&#xff0c;记…

【数据管理】谈谈哈希原理和散列表

一、说明 提起哈希&#xff0c;有人要说&#xff1a;不就是一个稀疏表格么&#xff0c;谈的上什么原理&#xff1f;我说&#xff1a;非也&#xff0c;哈希是是那种看似无物&#xff0c;其实解决大问题的东西。如何提高数据管理效率&#xff1f;这是个问题&#xff0c;随着这个问…

测试2:编写测试用例的方法

2.编写测试用例的方法 7种 测试常用的方法&#xff1a;code review 代码静态分析、CI/CD CI–持续集成–开发成员经常集成它们的工作&#xff0c;尽快发现集成错误 CD–持续部署–将集成后的代码部署到更贴近真实运行的环境 2.1 测试用例的描述&#xff1a; 用例编号 用例…

Python纯Numpy手撕SGD

文章目录简介问题建模数据加载和预处理数据加载预处理分batch损失函数训练运行简介 本博客用多元线性回归展示如何从零实现一个随机梯度下降SGD, 不使用torch等AI框架 问题建模 给定一个数据集X∈RN(D1)\large X \in \R^{N \times (D1)}X∈RN(D1)和对应标签向量Y∈RN\large …

centos7防火墙工具firewall-cmd使用

centos7防火墙工具firewall-cmd使用防火墙概述centos7防火墙工具firewall-cmd使用介绍firewalld的基本使用服务管理工具相关指令配置firewalld-cmd防火墙概述 防火墙是可以帮助计算机在内部网络和外部网络之间构建一道相对隔绝的保护屏障&#xff0c;从而保护数据信息的一种技…

Vulnhub 渗透练习(七)—— FRISTILEAKS: 1.3

环境搭建 下载链接 virtualbox 打开靶机设置为 host-only&#xff0c;攻击机同样。 具体可点此处 信息收集 开了个 80 端口。 用的是 apache 2.2.15 &#xff0c;这个版本有个解析漏洞。 目录 根据首页的图片猜测 /fristi/ 目录&#xff08;不过我没想到 -_-&#x…