微信小程序[黑马笔记]

news2024/11/19 15:30:19

简介

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

常用组件

视图组件

在这里插入图片描述

在这里插入图片描述

<!--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.coloradmin.cn/o/1629371.html

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

相关文章

终端安全管理软件哪个好?

终端安全管理软件是保障企业信息安全的重要工具。 它们能够有效地防范恶意软件、黑客攻击和其他安全威胁&#xff0c;并提供多方面的终端设备安全保护措施。 终端安全软件的功能和保护机制各不相同&#xff0c;这就需要企业根据自身的需求和情况来进行评估和选择。 下面总结了…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

visual studio2022,开发CMake项目添加rabbitmq库,连接到远程计算机并进行开发于调试

1.打开visual studio installer 。安装“用于 Windows 的 C CMake 工具” 2.新建CMake项目 3.点击VS的“工具”—>"选项“—>“跨平台”—>”连接管理器“,添加远程计算机。用来将VS编辑的代码传到服务器进行编译–连接—运行&#xff08;调试&#xff09;。 …

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第二部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2…

2-Qt Designer(界面设计师)的简单使用

文章目录 前言一、打开Qt Designer二、创建具体ui界面三、保存ui文件四、导入ui文件生成界面实现功能补充总结前言 Qt Designer(界面设计师)可以方便我们图形画界面设计界面的布局,不用再一遍又一遍手动调窗口宽高,位置等参数,极大的节省了我们的工作效率。下面是一个简单…

PotatoPie 4.0 实验教程(24) —— FPGA实现摄像头图像中心差分变换

为什么要对图像进行中心差分变换&#xff1f; 对图像进行中心差分变换的主要目的是计算图像中每个像素点的梯度。梯度在图像处理中是一个非常重要的概念&#xff0c;它可以用来描述图像中灰度变化的快慢和方向&#xff0c;常用于边缘检测、特征提取和图像增强等任务中。 具体…

eclipse 如何创建python文件

一、准备 1.平台要求&#xff1a; 电脑除了要安装eclipse软件和Python语言包之外&#xff0c;还需要将Python集成到eclipse软件中&#xff0c;网上有很多的方法&#xff0c;这里就不细细介绍如何集成了。 在下面界面中可以看到自己已经安装了继承插件。具体方法见步骤2&…

Windows vs2017编译net-snmp

呜呜呜呜呜呜~~~&#xff0c;我太菜了&#xff0c;编了一天&#xff01;&#xff01;&#xff01; 把下面的代码跑起来 #include <iostream> #include <WinSock2.h> #define __STDC_LIMIT_MACROS // 添加宏定义 #include <net-snmp/net-snmp-config.h> #in…

Gateway服务网关!!!

一、为什么需要服务网关&#xff1a; 两大特性&#xff1a;高可用和高性能 1、高性能&#xff1a;采用异步的方式调用服务。 2、高可用 二、网关包含三大属性&#xff1a; 三、基本配置 <dependency><groupId>org.springframework.boot</groupId><artif…

如何我现在是本地的文件路径不是http,用html如何打开

--别给我BB 如何我现在是本地的文件架路径不是http&#xff0c;用html如何打开? 答&#xff1a; 如果你想在HTML中打开本地文件路径的视频&#xff0c;可以使用file://协议。假设你的视频文件在本地的路径为/path/to/your/video.mp4&#xff0c;那么你可以将src属性设置为file…

WebSocket 深入浅出

WebSocket 深入浅出 1. WebSocket 是什么2. WebSocket 建立连接通信的过程3. WebSocket 和http的联系与区别4. WebSocket 的使用场景及限制 1. WebSocket 是什么 定义&#xff1a;WebSocket 是一种网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信。是HTML5规范提…

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别 普通动画&#xff1a;动画文件里记录的是物体的绝对坐标和方向&#xff0c;在播放动画时&#xff0c;Unity会根据Animation中记录的值&#xff0c;直接修改游戏对象的坐标和方向&#xff0c;每一帧的坐标和方向都是通过插值计算得出来的&…

【Docker】Docker 实践(三):使用 Dockerfile 文件构建镜像

Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerfile 文件构建镜像 1.使用 Dockerfile 文件构建镜像2.Dockerfile 文件详解 1.使用 Dockerfile 文件构建镜像 Dockerfile 是一个文本文件&#xff0c;其中包含了一条条的指令&#xff0c;每一条指令都用于构建镜像…

R语言高级数据管理

一&#xff0c;数学函数 绝对值函数abs(x) sqrt(x) 开平方根 不小于某个数的最小整数ceiling(x) 不大于某个数的最大整数floor(x) 四舍五入round(x) sin(x) cos(x) log(x) 二&#xff0c;统计函数 求平均值 > x<-c(2,3,4,5,6,7,8,9,10) > mean(x) 求和 &g…

数学视角下的编程艺术:深入线性代数学习与应用

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

C#调用skiasharp实现绘制并拖拽图形

SkiaSharp是基于.net的跨平台二维图形库&#xff0c;封装的谷歌的Skia库&#xff0c;SkiaSharp支持在以下平台或运行时中使用&#xff0c;能够在图片中绘图&#xff0c;也提供控件在Winform、WPF等使用。本文学习skiasharp在Winform的基本用法&#xff0c;并参照参考文献5实现绘…

数据集笔记:geolife staypoint聚合的location 最近的10个其他location

数据集&#xff1a;处理geolife数据-CSDN博客 这边的stations&#xff0c;找到每个station 最近的其他10个station 1 读取数据 假设已经读完了&#xff0c;就是locations 2 保留有用的列 locations.drop([center,user_id],axis1,inplaceTrue) locations 3 加载几何形状 使用…

安装配置Maven(idea里面配置)

放在这个路径下&#xff08;如果需要可以免费发给你&#xff0c;dd我就好了&#xff09; D:\IearnSoftware\maven\apache-maven-3.6.1-bin.zip&#xff08;我自己的路径下面&#xff0c;防止忘记&#xff09; 1.首先测试maven在不在&#xff0c;配置对不对 mvn -v 这样就是成…

[Linux][网络][网络编程套接字][一][预备知识][套接字地址结构]详细讲解

目录 0.预备知识1.理解源IP地址和目的IP地址2.理解源MAC地址和目的MAC地址3.端口号4.理解端口号和进程ID5.理解源端口号和目的端口号6.通过IP地址、端口号、协议号进行通信识别7.认识TCP协议和UDP协议8.网络字节序 1.套接字地址结构(sockaddr) 0.预备知识 1.理解源IP地址和目的…

【智能算法】骑手优化算法(ROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2018年&#xff0c;D Binu等人受到骑手群体竞赛赢得比赛行为启发&#xff0c;提出了骑手优化算法&#xff08;Rider Optimization Algorithm, ROA&#xff09;。 2.算法原理 2.1算法思想 ROA基…