微信小程序[黑马笔记]

简介

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

常用组件

视图组件

在这里插入图片描述

在这里插入图片描述

<!--pages/list/list.wxml-->

<scroll-view class="container1" scroll-y>

  <view>A</view>

  <view>B</view>

  <view>A</view>

</scroll-view>
<!--pages/list2/list.wxml-->

<swiper class="swiper_container" indicator-dots="true" indicator-color="white">

  <swiper-item class="item">

    A

  </swiper-item>

  <swiper-item class="item">

    B

  </swiper-item>

  <swiper-item class="item">

    C

  </swiper-item>

</swiper>

文本组件text/rich-text

<view>

长按选中效果

<text selectable>18580236389</text>

</view>

<view>

解析html字符串

<rich-text nodes="<h1 style='color:red;'>成功</h2>"/>

</view>

button组件

<view>-----通过type指定按钮类型----</view>

<button>默认按钮</button>

<button type="primary">主色调按钮</button>

<button type="warn">警告按钮</button>

  

<view>-----size='mini'小尺寸按钮----</view>

<button size="mini">默认按钮</button>

<button type="primary" size="mini">主色调按钮</button>

<button type="warn" size="mini">警告按钮</button>

  

<view>-----plain镂空按钮----</view>

<button plain>默认按钮</button>

<button type="primary" plain>主色调按钮</button>

<button type="warn" plain>警告按钮</button>

image组件

  

<view>------不保持纵横比,直至填满整个img元素</view>

<image src="/images/1.jpg" mode=""/>

<image src="/images/1.jpg" mode="scaleToFill"/>

  

<view>---------保持纵横比缩放,完整显示</view>

<image src="/images/1.jpg" mode="aspectFit"/>

  

<view>--------保持纵横比,保证一个方向上完整显示</view>

<image src="/images/1.jpg" mode="aspectFill"/>

  

<view>--------固定宽度不变,保持原本宽高比</view>

<image src="/images/1.jpg" mode="widthFix"/>

  

<view>--------固定高度不变,保持原本的宽高比</view>

<image src="/images/1.jpg" mode="heightFix"/>****

小程序API

事件监听API

同步API

异步API

动态操作

数据绑定

  

Page(

  {

    // 页面的初始数据

    data:{

      //绑定数据

      info:'hello world',

      //绑定属性

      imgSrc:'https://www.itheima.com/images/logo.png',

      //三元运算

      randomNum: Math.random()*10//生成10以内的随机数

    }

  }

)

<!-- //动态绑定数据 -->

<view>

{{info}}

</view>

  

<view>

<!-- //动态绑定属性 -->

<image src="{{imgSrc}} " mode="widthFix"/>

</view>

<!-- 三元运算 -->

<view>

{{randomNum>=5 ? "success" : "faile"}}

</view>

事件绑定

事件
事件是渲染层(webview)到逻辑层(js)的通讯方式
通过事件将用户在渲染层产生的行为反馈到逻辑层进行业务的处理

常用事件

  1. tap----bindtap/bind:tap----click
  2. input----bindinput/bind:input
  3. change–bindchange/bind:change

事件对象的属性列表

当事件回调触发的时候,会收到一个事件对象event,详细属性如下表所示:
在这里插入图片描述

在这里插入图片描述

定义事件

在这里插入图片描述

通过事件给数据赋新值

  

Page(

  {

    data:{

      count: 0

    },

    //给data中的数据赋新值

    btnTest(){

     this.setData(

      {

        count: this.data.count+1

      }

     )

    }

  }

)

事件传参

Page(

  {

    data:{

      count: 0

    },

    //事件传参(data-*,其中*代表的是参数的名字)

    btnTest(e){

    this.setData(

      {

        count:this.data.count+e.target.dataset.info

      }

    )

    }

  }

)
  

<view>事件传参</view>

<view>

{{count}}

</view>

