小程序(四)

news2024/12/22 18:14:13

十四、分包加载

(一)普通分包与主包

随着项目越来越大,为了用户更好的体验,小程序引用了分包技术,分包技术将tabBar页面及一些全局使用的静态资源,放到主包中,开发者可以根据需要添加分包,这些分包中也可以包含一些页面,但是在用户跳转到分包页面前,小程序是不会下载分包的相关内容。这样也减小了用户使用小程序的压力,加快了小程序的加载速度,避免了很多没有必要的内容的加载。

主包是默认没有放到分包中的所有核心源码中的内容,不需要指定主包!

1、在app.json中指定分包

"subPackages": [
    {
      "root": "modules/goods",
      "name":"goodsModules",
      "pages":[
        "pages/goods/goods",
        "pages/index/index"
    ]
    }
  ]

2、在主包页面中添加navigator跳转到分包页面:

<!-- 注意,这里路径直接使用/定位到modules即可,/默认为项目根路径 -->
<navigator url="/modules/goods/pages/goods/goods" open-type="navigate">点击跳转到分包页面</navigator>

该配置项是一个数组,数组中有三个属性,分别

  •  root,分包的根目录
  • name,指定项目中使用该分包时的名称
  • pages,指定该分包中包含的页面。

因为分包是在数组中声明的,故可以同时有多个分包,但是分包时也有很多其他要注意的地方:

1、所有分包(包括主包)的大小之和不能超过20MB,每个分包的大小不能超过2MB。

2、分包的根目录之间不能进行嵌套,一个分包的根目录不能是另一个分包的子目录

3、主包不可以引用分包资源,分包资源也不可以引用其他分包资源(原因可想而知,因为当用户打开小程序页面时,分包资源在用户跳转之前不会被下载,故不能引用,分包和分包之间亦是如此)。分包可以引用主包中的静态资源。

(二)独立分包

为什么会有独立分包?其适用于如下场景:

当分包页面不依赖主包资源,是一个相对独立的功能时,可以将分包设置为独立分包,如此,只有当从独立分包跳转到主包、其他分包或者直接加载主包时,主包资源才会被下载。

使用:只需要在subPackges属性中的分包对象中增加“independent”属性为true即可。

  {
      "root": "modules/goods",
      "name":"goodsModules",
      "pages":[
        "pages/goods/goods",
        "pages/index/index"
    ],
    "independent": true
    }

注意点:

1、独立分包不受app.wxss中样式影响