<button type="primary" bindtap="btnTest" data-info="{{2}}">+1</button>

input输入框的处理函数

  

Page(

  {

    data:{

      count: 0

    },

    //input 文本框的处理函数

    inputHandler(e){

      console.log(e.detail.value);

    }
     inputHandler2(e){

      console.log(e.detail.value);

      this.setData(

        {

          msg:e.detail.value

        }

      )

    }

  }

)
<view>

  bindinput 测试

</view>

<input bindinput="inputHandler"/>
<input value="{{msg}} " bindinput="inputHandler2"/>

语法

条件语法

wx:if=“condition”
wx:elif=“condition”
wx:else=‘condition’

结合block使用wx:if

一次性控制多个组件的展示与隐藏
block不是组件,只是一个包裹性质的容器,不会在页面中做任何性质的渲染
wx:if 实质:动态地创建或者移除元素
< block wx:if=“condition”>
组件1;
组件2;
< /block>

hidden

实质:切换display:none/block 样式控制元素的显示或者隐藏
hidden=“{{condition}}”
condition===true 隐藏
反之显示

列表渲染

wx:for=“{{array}}”
默认:index 索引 item 循环项
wx:for-index="idx"指定索引名
wx:for-item="itemName"指定循环项名
wx:key=“id” 为渲染的列表项指定唯一的key,提高渲染效率

wxss模板样式

在这里插入图片描述

rpx

1.什么是rpx
小程序独有,解决不同屏的适配
2.实现原理
把屏幕从宽度上等分成750份

样式导入@import

@import “路径”;

全局配置

Window

控制导航栏区域以及背景区域
在这里插入图片描述

在这里插入图片描述

全局开启下拉刷新

添加配置项:enablePullDownRefresh
小圆点的色:“backgroundTextStyle”:“dark/light”

上拉触底距离

添加配置项:onReachBottonDistance

tabBar

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

{

  "pages":[

    "pages/home/home",

    "pages/like/like",

    "pages/index/index",

    "pages/logs/logs"

  ],

  "window":{

    "backgroundTextStyle":"dark",

    "navigationBarBackgroundColor": "#666",

    "navigationBarTitleText": "My",

    "navigationBarTextStyle":"white",

    "enablePullDownRefresh": true,

    "backgroundColor": "#efefef"

  },

  "tabBar": {

    "list": [

        {

        "pagePath": "pages/home/home",

        "text": "首页",

        "iconPath": "/images/shouye-zhihui (2).png",

        "selectedIconPath": "/images/shouye-zhihui.png"

        },

        {

          "pagePath": "pages/like/like",

          "text": "收藏",

          "iconPath": "/images/xihuan (2).png",

        "selectedIconPath": "/images/xihuan.png"

        }

    ]

  },

  "style": "v2",

  "sitemapLocation": "sitemap.json"

  

}

页面配置

app.json 中的window 全局配置小程序中的每个页面的窗口表现

网络数据请求

 wx.request({

    url: 'https://www.escook.cn/api/get',//请求的接口地址,必须基于https协议

    method:'GET',//请求方式

    data:{//发送到服务器的数据

      name:'zs',

      age:20

    },

    success:(res)=>{//请求成功之后的回调函数

      console.log(res.data);

    },
    complete:()=>{
    
    }

  })

在页面刚加载的时候请求数据

在onload()生命周期函数中 调用 请求数据的 方法

 /**

   * 生命周期函数--监听页面加载

   */

  onLoad(options) {

    this.getEvent()

  },

跳过request合法域名校验

详情-》本地设置-》不校验合法域名。。。

跨域 & Ajax

跨域问题:
前端调用的后端接口不属于同一个域(域名或端口不同),就会产生跨域问题,也就是说你的应用访问了该应用域名或端口之外的域名或端口。
跨域问题只存在基于浏览器的web开发中,小程序的宿主环境是微信客户端,不存在跨域问题
Ajax请求
ajax技术基于浏览器中的XMLHttpRequest对象,由于小程序的宿主环境是微信客户端,小程序中不能叫做发起Ajax请求,叫做发起网络数据请求

视图与逻辑

页面导航

实现导航的两种方式

1.声明式导航
使用navigator组件
1.1 导航到tabBar页面的时候一定要声明open-type
  

<!-- 1.导航到tabBar页面 -->

<button type="primary">

  <navigator url="/pages/like/like" open-type="switchTab"> 导航到收藏页面</navigator>

</button>

<!-- 2.导航到非tabBar页面 -->

<button type="primary">

  <navigator url="/pages/index/index" open-type="navigate"> 导航到非tabBar面</navigator>

</button>

<button type="primary">

  <navigator url="/pages/index/index"> 导航到非tabBar面</navigator>

</button>

在这里插入图片描述

2.编程式导航
调用小程序的导航API

在这里插入图片描述

在这里插入图片描述

//页面结构
<button type="primary" bindtap="goto">

  编程式导航

</button>

  

<button type="primary" bindtap="goback">

编程式导航后退

</button>

//逻辑
//编程式导航跳转

  goto(){

    // wx.switchTab({

    //   url: '/pages/like/like',

    // })

    wx.navigateTo({

      url: '/pages/index/index',

    })

  },
  /编程式导航后退

    goback(){

      wx.navigateBack()

    }

接收传递参数

 /**

   * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    //获取传递过来的参数

    console.log(options);

    this.setData(

      {

        query:options

      }

    )

  },

页面事件

下拉刷新事件

1.启用下拉刷新效果
在window节点添加enableRefresh(全局开启/局部开启)

//页面结构
  

<view>count:{{count}} </view>

<button bindtap="add">监听事件刷新</button>

//逻辑
 add(){

    this.setData(

      {

        count : this.data.count+1

      }

    )

  },
 /**

   * 页面相关事件处理函数--监听用户下拉动作

   */

  onPullDownRefresh() {

    this.setData({

      count:0

    })
    
      //自动关闭下拉

    wx.stopPullDownRefresh()

  },

2.实例(含节流操作)

//页面结构

<view wx:for="{{colorList}}" wx:key="index" style="background-color:rgba({{item}});">

{{item}}

</view>
//逻辑
// pages/message/message.js

Page({

  

  /**

   * 页面的初始数据

   */

  data: {

    colorList:[],//随机颜色列表

    isloading:false

  },

getColors(){

  this.setData(

    {

      isloading:true

    }

  )

  //1.展示loading效果

  wx.showLoading({

    title: '数据加载中',

  })

  

  //发起请求

  wx.request({

    url: 'https://applet-base-api-t.itheima.net/api/color',

    method:'get',

    success:(res)=>{

      this.setData({

        colorList:[...this.data.colorList,...res.data.data]

      })

    },

    //2.隐藏loading效果

   complete:()=>{

     wx.hideLoading()

    this.setData(

      {

        isloading:false

      }

    )

   }

  

  })

},

  /**

   * 生命周期函数--监听页面加载

   */

  onLoad(options) {

    this.getColors()

  },

  

  /**

   * 页面上拉触底事件的处理函数

   */

  onReachBottom() {

    if(!this.data.isloading)

      this.getColors()

  },

})

生命周期

指的是一个对象从创建-运行-销毁的过程

在这里插入图片描述

生命周期函数

是小程序框架提供的内置函数,伴随生命周期的运行,自动按次序执行
作用:
允许程序员在特定的时间点执行特定的操作

在这里插入图片描述

应用的生命周期函数

App({

  //1.小程序初始化完成时,执行此函数,全局只触发一次,可以做一些初始化操作

  onLaunch() {

  },

  //2.小程序启动,或从后台进入前台显示时触发

  onShow(){

  

  },

  //3.小程序从前台进入后台时触发

  onHide(){},

  globalData: {

    userInfo: null

  }

})