2、独立分包不能引用主包的资源(因为那时候主包可能未加载!

3、独立分包中不能使用APP这个构建小程序的方法,否则可能会引起一些未知的错误

(三)分包预加载

人就挺怪,有时候希望只加载用户需要的页面,这样可以更快,但又担心用户突然跳转下载又来不及,两害相权全保留,只是不同场合需要使用不同的方案,这里我们讲一下如何设置预加载。

涉及几个元素:当前所在页面,要预加载页面、开启预加载的环境!(在app.json中配置)

1、在主包主页面开启预加载:

"preloadRule": {
    "pages/index/index":{
      "network": "all",
      "packages": ["goodsModules"]
    }
  }

"network"指定预加载环境:"wifi"、"all";

"packages"指定要加载的分包,可以使用上面指定分包时的"name"属性,也可以使用"root"属性(分包根目录地址)

2、在独立分包中指定预加载主包:

"modules/goods/pages/goods/goods":{
      "network": "all",
      "packages": ["__APP__"]
    }

这里留个疑问,虽然预加载显示了,但是有警告说__APP__没有找到!

十五、微信开放能力

(一)获取微信头像并使用

A、前置准备

我们准备一个被按钮包裹的图片,实现点击图片后跳转出换头像菜单,结构如下:

<button class="btn" >
<image src="{{avatarUrl}}" class="avatarImage" ></image>
</button>
</view>
.btn{
  /* 将背景色设置为透明 */
  background-color: transparent;
}
/* 将按钮的边框去掉 */
.btn::after{
  border: none;
}
/* 设置图片大小 */
.avatarImage{
  width: 333rpx;
  height: 250rpx;
  border-radius: 50%;

}

B、开启菜单跳转

open-type="chooseAvatar"指定跳转出菜单,

随后指定处理的方法bindchooseavatar="bindchooseHandler",方法名没有规定。

<button class="btn" open-type="chooseAvatar" bindchooseavatar="bindchooseHandler">
<image src="{{avatarUrl}}" class="avatarImage" ></image>
</button>
bindchooseHandler(event){
    // 微信头像临时地址会储存在传入参数的detail中
    //这个头像的地址也是临时的,需要我们在自己的服务器做持久化处理!
    console.log(event.detail)
    let avatarUrl= event.detail.avatarUrl;
    this.setData({
      avatarUrl
    })
  }

(二)获取微信昵称并使用

1、我们要让input框和button被form表单包裹,这样才能实现我们的效果。

结构:

</view>
<form bindsubmit="sendName">
<!-- nickName,当点击输入框时,会弹出使用微信昵称的快捷选项 -->
<!-- name属性,提交时form表单会收集name作为key,value值作为value发送到目标服务器 -->
<input type="nickname" class="inputMe" name="nickname"placeholder="请输入昵称"/>
<!-- form-type为submit,当点击该按钮时,就会触发form标点的 -->
<button form-type="submit" class="buttonSubmit">提交昵称</button>
</form>

方法:

 // 表单发送昵称的方法
  sendName(event){
    //昵称会被保存在传入事件参数的detail.value中
    console.log(event.detail.value.nickname);
  }

(三)分享

需要在页面js文件或者按钮中声明按钮类型

A、分享给朋友

1、在页面js文件的Page方法中声明。

  onShareAppMessage(obj){
     console.log(obj);
//return的对象,可以控制分享弹窗的内容,包括名字,路径,最后是本页面的路径。
 return{
       title:'我的分享',
       path:'/pages/index/index',
       imageUrl: "/static/suolong.jpg"
     }
  }

如此,该页面即可分享。

2、通过按钮形式,分享到朋友(注意此种方式需要小程序得到认证)

<button open-type="share">点我分享给朋友</button>

B、分享到朋友圈

1、在js文件中声明分享的方法:

 onShareTimeline(obj){
    console.log(obj); 
    //返回对象,控制转发朋友圈的名字,图片和当前页面的参数
    return{
      title:"我的分享",
      query:"name=chen&age=23",
      imageUrl:"/static/suolong.jpg"
     }
  }

注意:开启分享到朋友圈功能前提是开启分享给朋友功能!

(四)验证手机号码

A、前置

因为验证手机号服务是付费服务,且不对个人开发着开启使用,所以我们要想继续尝试使用,可以在开发时将AppID切换到接口测试号,即可正常使用。方法如下:

1、点击“详情”,然后点击AppId后的修改

2、点击下拉框,选择接口测试号即可

 

 B、快速手机号验证、手机号实时验证

二者的区别是,前者不需要用户接受验证码,后者需要用户等待接受验证码。

结构:

<!-- 手机号快速验证 -->
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
手机号快速验证
</button>
<!-- 手机号实时验证 -->
<button open-type="getRealtimePhoneNumber" bindgetrealtimephonenumber="getRealtimePhoneNumber">手机号实时验证</button>

js:

 getPhoneNumber(event){
      console.log(event);
      
    },
    getRealtimePhoneNumber(event){
         console.log(event) 
     }

/*/实际需要一个过程就是,将传入参数中的code值传入到后端,然后后端根据code调用相应的API。

/*/返回给我们真正的用户手机号,从而让我们进行业务,这里省略。

 大概结构:

{type: "getrealtimephonenumber", timeStamp: 26538, target: , currentTarget: , mark: , …}
currentTarget: Object
detail: Object
code: "156e5838b4022107394d917d427d463b123952b848a420708c2d9c546"
errMsg: "getPhoneNumber:ok"
__proto__: Object
mark: Object
mut: false
target: Object
timeStamp: 26538
type: "getrealtimephonenumber"
__evName: "getrealtimephonenumber"
_userTap: false
__proto__: Object

(五)客服支持

微信提供了客服支持,只需要设置一下按钮的属性之后,就可以接入微信提供的客服网页(或者小程序),非常的方便!

A、用户端代码:

<button open-type="contact">联系客服</button>

这样,当用户点击该按钮就会跳到客服对话界面,等待客服回复。 

B、客服人员添加与回复

1、在微信公众平台上点击“服务侧边栏”,然后点击“添加客服”按钮,搜索微信号,点击添加:

 

最后点击蓝色字,即可作为客服回复用户疑问。 

2、客服界面展示:

 

(六)getApp()

该方法可以用来获取小程序全局对象,我们可以在app.js中声明一些对象,方法等,在其他页面和组件中,可以通过该方法生成小程序实例,然后通过实例拿到全局数据,这样我就可以实现全局数据和方法传递。 

1、在app.js中声明数据和方法:

// app.js
App({
  globalData:{
    myData:"天下无双,唯我独尊!"
  },
  //设置myData的方法
  setMyData(myData){
    this.globalData.myData = myData;
  }
})

2、在index页面中产生app实例对象并使用app中的方法:

// 生成app实例对象
const appInstance = getApp();
Page({
  
  //获取全局实例然后,应用到页面上。
  data:{
    indexData:""
  },
  onLoad(){
    this.setData({
      indexData:  appInstance.globalData.myData,
    })
  },
  changeText(){
//注意这里只是为了证明可以调用全局app中的方法,其数据并不是响应式的。
    appInstance.setMyData("我才是无敌的!");
  }
})
<text>{{indexData}}</text>
<button bind:tap="changeText">点我修改data</button>

十六、数据通信(补充)

(一)跳转新页面后利用数据通道

本质上跟vue的自定义事件实现页面之间数据传递很像,要接受数据的页面,利用on方法绑定自定义事件,接受方执行自定义事件接受到数据。不过微信将这种思想更加综合了,中间好似有个看不见的中间人,让数据接受方也可以发送数据,从而实现数据互通。(本质上,还是绑定自定义事件,实现数据传递

1、在接收方使用this.navigateTo,在success回调函数中调用eventChannel发送数据:

wx.navigateTo({
      url: '/pages/second/second',
  
      success(res){
        //在执行传递自定义事件的同时,向跳转页面传递数据
       res.eventChannel.emit("getData",{
         name:"chen延年",
         age: 22
       })
      },
      //专门的配置项,用来接受跳转页面发来的数据,绑定自定义事件,并传递数据
      events:{
        giveData(arg1){
         console.log(arg1);
        }
      }
    })

2、发送方:

const eventChannel  = this.getOpenerEventChannel();
eventChannel.on("getData",function(res){
   console.log(res);//展示我们接收到的参数
 });
//同时将数据发送
 eventChannel.emit("giveData",{
  lover:"清漪"
});

(二)数据总线

像上面分析的那样,如果需要交换数据的组件并不相临为父子组件,关系比较复杂时,一层一层传递数据中间不需要这些数据的组件就相当于白白当了一回工具,这样是极其浪费源的。所以就有下面这种思想

一个组件专门负责数据通信,负责数据的转发,发送方只需要将要发送的数据发送,想要接收到该条数据的组件,只需要根据事件名,就可以从数据中介中获取想要的数据。(所谓发布订阅模式)

两个通信的组件,同时被同一个页面引用。

1、首先我们要引入包pubsub-js(注:笔者是mac系统,sudo是为了把文件夹权限给到位):

sudo npm install pubsub-js

2、构建(前有所提)

3、在组件中引入,并绑定事件和数据(发送方)

import PubSub from "pubsub-js"
//要引入

methods:{
  giveData(){
    //定阅消息
    PubSub.publish("myEvent",{
      name:'陈大炮',
      age: 23
    })
 }
}
<button type="primary" bind:tap="giveData">发送数据到组件scanyou</button>

4、数据接收方(默认引入pubsub包)

lifetimes: {
    //接受消息
   attached(){
    //接受发布者的消息
    PubSub.subscribe("myEvent",(msg,data)=>{
      console.log(msg,data);
      this.setData({
        name:data.name,
      })
    })
  }
  }
<text>孩子的名字是:{{name}}</text>

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

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

相关文章

典型芯片的载波馈通(本振泄露)问题

零中频的本振泄露会降低发射机的EVM&#xff0c;本文我们将会对SX1255和AD9361的本振泄露问题进行简单的讨论。 1.SX1255载波馈通问题 表1.1中的-8dBc测试结果的前提是PAD输出功率为-5dBm&#xff0c;那么此时根据-8dBc的载波本振抑制可以知道Driver输出的载波馈通功率为-13dB…

python接口测试之tokensession的处理

使用python语言来进行实现&#xff0c;在这里我们使用第三方的库requests&#xff0c;需要单独的安装下&#xff0c;安装的命令是&#xff1a; pip install -U requests 见安装的截图&#xff1a; 安装成功后&#xff0c;如果可以在正常的导入&#xff0c;说明安装OK&#xf…

Linux 通过关键字查找文件

按文件名查找 find 路径 -name “文件名” 查找当前目录下的所有mk文件 find . -name "*.mk"按关键字查找 find 路径 -name “文件名” | xargs grep -n “关键字” 参数&#xff1a; xargs 是给命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具 -n…

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…

视频下载器 - 网页视频自动嗅探2.2.4

【应用名称】&#xff1a;视频下载器 - 网页视频自动嗅探 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Video #Downloader 【应用版本】&#xff1a;2.2.4 【应用大小】&#xff1a;33MB 【软件说明】&#xff1a;软件升级更新。支持多种格式的看片神器&am…

一.使用MySQL Workbench连接mysql数据库

一.使用MySQL Workbench连接数据库 MySQL Workbench这是MySQL官方主推的数据库可视化工具。 它提供了管理MySQL数据库,设计模型,进行SQL开发和管理的功能。主要功能包括: 数据库设计:可以通过直观的GUI创建EER模型,生成数据库结构。 SQL开发:提供代码编辑器,可以方便编写和执行…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…

绝地求生:29.2商城更新内容预览:挣脱尘网通行证,经典皮肤返场,空投活动

就在今天历经9小时维护&#xff0c;29.2版本终于上线&#xff0c;柠檬茶带大家一起看看&#xff0c;这次游戏里都更新了哪些内容吧。 挣脱尘网通行证 豪华版&#xff1a;$14.99 普通版&#xff1a;$4.99 豪华版比普通版多10级升级券和2套生存者宝箱 分支一 分支二 分支三 额外…

java入门1.1.2

前言&#xff1a; 第一&#xff1a;一坨垃圾的迭代&#xff0c;还是垃圾 第二&#xff1a;本内容为对类&#xff0c;对象&#xff0c;构造函数的最新抽象理解 正片 先将类&#xff0c;对象&#xff0c;还要构造函数翻译成英文 class&#xff0c;object&#xff0c;construc…

【氮化镓】高电容密度的p-GaN栅电容在高频功率集成中的应用

这篇文章是香港科技大学Kevin J. Chen等人与台积电M.-H. Kwan等人关于高电容密度的p-GaN栅电容在高频功率集成中的应用研究。 文章详细介绍了p-GaN栅电容的设计、特性和在高频功率集成中的应用。通过实验数据和理论分析&#xff0c;文章展示了p-GaN栅电容在实现高电容密度、低…

ChatGpt生成网页应用,实现上传文件到服务器并保存上传记录的功能

使用 HTML 和 JavaScript 实现文件上传功能 1. 简介 在现代 web 开发中&#xff0c;实现文件上传功能是一个常见的需求。本文将介绍如何使用 HTML、CSS 和 JavaScript 创建一个支持 .obj 和 .jpg 文件上传的网页应用&#xff0c;并且展示上传进度以及上传完成后的文件信息。用…

AMD W7900本地大型语言模型的微调

GenAI-contest/01-LLM_Fine-tuning at main amd/GenAI-contest (github.com) 大型语言模型&#xff08;LLMs&#xff09;在大量的文本数据上进行训练。因此&#xff0c;它们能够生成连贯且流畅的文本。Transformer架构是所有LLMs的基础构建块&#xff0c;它作为底层架构&…

EasyCVR智慧校园建设中的关键技术:视频汇聚智能管理系统应用

一、引言 随着信息技术的迅猛发展&#xff0c;智慧校园作为教育信息化建设的重要组成部分&#xff0c;对于提升校园安全、教学效率和管理水平具有重要意义。本文旨在介绍智慧校园视频管理系统的架构设计&#xff0c;为构建高效、智能的校园视频监控系统提供参考。 二、系统整…

Spring-Cloud 微服务

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程 优点: 1:部署简单:由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈&#xff0c;往往一套熟悉的…

某能源集团电力公司搭建数据报表中心,实现采集填报分析一体化

​在当今这个信息爆炸的时代&#xff0c;数据已成为企业最宝贵的财富&#xff0c;越来越多的企业开始重视数据的积累和归集。在企业日常生产和工作过程中&#xff0c;会产生绵延不断的数据&#xff0c;但这些数据往往没有统一的记录、归纳和整理&#xff0c;或者录入了系统却分…

linux中远程服务器上传输文件的10个sftp命令示例

目录 1. 如何连接到 SFTP 2. 帮助 3.检查当前工作目录 4. 使用 sftp 列出文件 远程 本地 5. 使用 sftp 上传文件 6. 使用 sftp 上传多个文件 7. 使用 sftp 下载文件 8. 在 sftp 中切换目录 远程 本地 9. 使用 sftp 创建目录 10. 使用 sftp 删除目录 11. 退出 sf…

【UE Niagara】在UI上生成粒子

效果 步骤 1. 在虚幻商城中将“Niagara UI Render”插件安装到引擎 2. 打开虚幻编辑器&#xff0c;勾选插件“Niagara UI Renderer”&#xff0c;然后重启编辑器 3. 先创建一个控件蓝图&#xff0c;该控件蓝图只包含一个按钮 这里设置尺寸框尺寸为200*50 4. 显示该控件 5. 新…

代数拓扑学

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#张亿&#xff0c;今天呐&#xff0c;学的是代数拓扑学 代数拓扑学是拓扑学中主要依赖 [1]代数工具来解决问题的一个分支。同调与同伦的理论是代数拓扑学的两大支柱&#xff08;见同调论&#xff0c;同伦论&#xff09;。 …

复杂json解析(其中有一个key的value是json格式的字符串)

app上报的参数如下: {"clientId": "8517895440514039afcf6d3e5d7832ae","dua": "SNDOCKCJPH90_GA&VN900042418&BN0&VCXiaomi&MOM2012K11AC&RL1080_2239&CHIDunknown_unknown&LCID&RV&OSAndroid13&…