页面周期函数

  

  /**

   * 生命周期函数--监听页面加载(一个页面调用一次)

   */

  onLoad: function (options) {

    //获取传递过来的参数

    console.log(options);

    this.setData(

      {

        query:options

      }

    )

  },

  

  /**

   * 生命周期函数--监听页面初次渲染完成(一个页面调用一次)

   */

  onReady: function () {

  },

  

  /**

   * 生命周期函数--监听页面显示

   */

  onShow: function () {

  },

  

  /**

   * 生命周期函数--监听页面隐藏

   */

  onHide: function () {

  },

  

  /**

   * 生命周期函数--监听页面卸载(一个页面调用一次)

   */

  onUnload: function () {

  },

WXS脚本

wxml中不能调用页面的js中定义的函数,但是wxml中可以调用wxs中定义的函数
常用于:过滤器

与JavaScript的关系

wxs有自己的数据类型
	1.number string boolean object
	2.function array date regexp
wxs不支持ES6及以上的语法格式
	1.不支持:let const 解构赋值 展开运算符 箭头函数 对象属性简写 etc
	2.支持:var定义变量,普通function函数等类似于ES5的语法
wxs遵循CommonJS规范
	module对象
	require()函数
	module.exports对象

wxs特点

不能作为组件的事件回调函数
bindtap=“m2.toLower”—错误用法
隔离性:
1.不能调用js中定义的函数
2.也不能调用小程序提供的API
性能好:
在ios上快

使用

内联
<view>

{{m1.toUpper(data)}}

</view>

  
  

<!-- 定义内联的wxs -->

<wxs module="m1">

  module.exports.toUpper=function(str)

  {

    return str.toUpperCase();

  }

</wxs>
外联的wxs脚本

1.新建wxs文件

function toLower(str)

{

  return str.toLowerCase();

}

module.exports={

  toLower:toLower

}

2.页面引入使用

<view>

{{m2.toLower(country)}}

</view>

<wxs src="/utils/tools.wxs" module="m2"/>

基础加强

自定义组件

创建组件

1.根目录下创建components目录
2.右键选择创建test文件夹
3.右键test文件夹选择新建componen文件

局部引用 & 全局引用

在app.json 或者页面.json,中引用
{

  "usingComponents": {

    "my-test1":"/components/test/test"

  }

}

//在wxml中使用
 <my-test1></my-test1>

组件与页面的区别

1.组件的json文件 需要声明 “component”: true,
2.组件的js文件中调用的是 Component()函数
3.组件的事件处理函数需要定义到methods节点中

自定义组件的样式

组件样式隔离
 默认情况下,自定义组件样式只在组件内部生效,不被全局样式影响也不影响全局的样式
	只适用于class选择器
修改样式隔离效果
	通过stylesolation 修改
	//在组件的json文件新增配置
	"styleIsolation":"isolated"
	//或在组件的js文件中
	Component({
	options:{
		styleIsolation:"isolated"
	}
	})
styleIsolation 
		默认:isolated 独立不受影响
		apply-shared:页面影响组件
		shared:双向影响

数据监听器

// components/test/test.js

Component({


  /**

   * 组件的初始数据

   */

  data: {

    n1:0,

    n2:0,

    sum:0

  },

  

  /**

   * 组件的方法列表

   */

  methods: {

    addcountn1()

    {

      this.setData({

        n1:this.data.n1+1

      })

    },

    addcount2(){

      this.setData({

        n2:this.data.n2+1

      })

    }

  },

  observers:{//数据监听节点

    'n1,n2':function(n1,n2){//监听n1,n2的数据变化

      this.setData({

          sum:n1+n2

      })

    }

  }

})


//逻辑

<!--components/test/test.wxml-->

<view>数据监听器的使用</view>

<view>{{n1}}+{{n2}}={{sum}} </view>

  

<button bindtap="addcountn1">n1+1</button>

<button bindtap="addcount2">n2+1</button>

纯数据字段

不用于界面渲染的data字段

定义
在options节点中,指定pureDataPattern为一个正则表达式
Components({
options:{
	//指定以_开头的数据字段为纯数据字段
	pureDataPattern:/^__/
}
})

生命周期函数

created—组件实例被创建时
attached----在组件实例进入页面节点树时
ready
moved
detached—在组件实例被页面节点树移除后执行
eeror

created

不能调用setData方法

attached

组件完全初始化完毕,进入页面节点树

detached

做一些清理性质的工作

如何定义生命周期函数
Coimponents({
lifetimes:{
attached(){};//组件实例进入页面节点树时执行
detached(){};//组件实例被页面节点树移除时执行
}
})
组件所在页面的生命周期
Component({
pageLifetimes:{
show:function (){};//页面被展示
hide:function(){};//页面被隐藏
resize:function (){};//页面尺寸变化
}
})

自定义组件的插槽

在自定义的wxml结构中,提供< slot>节点(插槽),用于承担组件使用者提供的wxml结构
1.单个插槽

<!--components/test1/test1.wxml-->

<text>components/test1/test1.wxml</text>

<view>

<view>这里是组件的内部结构</view>

<slot></slot>

</view>

//使用

<my-test2>

<view>调用者:填充插槽</view>

</my-test2>

2.启用多个插槽
在组件的js文件

// components/test1/test1.js

Component({

/**

 * 配置节点

 */

  options:{

    multipleSlots:true

  },

  

  /**

   * 组件的属性列表

   */

  properties: {

  

  },

  

  /**

   * 组件的初始数据

   */

  data: {

  

  },

  

  /**

   * 组件的方法列表

   */

  methods: {

  

  }

})
使用多个插槽
	使用多个slot标签,以不同的name来区分不同的插槽
	<!--components/test1/test1.wxml-->

<text>components/test1/test1.wxml</text>

<view>

<view>这里是组件的内部结构</view>

<slot name="before"></slot>

<slot name="after"></slot>

</view>

//页面结构
<my-test2>

<view slot="before">插入组件的before位置</view>

<view slot="after">插入组件的after位置</view>

</my-test2>

组件通信

属性绑定
父传子--传递json兼容的数据
//父组件
<my-test2 count="{{count}} "></my-test2>
<view>~~~~~</view>
<view>父组件中count的值:{{count}}  </view>
//子组件
<view>子组件中coount的值:{{count}}  </view>

<button type="primary" bindtap="addCount">加一</button>
事件绑定
子传父--传递任意数据
1.在父组件的js中定义函数
2.在父组件的wxml中,将定义的函数引用传递给子组件
3.在子组件的js中,通过this.triggerEvent('自定义事件名',{/*参数对像*/}),将数据发送到父组件
4.在父组件的js中,通过e.detail获取子组件传过来的数据
自定义事件
bind:自定义事件名
//父组件的js文件
syncData(e){

    console.log("这是父组件的函数");

    console.log(e.detail);

  

    this.setData({

      count:e.detail.value

    })

  },
//父组件的wxml文件
<my-test2 count="{{count}} " bind:syncData="syncData"></my-test2>

  

<view>~~~~~</view>

  

<view>父组件中count的值:{{count}}  </view>

//子组件的js
 methods: {

    addCount(){

      this.setData({

        count:this.properties.count+1

      }),

      //触发自定义事件,将数值同步给父组件

    this.triggerEvent('syncData',{value: this.properties.count})

    }

  }
获取组件实例
父组件通过this.selectComponent(“id选择器/class选择器”)获取子组件实例对象
//父组件wxml
<my-test2 count="{{count}} " bind:syncData="syncData" class="getit"></my-test2>
<view>~~~~~</view>
<view>父组件中count的值:{{count}}  </view>
<button type="primary" bindtap="getChild">获取子组件实例</button>
//父组件js
getChild(){

   const child= this.selectComponent('.getit');

   child.setData({

     count:child.properties.count+1

   }),

   this.setData({

     count:this.data.count+1

   })

  },

behaviors

实现数据共享

1.创建组件

//调用behavior方法,创建实例对象

//使用module.exports将behaviors实例对象共享出去

  

module.exports=Behavior({

  //属性节点

  properties:{},

  //私有数据节点

  data:{

    username:'zs',

  },

   //事件处理函数与自定义的方法节点

   methods:{},
   //引入其他的behaviors
   behaviors:{}

   //其他节点

})

2.使用组件

//1.在组件中导入需要的behavior,

const myBehavior=require('../../behaviors/my-behaviors')

  

Component({
  //2.将导入的behaviors实例对象,挂载到behaviorss数组节点中
  behaviors:[myBehavior],
  })
同名字段的覆盖与组合规则
组件和他引用的behavior中可以包含同名的字段

处理规则:
1.data同名
2.propeties或者methods同名
3.生命周期函数同名
参考开发者文档

使用npm包

限制:
依赖于nodeJs的内置包
依赖于浏览器内置对象的包
依赖于c++插件的包

Vant Weapp
小程序UI组件库
使用
定制主题
/* 

1.在app.wxss中定义css变量

*/

page{

  --main-bg-color: brown;

  

}


.one {

  color: white;

  /* 2.使用css变量 */

  background-color: var(--main-bg-color);

  

  width: 500px;

  height: 500px;

}
小程序API的promise化

API的promise化
通过相关配置将官方提供的基于回调函数的异步API升级改造为基于Promise的异步API,避免出现回调地狱
1.实现promise化
在app.is中

//调用promisifyAll() 方法

//实现异步API的Promise化

import{promisifyAll} from 'miniprogram-api-promise'

const wxp=wx.p={}

//promisify all wx's api

promisifyAll(wx,wxp)

2.调用Promise化后的异步API

//wxml结构
<view>初体验vant  weapp</view>

<view>~~~~ </view>

<van-button type="primary" bindtap="getInfo">按钮</van-button>

//js
/**

 * async  声明getInfo 是个异步对象

 * await  将后续的promise的resolve返回

 */

  

  async getInfo()

  {

    //1.基于回调函数的API

    // wx.request({

    //   url: 'url',

    // })

    //2.基于Promise的API

    const {data:res}=await wx.p.request({

     url: 'https://applet-base-api-t.itheima.net/api/get',

     data:{

       name:"zs",

       age : 20

     },

    })

  

    console.log(res);

  },

全局数据共享

即状态管理:
解决组件之间的数据共享问题
开发中常用的方案:
VueX,Redux,MobX
小程序中:
安装包:
1.mobx-miniprogram 创建Store实例对象
2.mobx-miniprogram-bindings 将Store中的共享数据或者方法绑定到组件或者页面中使用
1.新建store.js文件

//创建store实例对象

//1.导入observable方法(返回值是store对象)

import {action, observable} from 'mobx-miniprogram'

  

//2.向外共享store

export const store = observable({

  //数据字段

  Num1:1,

  Num2:2,

  //计算属性(添加前缀 get--声明只能得到)

  get sum()

  {

    return this.Num2+this.Num1

  },

  //actions 方法,用来修改store中的数据

  updateNum1: action(function(step){

    this.Num1+=step

  }),

  updateNum2:action(function(step){

    this.num2+=step

  })

})

2.1将store的成员绑定到页面中

//页面的js文件

import {createStoreBindings} from 'mobx-miniprogram-bindings'

import{store} from '../../store/store'

// pages/home/home.js

Page({

  


  /**

   * 生命周期函数--监听页面加载

   */

  onLoad(options) {

    this.storeBindings=createStoreBindings(this,{

      store,//数据源

      fields:['num1','num2','sum'],//绑定的字段

      actions:['updateNum1']//需要的方法

    })

  },

  

  /**

   * 生命周期函数--监听页面卸载

   */

  onUnload() {

    this.storeBindings.destroyStoreBindings()

  },

  

2.2 将store中的成员绑定到组件中去

//导入

import{storeBindingsBehavior} from 'mobx-miniprogram-bindings'

import{store} from '../../store/store'

  

// components/numbers/numbers.js

Component({

  //通过storeBindingsBehavior实现自动绑定

  behaviors:[storeBindingsBehavior],

  storeBindings:{

    //指定绑定的store

    store,

    //指定绑定的字段数据

    fields:{

      //绑定字段的三种方式

        Num1:()=>store.Num1,

      Num2:(store)=>store.Num2,

      sum:'sum'

    },

    //指定绑定的方法

    actions:{

      updateNum2:'updateNum2'

    }

  },

3.1页面中使用绑定的成员

  //页面的wxml

<view>{{Num1}} + {{Num2}} = {{sum}} </view>

<van-button type="primary" bindtap="btnHandler" data-set="{{1}} ">Num1加一</van-button>

<van-button type="danger" bindtap="btnHandler" data-set="{{-1}} ">Num1减一</van-button>

//页面的js
 btnHandler(e){
    this.updateNum1((Number)(e.target.dataset.set))

  },

3.2 在组件中使用

<!--components/numbers/numbers.wxml-->

<view>{{Num1}} + {{Num2}} = {{sum}} </view>

<van-button type="primary" bindtap="btnHandler" data-set="{{1}} ">Num2加一</van-button>

<van-button type="danger" bindtap="btnHandler" data-set="{{-1}} ">Num2减一</van-button>

分包

将完整的小程序项目分解为一个主包+多个分包
主包:
	一般包含项目的启动页面与TabBar页面,以及分包所用到的公共资源
分包:
	只包含与当前分包有关页面与私有资源

分包的加载规则:

小程序加载后默认下载主包并启动主包的页面
当用户进入分包的某个页面的时候,客户端下载对应的分包

打包原则

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

引用原则

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

独立分包

在不下载主包的情况下独立运行
不能引用主包中的资源

分包预下载

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

1.在app.js里面 使用preloadRule节点来定义分包的预下载

//分包预下载的规则
 "preloadRule": {
//触发分包预下载的页面路径
   "pages/message/message":{
//表示在指定的网络模式下进行预下载
//可选值为:all(不限网络)/wifi(仅wifi模式下加载)

     "network": "all",
//表示进入页面之后要下载哪些分包
//可以通过root 或者 name 指定预下载哪些分包
     "packages": ["pkgA"]

   }

 },

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【禅道客户案例】同方智慧能源数智化转型新实践 禅道助力前行

同方智慧能源是同方股份有限公司的骨干企业。依托中核集团、清华大学的科技优势&#xff0c;坚持技术和资源双核驱动&#xff0c;基于30多年行业积淀&#xff0c;面向建筑、交通、工业、北方供热、数据中心等主要用能场景提供设计咨询、产品技术、投资建设、运营服务&#xff0…

设计模式学习笔记 - 项目实战一:设计实现一个支持各种算法的限流框架(实现)

概述 上篇文章&#xff0c;我们介绍了如何通过合理的设计&#xff0c;来实现框架的功能性需求的同时&#xff0c;满足易用、易扩展、灵活、低延迟、高容错等非功能性需求。在设计的过程中&#xff0c;我们也借鉴了之前讲过的一些开源项目的设计思想。比如 Spring 的低侵入松耦…

细致讲解——不同类型LSA是作用以及相互之间的联系

目录 一.常见的LSA类型 二.OSPF特殊区域 1.区域类型 2.stub区域和totally stub区域 &#xff08;1&#xff09;stub区域 &#xff08;2&#xff09;totally stub区域 3.nssa区域和totally nssa区域 &#xff08;1&#xff09;nssa区域 &#xff08;2&#xff09;totall…

【Android】SharedPreferences阻塞问题深度分析

前言 Android中SharedPreferences已经广为诟病&#xff0c;它虽然是Android SDK中自带的数据存储API&#xff0c;但是因为存在设计上的缺陷&#xff0c;在处理大量数据时很容易导致UI线程阻塞或者ANR&#xff0c;Android官方最终在Jetpack库中提供了DataStore解决方案&#xf…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

.net报错异常及常用功能处理总结(持续更新)

.net报错异常及常用功能处理总结---持续更新 1. WebApi dynamic传参解析结果中ValueKind Object处理方法问题描述方案1&#xff1a;(推荐&#xff0c;改动很小)方案2&#xff1a; 2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net…

WebSocket通信协议

WebSocket是一种网络通信协议.RFC6455定义了它的通信标准 WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双向通信的协议 HTTP协议是一种无状态的,无连接的,单向的应用层协议.它采用了请求,响应的模式.通信请求只能由客户端发起,服务端对请求做出应答处理. 这种模型有…

PO框架【自动化测试】

对象&#xff1a;Tpshop商城 需求&#xff1a;更换头像 操作步骤&#xff1a; 个人信息–头像–上传图片–图片确认–确认保存 核心代码&#xff1a; # 进入frame框架[不熟] driver.switch_to.frame(driver.find_element_by_xpath(//*[id"layui-layer-iframe1"]))…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

为什么要学音视频?

一直都在说“科技改变生活”&#xff0c;现实告诉我们这是真的。 随着通信技术和 5G 技术的不断发展和普及&#xff0c;不仅拉近了人与人之间的距离&#xff0c;还拉近了人与物&#xff0c;物与物之间的距离&#xff0c;万物互联也变得触手可及。 基于此背景下&#xff0c;音…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取

拉普拉斯边缘提取有什么作用&#xff1f; 拉普拉斯边缘检测是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和边界。它的主要作用包括&#xff1a; 边缘检测&#xff1a;拉普拉斯算子可以帮助检测图像中的边缘&#xff0c;即图像中亮度快速变化的位置。这些边缘通常…

前端HTML5学习2(新增多媒体标签,H5的兼容性处理)

前端HTML5学习2新增多媒体标签&#xff0c;H5的兼容性处理&#xff09; 分清标签和属性新增多媒体标签新增视频标签新增音频标签新增全局属性 H5的兼容性处理 分清标签和属性 标签&#xff08;HTML元素&#xff09;和属性&#xff0c;标签定义了内容的类型或结构&#xff0c;而…

RocketMQ 消息重复消费

现象 触发消息后&#xff0c;在1s内收到了两次消息消费的日志。 消息消费日志重复&#xff0c;reconsumeTimes0&#xff0c;主机实例也不同&#xff0c;说明是同一条消息被消费了两次 分析 生产者发送消息的时候使用了重试机制&#xff0c;发送消息后由于网络原因没有收到MQ…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

【C++】---STL容器适配器之queue

【C】---STL容器适配器之queue 一、队列1、队列的性质 二、队列类1、队列的构造2、empty()3、push()4、pop()5、size()6、front()7、back() 三、队列的模拟实现1、头文件&#xff08;底层&#xff1a;deque&#xff09;2、测试文件3、底层&#xff1a;list 一、队列 1、队列的…

【NR RedCap】Release 18标准中对5G RedCap的增强

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

R语言贝叶斯方法在生态环境领域中的应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域&#xff0c;其火爆程度已经跨越了学术圈&#xff0c;如促使其自成统计江湖一派的贝叶斯定理在热播美剧《The Big Bang Theory》中都要秀一把。贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于…