微信小程序学习笔记

微信小程序学习笔记(详细汇总) 小程序学习笔记一、微信小程序简介微信小程序优点:二、微信小程序环境准备2.1 申请帐号2.2 安装开发工具 一、微信小程序简介 微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用触手可及"的梦想,用户扫一扫或搜一下即可打开应用。 微信小程序,之前叫应用号,2017年正式上线 微信小程序优点: 微信有海量用户,且粘性很高,在微信里开发产品更容易触达用户 推广app或公众号的成本太高 开发适配成本低 容易小规模试错,然后快速迭代 跨平台 阅读详情

目录

前情提要

开发模式

  1. 申请小程序开发账号
  2. 安装小程序开发者工具
  3. 创建和配置小程序项目

小程序官方组件展示

image.png

注册开发者账号

  1. 网址:https://mp.weixin.qq.com/

获取appID

  1. appid是一长串的字符,还有一个secret也是需要的,这里我的就不展示出来了

微信小程序开发工具

  1. 下载稳定版最新版就好了,就在微信小程序开发里面

代码构成

项目结构

  1. pages:页面文件夹
  2. app.js:项目入口文件
  3. app.json:全局配置文件
  4. utils:工具模块文件夹
  5. app.wxss:全局样式文件
  6. project.config.json:项目配置文件
  7. sitemap.json:用来配置小程序及其页面是否允许被微信索引

页面组成

  1. .js:页面脚本文件
  2. .json:页面配置文件
  3. .wxml:页面模板结构文件
  4. .wxss:页面样式表文件

json配置文件

  1. app.json文件:全局配置
  2. project.config.json文件:个性化配置
  3. sitemap.json文件:用来配置小程序及其页面是否允许被微信索引
  4. 每个页面文件夹中的.json文件:配置本页面窗口外观

app.json

  1. 作用:当前小程序的全局配置
  2. 配置项:
    1. pages:当前小程序所有页面的路径
    2. window:全局定义小程序所有页面的背景色、文字颜色等
    3. style:组件样式版本
    4. sitemapLocation:指明sitemap.json的位置

WXML

  1. 类似于HTML
  2. 区别:
    1. 标签名不同
    2. 属性节点不同
    3. 提供了类似于Vue中的模板语法

WXSS

  1. 样式语言,类似于css
  2. 区别:
    1. 新增rpx
    2. 仅支持部分CSS选择器

.js文件

  1. app.js:小程序的入口文件,通过调用App()函数来启动整个小程序
  2. 页面的.js文件:通过调用Page()函数啦创建并运行页面
  3. 普通.js文件:封装公共函数或属性

开发流程

  1. 新建小程序页面:在app.json->中新建页面的存放路径,小程序开发者工具会自动创建页面文件夹
  2. 修改项目首页:app.json->pages数组中排第一的就是项目首页

小程序的宿主环境

通信环境

  1. 渲染层(WXSS和WXML)和逻辑层(js脚本)之间的通信:有微信客户端(Native)进行转发
  2. 逻辑层(js脚本)和第三方服务器之间的通信:由微信客户端(Native)进行转发

运行机制

  1. 小程序启动
  2. 页面加载

组件

组件分类
  1. 视图容器
  2. 基础内容
  3. 表单组件
  4. 导航组件
  5. 媒体组件
  6. map地图组件
  7. canvas画布组件
  8. 开放能力
  9. 无障碍访问
视图容器类组件
  1. view
    1. 类似于div,块级元素
  2. scroll-view
    1. 可滚动的视图区域
    2. 具体用例:
// 纵向滚动
<scroll-view scroll-y></scroll-y>
// 横向滚动
<scroll-view scroll-x></scroll-y>
  1. swiper和swiper-item
    1. 轮播图容器组件和轮播图item组件
    2. 具体用例:
<swiper circular>
  <swiper-item>A</swiper-item>
  <swiper-item>B</swiper-item>
  <swiper-item>C</swiper-item>
</swiper>
  1. 常用属性:
属性类型默认值说明
indicator-dotsbooleanfalse是否显示面板指示点
indicator-colorcolorrgba(0,0,0,.3)指示点颜色
indicator-active-colorcolor#000当前选中的指示点颜色
autoplaybooleanfalse是否自动切换
intervalnumber5000自动切换时间间隔
circularbooleanfalse是否采用衔接滑动
基础内容组件
  1. text
    1. 文本组件,类似于span,行内元素
    2. 可通过selectable属性,实现长按选中文本内容的效果
  2. rich-text
    1. 富文本组件
    2. 通过nodes属性节点,把HTML字符串渲染为对应的UI结构
    3. 具体用例:
<rich-text nodes="<h1 style='color: red;'>标题</h1>"></rich-text>

其他常用组件

  1. button
    1. 按钮组件
    2. 通过open-type属性可以调用微信提供的各种功能(客服、转发、获取用户授权、获取用户信息等)
    3. 具体用例:
// 通过type指定按钮类型
<button>默认按钮</button>
<button type="primary">主色调按钮</button>
<button type="warm">警告按钮</button>

// size="mini" 小尺寸
<button size="mini">小尺寸按钮</button>

// plain 镂空
<button plain>镂空按钮</button>
  1. image
    1. 图片组件
    2. 默认宽300px、高240px
    3. mode属性:指定图片的裁剪和缩放模式
mode值说明
scaleToFill(默认值),图片填满image元素
aspectFit图片长边完全显示
aspectFill图片短边完全显示
widthFix宽度不变,image元素高度随图片变化
heightFix高度不变,image元素宽度随图片变化
  1. 具体用例:
<imgae src="/images/1.png" mode="aspectFill"></imgae>
  1. navigator
    1. 页面导航组件,类似于a标签

API

  1. 事件监听API
    1. 以on开头,用来监听某些事件的触发
    2. 例:wx.onWindoeResize(function callback)监听窗口尺寸变化的事件
  2. 同步API
    1. 以Sync结尾
    2. 可以通过含糊返回值直接获取
    3. 例:wx.setStorageSync(‘key’, ‘value’)向本地存储中写入内容
  3. 异步API
    1. 需要通过success、fail、complete接受调用的结果
    2. 例:wx.request()发起网络请求,通过success回调函数接收数据

模板与配置

WXML模板语法

数据绑定
  1. 在data中定义数据
  2. 在WXML中使用数据
  3. 具体用例:
// 页面的.js文件中
Page({
  data:{
    // 字符串类型
    info:'string data',
    // 数组类型
    msgList:[{msg:'hello'},{msg:'world'}],
    // 图片地址
    imgSrc:'https://img2.baidu.com/it/u=2750810294,3836014703&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=707',
    // 数学运算
    randomNum':Math.random() * 10,
  }
})
<!-- // .wxml文件中 -->

<!-- 数据使用 -->
<view>{{info}}</view>
<view>{{msgList[0].msg}}</view>

<!-- 动态绑定图片地址 -->
<image src="{{imgSrc}}"></image>

<!-- 三元表达式 -->
<view>{{ randomNum >= 5 ? randomNum * 100 : 'little than 5' }}</view>
事件绑定
  1. 常用事件:
类型绑定方式事件描述
tapbindtap 或 bind:tap类似于click,手指触摸后马上离开
inputbindinput 或 bind:input文本框输入事件
changebindchange 或 bind:change状态改变时触发
  1. 事件对象的属性列表:
属性类型说明
typeString事件类型
timeStampInteger页面打开到触发事件所经过的毫秒数
targetObject触发事件的组件的一些属性值集合
currentTargetObject当前组件的一些属性值集合
detailObject额外的信息
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchedArray触摸事件,当前变化的触摸点信息的数组
  1. 事件绑定用例以及改变data中的值:
// .js文件中
Page({
  // 数据
  data:{
    count:0,
  },

  // 按钮的处理函数
  btnTapHander(e){
    // e.currentTarget是绑定了相关事件的触发对象
    console.log(e.currentTarget);
    // dataset是一个对象, 包含了所有通过data-*传递过来的参数项
    console.log(e.target.dataset.info)
    // 修改data中数据的值
    this.setData({
      count:this.data.count + e.target.dataset.info
    })
  }

  // input的处理函数
  iptHander(e){
    // input中的值可以在e.detail.value中获取
    console.log(e.detail.value)
  }
})
<!-- .wxml文件中 -->

<!-- 通过data-*来传递参数 此处的参数名为info 参数值为2-->
<button bindtap="btnTapHander" data-info="{{2}}">按钮</button>

<!-- value是输入框中的值 -->
<input value="{{msg}}" bindinput="iptHander"></input>
条件渲染
  1. 具体用例:
<!-- if判断 -->
<view wx:if="{{ type === 1}}"> 男 </view>
<!-- else if 判断 -->
<view wx:elif="{{ type === 2 }}"> 女 </view>
<!-- else 条件 -->
<view wx:else> 不明 </view>

<!-- block不是一个组件,不会在页面中作任何渲染 -->
<block wx:if="{{true}}">
  <view>1</view>
  <view>2</view>
  <view>3</view>
</block>

<!-- hidden是控制元素的显示与隐藏 条件渲染是控制元素的渲染与移除 -->
<view hidden="{{ condition }}">显示隐藏</view>
列表渲染
  1. 索引的默认名是index
  2. 项的默认名是item
  3. 每一项的key值最好要有,可以提升渲染效率
  4. 具体用例:
<!-- .wxml文件中 -->
<!-- wx:for 控制列表渲染 wx:for-index 指定索引名 wx:for-item 指定项名 wx:key 指定id-->
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName" wx:key="id">
  索引是:{{idx}} 项中的内容是:{{itemName.name}}
</view>
// .js文件中
Page({
  data:{
    array:[
      { id: 1, name: 'red' },
      { id: 2, name: 'green' },
      { id: 3, name: 'blue' },
    ]
  }
})

WXSS模板样式

rpx
  1. rpx把所有设备的屏幕,在宽度上等分为750份
import
  1. wxss支持样式导入
  2. 具体用例:
/* @import后面跟相对路径 */
@import "common.wxss";

全局配置

常用配置项
  1. pages
  2. window
  3. tabBar:设置小程序底部的tabBar效果
  4. style
window
  1. 常用配置:
属性名类型默认值说明
navigationBarTitleTextString字符串导航栏标题文字内容
navigationBarBackgroundColorHexColor#000000导航栏背景颜色
navigationBarTextStyleStringwhite导航栏标题颜色,仅支持black/white
backgroundColorHexColor#ffffff窗口的背景色
backgroundTextStyleStringdark下拉loading的样式,仅支持dark/light
enablePullDownRefreshBooleanfalse是否全局开启下拉刷新
onReachBottomDistanceNumber50页面上拉触底事件触发时距页面底部距离,单位为px
tabBar
  1. 通常分为底部tabBar和顶部tabBar
  2. tabBar中只能配置最少2个,最多5个tab页签
  3. 当渲染顶部tabBar是,不显示icon,只显示文本
  4. tabBar节点的配置项:
属性类型必填默认值描述
positionString否bottomtabBar的位置,black/white
borderStyleString否blacktabBar上边框颜色,black/white
colorHexColor否tab上文字的默认颜色
selectedColorHexColor否tab上文字的选中颜色
backgroundColorHexColor否tabBar的背景色
listArray是tab页签的列表,最少2个,最多5个
  1. 每个tab项的配置选项
属性类型必填描述
pagePathString是页面路径
textString是tab上显示的文字
iconPathString否未选中时的路径
selectedIconPathString否选中时的路径
  1. 具体用例:
// app.json中
{
  "pages": [
    // 在tabBar中有对应路径的路径要放在前面
    "pages/index/index",
    "pages/logs/logs",
    "pages/test/index"
  ],
  "tabBar":{
    "list":[{
      // 页面的路径在pages中必须有
      "pagePath":"pages/index/index",
      "text":"首页",
      "iconPath":"/images/tabs/home.png",
      "selectedIconPath":"/images/tabs/home-active.png"
    },{
      "pagePath":"pages/logs/logs",
      "text":"日志",
      "iconPath":"/images/tabs/log.png",
      "selectedIconPath":"/images/tabs/log-active.png"
    },{
      "pagePath":"pages/test/index",
      "text":"测试",
      "iconPath":"/images/tabs/test.png",
      "selectedIconPath":"/images/tabs/test-active.png"
    }]
  }
  // ...省略了window、style、sitemapLocation
}

页面配置

  1. 配置项跟全局配置的是一样的

网络数据请求

  1. 处于安全性方面的考虑,小程序对数据接口的请求做出了如下两个限制:
    1. 只能请求HTTPS类型的接口
    2. 必须将接口的域名添加到信任列表中
    3. 但是在开发的时候可以申请暂停以上两个限制
  2. 配置request合法域名
    1. 在小程序管理后台中进行request合法域名的配置
    2. 域名只支持https协议
    3. 域名不能使用IP地址或localhost
    4. 域名必须经过ICP备案
    5. 服务器域名一个月内最多可申请5次修改
  3. 发送请求
wx.request({
  // 请求的接口地址
  url: 'https://www.escook.cn/api/get',
  // 请求方式 GET POST ...
  method: 'GET',
  data:{
    name: 'xiaoming',
    age: 22
  },
  // 请求成功的回调函数
  success: (res) => {
    console.log(res)
  }
})
  1. 在页面刚加载时请求数据
// .js文件中 生命周期函数--监听页面加载
onLoad: function(options) {
  // getSwiperList 和 getGridList是事先定义好的请求函数
  this.getSwiperList()
  this.getGridList()
},
  1. 跳过request合法域名校验(仅限开发与调试阶段)

    1. 可以临时开启[开发环境不校验请求域名、TLS版本及HTTPS证书]选项,跳过request合法域名的校验
  2. 因为微信小程序的宿主是微信,所以没有跨域问题,且称“Ajax”为“网络数据请求”。

视图与逻辑

页面导航

声明式导航
  1. 通过点击导航组件进行导航
  2. 导航到tabBar页面:url指定页面地址(以/开头),**open-type=“switchTab”**表示跳转方式,不可省略
<navigator url="/pages/message/message" open-type="switchTab">导航到消息页面</navigator>
  1. 导航到非tabBar页面:url指定页面地址(以/开头),**open-type=“navigate”**表示跳转方式,可省略
<navigator url="/pages/info/info" open-type="navigate">导航到info页面</navigator>
  1. 后退导航,open-type=“navigateBack”,delta=“<数字>”,默认后退一层
<navigator open-type="navigateBack" delta="2">返回两页</navigator>
  1. 传递参数:url后面可以携带参数,方式是:?分隔参数与路径,键值用=相连,不同参数用&分隔
<navigator url="/pages/info/info?name=kkt&age=20" open-type="navigate">导航到info页面</navigator>
编程式导航
  1. 导航到tabBar页面:调用wx.switchTab(Obiect object)方法即可,Object参数对象如下:
属性类型是否必选说明
urlstring是跳转路径
successfunction否成功回调
failfunction否失败回调
completefunction否结束回调
// 页面结构
<button bindtap="gotoMeaasge">跳转到消息页面</button>

// 编程式导航
gotoMeaasge() {
  wx.switchTab({
    url:'pages/message/message'
  })
}
  1. 导航到非tabBar页面:调用wx.navigateTo(Object object)方法即可,Object参数对象如下:
属性类型是否必选说明
urlstring是跳转路径
successfunction否成功回调
failfunction否失败回调
completefunction否结束回调
// 页面结构
<button bindtap="gotoInfo">跳转到info页面</button>

// 编程式导航
gotoInfo() {
  wx.navigateTo({
    url:'pages/info/info'
  })
}
  1. 后退导航:调用wx.navigateBack(Object object)方法即可,Object参数对象如下:
属性类型是否必选说明
deltanumber否(默认值为1)返回的页数,若delta大于现有的页数,则返回到首页
successfunction否成功回调
failfunction否失败回调
completefunction否结束回调
// 页面结构
<button bindtap="gotoBack">后退</button>

// 编程式导航
gotoBack() {
  wx.navigateBack()
}
  1. 传递参数:url后面可以携带参数,方式是:?分隔参数与路径,键值用=相连,不同参数用&分隔
// 页面结构
<button bindtap="gotoInfo">跳转到info页面</button>

// 编程式导航
gotoInfo() {
  wx.navigateTo({
    url:'pages/info/info?name=kkt&age=20'
  })
}
获取参数
  1. 在onLoad中接受导航参数
/**
* 生命周期函数--监听页面函数
*/
onLoad:function(option) {
  // option就是传递过来的参数
}

页面事件

下拉刷新
  1. 下拉刷新的开启方式与样式可以看前面的
  2. 监听页面的下拉刷新事件:在页面的.js文件中,onPullDownRefresh()函数用于监听下拉刷新
  3. 停止下拉刷新:下拉刷新的效果得主动停止,否则不会主动停止的,调用wx.stopPullDownRefresh()即可手动停止
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function(){
  // TO DO
  // 处理完事件后 手动停止下拉刷新
  wx.stopPullDownRefresh();
}
上拉触底事件
  1. 在页面的.js文件中,通过onReachBottom()函数即可监听当前页面的上拉触底事件
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function(){
  // TO DO 因为不断上拉就会不断触发 建议在增加节流操作
}
  1. 配置上拉触底距离:
    1. 上拉触底距离指的是触发上拉触底事件时,滚动条距离页面底部的距离;
    2. 可以在全集或页面的.json配置文件中,通过onReachBottomDistance属性来配置
    3. 默认是50px
  2. 添加loading提示效果:
    1. wx.showLoading({title: ‘数据加载中…’}) 此方法开启loading提示效果,title是提示文本
    2. wx.hideLoading() 隐藏提示效果
  3. 节流处理

生命周期

  1. 应用生命周期函数:需要在app.js中声明
// app.js文件
App({
  // 小程序初始化完成时,实行此函数,全局只触发一次,可以完成一些初始化的工作
  onLaunch: function(options){},
  //小程序启动,或从后台进入前台显示时触发
  onShow: function(options){},
  // 小程序从前台进入后台时触发
  onHide: function(){}
})
  1. 页面的生命周期函数:需要在页面的.js文件中进行声明
// 页面.js文件
Page({
  onLoad: function(options){}, // 监听页面加载,一个页面只调用1次
  onShow: function( ){}, // 监听页面显示
  onReady: function(){}, // 监听页面初次渲染完成,一个页面只调用1次
  onHide: function(){}, // 监听页面隐藏
  onUnload: function(){} // 监听页面卸载,一个页面只调用1次
})

WXS脚本

概念与应用场景

WXS(WeiXin Script)是小程序独有的一套脚本语言。因为wxml中无法调用在页面的.js中定义的函数,且wxml中可以调用wxs中定义的函数,所以wxs的典型应用场景是“过滤器”

语法

wxs类似于JavaScript,但是有以下几个不同之处:

  1. wxs的数据类型:number(数值)、strig(字符串)、boolean(布尔类型)、object(对象类型)、function(函数类型)、array(数组类型)、date(日期类型)、regexp(正则)
  2. wxs不支持ES6以上的语法形式:不支持let、const、解构赋值、展开运算符、箭头函数、对象属性简写…
  3. 遵循CommomJs规范:module对象、require()函数、module.exports对象
使用方法(有点类似于nodejs,用来写工具)
  1. 使用方法类似于
<view>{{m1.toUpper(username)}}</view>

<wxs module="m1">
    // 将文本转换为大写形式
    module.exports.toUpper = function(str){
  		return str.toUpperCase()
		}
</wxs>
// 定义wxs脚本
// tool.wxs文件
function toLower(str){
  return str.toLowerCase()
}

module.exports = {
  toLower: toLower
}

// 使用外联的wxs脚本
// .wxml文件
<view>{{m2.toLower(country)}}</view>

// 使用module来指定模块名称 src来指定引入的脚本
<wxs src="../../utils/tools.wxs" module="m2"></wxs>
注意事项
  1. wxs不能调用js中定义的函数
  2. wxs不能调用小程序提供的api

自定义组件

创建&使用

  1. 在任意一个文件夹上右键就会看到“新建Component”这个选项,点击就会在该文件夹下面自动生成指定名称的.wxml、.wxss、.js、.json文件
  2. 局部引用&&全局引用:区别仅在于在哪里引入组件,在app.json中引入的是全局组件,在页面的.json问价中引入的是局部引用
// 在页面的.json文件中 或者 在app.json文件中 引入组件
{
  "usingComponents":{
    "test": "/components/test/test" // "组件名": "路径"
  }
}
 
// 在页面的.wxml文件中 使用组件
<test></test>
  1. 注意事项:组件的事件处理函数需要定义到methods结点中(methods是在组件文件夹下面的.js文件中的),自定义方法建议以“_”开头

样式隔离

  1. 默认情况下class选择器会有样式隔离效果,组件内外互不干扰(id选择器、属性选择器、标签选择器没有)
  2. 隔离效果可以人工干预,通过修改组件的.js文件或者.json文件中的styleIsolation
  3. styleIsolation的可选值
可选值默认值描述
isolated是启用样式隔离,class指定的样式不会相互影响
apply-shared否页面wxss的class样式可以影响到自定义组件
shared否页面wxss的class样式影响到自定义组件,自定义组件的wxss的class样式也会影响到页面或者其他不是isolated的自定义组件
// 组件的.js文件中
Component({
  options: {
    styleIsolation: 'isolated',
  }
})

// 组件的.json文件中
{
  "styleIsolation": "isolated",
}

properties属性

  1. 用来接收外界传递到组件中的数据(父传子)
  2. 但是properties跟data是本质上相同的,且都是可读可写的,用全等符号来他们都是一样的

数据监听器

  1. 作用:监听和相应任何属性和数据字段的变化,从而执行特定的操作
  2. 基本用法:
// 组件的.js文件中 
// 监听什么字段就是什么 如果监听的是属性则形式如下:对象.属性 如果监听的是变量则:变量
// 如果想监听对象的所有属性则:对象.**
Component({
  observer: {
    '字段A, 字段B': function(字段A的新值,字段B的新值){
      //DO SOMETHING
    }
  }
})

纯数据字段

  1. 不用于界面渲染的data字段
  2. 适用对象:那些既不会展示在界面上,又不会传递给其他组件的数据适合被设置为纯数据字段
  3. 好处:有助于提升页面更新性能
  4. 使用规则:
// 组件的.js文件中
Component({
  options: {
    // 指定所有 _开头的数据字段为纯数据字段 这个是自己用正则表达式配置的规则
    pureDataPattern: /^_/
  },
  datd: {
    a: true, //普通数据字段
    _a: true, // 纯数据字段
  }
})

组件的生命周期

组件的生命周期函数
  1. created(组件实例刚刚被创建):还不能调用setData
  2. attached(组件实例进入页面节点树):this.data已被初始化完毕
  3. ready(组件在视图层布局完成)
  4. moved(组件实例被移动到节点树的另一个位置)
  5. detached(组件实例被从页面节点树移除):适合做一些清理操作
  6. error(组件方法抛出错误)
生命周期函数定义在哪里
  1. 生命周期函数可以在组件的.js文件中的lifetimes字段内进行声明
  2. 组件所在页面的生命周期函数,需要定义在pageLifetimes节点中
  3. 什么是组件所在页面的生命周期:自定义组件的行为依赖于页面状态的变化时,就需要用到组件所在页面的生命周期函数
生命周期函数参数描述
show无组件所在的页面被展示时执行
hide无组件所在的页面被隐藏时执行
resizeObject Size组件所在的页面尺寸变化时执行
Component({
  Lifetimes: {
    attacthed() {},
    detached() {},
  },
  pageLifetimes: {
    show: function() {},
    hide: function() {},
    resize: function() {},
  }
})

插槽

  1. 插槽用于承载组件使用者提供的wxml结构。默认为单个插槽,可以开启多个插槽。
  2. 单个插槽:
<!-- 组件封装者 -->
<view>
  <view>组件内部</view>
<!--   用slot节点进行占位 在组件内部放哪儿都行 -->
  <slot></slot>
</view>

<!-- 组件的使用者 以下就是上面那个封装好的组件的使用-->
<component-tag-name>
  <view>这一部分内容将会被放到组件内部的slot节点中</view>
</component-tag-name>
  1. 多个插槽:
// 组件的.js文件中
Component({
  options: {
    multipleSlots: true // 开启多个插槽
  },
})
<!-- 组件封装者 -->
<view>
  <view>组件内部</view>
  <!--   用slot节点进行占位 在组件内部放哪儿都行 多个插槽需要使用name进行命名 -->
  <slot name="before"></slot>
  <slot name="after"></slot>
</view>

<!-- 组件的使用者 以下就是上面那个封装好的组件的使用 需要确定插到name为什么的槽中-->
<component-tag-name>
  <view slot="after">这一部分内容将会被放到name为after的slot节点中</view>
  <view slot="before">这一部分内容将会被放到name为before的slot节点中</view>
</component-tag-name>

父子组件间通信

属性绑定
  1. 父向子传递“JSON兼容”的数据,传不了方法
// 父组件的.js文件
data: {
  count: 0
}

// 父组件的wxml文件
<test count="{{count}}"></test>

// 子组件的.js文件
proprtties: {
  count: Number
}

// 子组件的.wxml文件
<text>{{count}}</text>
事件绑定
  1. 子向父传递任意数据
  2. 实现步骤如下:
    1. 在父组件的.js文件中,定义一个函数,这个函数将传递给子组件
    2. 在父组件的wxml中,通过自定义事件的形式,进行函数传递
    3. 在子组件的.js文件中,通过调用this.triggerEvent(‘自定义事件名称’,{/参数对象/}),将数据发送到父组件
    4. 在父组件的.js文件中,通过e.deatil获取子组件传递过来的数据
// 在父组件的.js文件中定义一个函数 通过e.detail来进行接收
syncCount(e) {
  console.log(e.detail);
}

// 在父组件的wxml中使用如下结构传递函数 bind:自定义事件名称="要传递的函数名称"
<test count="{{count}}" bind:sync="syncCount"></test>

// 在子组件的.js文件中,通过this.triggerEvent('自定义事件',{/*参数对象*/})来发送数据至父组件
method: {
  addCount() {
    this.triggerEvent('sync',{value: this.properties.count})
  }
}
获取组件实例
  1. 父通过this.selectComponent(‘id或class选择器’)获取子组件实例对象,从而访问子组件的任意数据和方法
// wxml文件中
<test class="custom"></test>

// js文件中
const child = this,selectComponent('.custom');
console.log(child);

behavior

  1. 本质是代码的封装共享
  2. 每个behavior可以包含一组属性、数据、生命周期函数和方法
  3. 创建behavior,调用Behavior(Object object)方法即可, module.exports将behavior共享出去
  4. 导入并使用:使用require导入,挂载后即可生效
  5. 同名字段的覆盖和组合规则:参考官网
// 单独的js文件中 例:behaviors文件夹下的my-behavior.js文件
module.exports = Behavior({
  properties: {},
  data: {},
  methods :{},
})

// 某组件的js文件中
const myBehavior = require("../../behaviors/my-behavior");

Component({
  // 挂载
  behaviors: [myBehavior],
  // ...
})

Vant Weapp

  1. 具体用法参考官网,不难,但是要小心

全局数据共享

  1. 也叫状态管理,为了解决组件之间的数据共享问题
  2. mobx官方地址在这里:https://github.com/wechat-miniprogram/mobx-miniprogram-bindings,引入mobx包什么的看文档就好了
// store文件夹下的store.js文件中 
import { observable, action } from 'mobx-miniprogram'

export const atore = observable({
  // 数据字段
  numA: 1,
  numB: 2,
  // 计算属性 形式:get 函数名
  get Sum() {
    return this.numA + this.numB
  },
  // actions方法 store中的数据仅能用action方法来进行修改 形式:函数名 action(fun)
  updateNum1: action(function(step) {
    this.numA += step
  }),
  updateNum2: action(function(step) {
    this.numB += step
  }),
})

// 页面的wxml结构 wxml结构中数据的获取使用改变参考前面的就好 一样的
// 因为是状态管理 所以变量都是实时更新的
// 某页面的js文件
import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'

Page({
  onLoad: function() {
    // 固定用法 field里面放数据 actions里面放方法
    // 这样做了之后 数据跟方法都已经是引出来了 可以直接在wxml文件中使用
    this.storeBindings = createStoreBindings(this, {
      // 数据源
      store,
      // 计算属性 字段
      fields: ['numA', 'numB', 'sum'],
      // 方法
      actions: ['updateNum1']
    })
  },
  onUnload:function() {
    // 页面卸载时销毁storeBindings
    this.storeBindings.destroyStoreBindings()
  }
})
// 某组件的js文件 
import { storeBindingsBehavior } from "mobx-miniprogram-bindings";
import { store } from "./store";

Component({
  // 在组件里面是要用behaviors的
  behaviors: [storeBindingsBehavior],
  storeBindings: {
    // 数据源
    store,
    // 数据字段 计算属性 左边是自己定义的名字 右边是引用store中的数据 方式有三种 都行的
    fields: {
      numA: () => store.numA,
      numB: (store) => store.numB,
      sum: "sum",
    },
    // action方法 左边是自己定义的名字 右边是store中的方法 这样之后就是指向同一个方法了
    actions: {
      buttonTap: "update",
    },
  },
});

分包

  1. 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需加载
  2. 优点:优化小程序首次启动的下载时间,在多团队开发时可以更好地解耦操作
  3. 分包后项目构成:1个主包+多个分包
    1. 主包:包含项目启动页面和TabBar页面,以及公共资源
    2. 分包:有关页面、私有资源
  4. 分包体积限制:
    1. 整个小程序不超过16M
    2. 单个包不能超过2M
// app.json文件中
{
  "pages":[
    "pages/index",
    "pages/logs"
  ],
  // 这一项是配置分包的
  "subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ]
    }
  ]
}
微信小程序项目实训--慕尚花坊学习笔记 爱礼精选</view><view class="left-view-item">鲜花玫瑰</view><view class="left-view-item">永生玫瑰</view><view class="left-view-item">玫瑰珠宝 阅读详情

相关推荐

本地数据缓存——微信小程序学习笔记

方式:以键值对(key, data)的形式存储数据,可以使用(异步)、(同步)方法进行数据存储,使用(异步)、(同步)方法进行数据获取。限制:单个key允许存储的最大数据长度为1MB,所有数据存储空间最大为10MB(以微信官方最新文档为准),如果超过了10M再往缓存里面写入,就会触发 fail 的回调。隔离策略:storage以用户维度隔离,同一台设备上,A用户无法读取到B用户的数据;不同小程序之间也无法互相读写数据。使用场景。

xiaopei_yan的博客 1679

微信小程序行间mode=“widthFix“ 的意思

官方文档中比如图片行间加 mode="widthFix" 代表宽度不变,高度自动变化,保持原图宽高比不变,即设置图片宽度而高度自适应。(若图片加载出现闪烁,可给图片加height:auto)

Q196825的博客 3976

超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目

超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 1233

微信小程序-图片宽高自适应设置

微信小程序中,有很做组件都是有默认宽高的,比如,image组件默认宽度320px、⾼度240px,这些默认设置常常会对我们的页面布局造成影响 <!-- mode="widthFix" 让图片占满宽度,等比例缩放高度 --> <image src="xxxx" mode="widthFix"></image> 所以,在使用image标签的时候,最常用的方法就是设置其 mode,例如用widthFix,...

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1万+

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 337

Android T GPS 定位流程

Gps 定位

好记性不如烂笔头 1355

在小程序中说说你对image标签属性mode=‘widthFix‘的理解

时,图片的宽度会拉伸或压缩至完全填充容器的宽度,而高度则会根据图片的原始宽高比进行等比例缩放。这意味着图片在水平方向上会完全铺满容器,但在垂直方向上可能会留出空白(如果图片的原始高度小于按比例缩放后的高度)或者部分图片内容可能会被裁剪(如果图片的原始高度大于按比例缩放后的高度)。这种模式在某些场景下非常有用,比如当你想要确保图片在水平方向上完全填充一个固定宽度的容器,而不关心图片在垂直方向上的完整性时。时,图片的宽度会被压缩至 300px,高度则会等比例缩放至 200px,以保持图片的宽高比。

王铁柱666的博客 1795

S32K3双核实战:手把手教你用EB配置CAN与CANFD(附中断/轮询代码对比)

本文详细解析了NXP S32K3双核处理器在CAN/CANFD通信开发中的实战应用。通过Elektrobit配置工具链,从双核通信架构设计到EB tresos Studio配置全流程,再到中断与轮询模式的代码实现对比,全面指导开发者优化S32K3 FlexCAN模块性能,提升汽车电子系统的通信效率与可靠性。

weixin_30955617的博客 440

微信小程序image组件的mode总结+介绍(包含heightFix)

2.10.3版本后,微信小程序的图片即image组件新增了heightFix属性(mode),总共具有14种属性,满足各种情况的放置需要。14种属性可以分为两大类,一种是完全保留的缩放属性,一种是裁剪属性。

weixin_42017221的博客 4680

我花3年踩坑总结的C#上位机开发指南:从零基础到项目落地(附实战案例)

串口乱码:编码格式不匹配,一定要和设备端确认;PLC连接超时:检查IP地址和端口,确保上位机和PLC在同一网段;界面卡死:耗时操作没开线程,WinForm用BackgroundWorker,WPF用Task;数据解析错误:寄存器地址算错(Modbus地址从0还是1开始);Modbus数据丢包:加CRC校验,重要数据重发机制;WPF绑定不生效:忘记实现INotifyPropertyChanged;项目打包失败:缺少依赖DLL,用Dependency Walker检查;现场环境不兼容。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1843

解决OpenCASCADE性能瓶颈:显示加速与三角剖分优化全攻略

本文深入探讨OpenCASCADE在工业设计和CAD建模中的性能优化策略,重点解决显示加速与三角剖分等核心瓶颈问题。通过智能刷新控制、显示数据结构优化和动态LOD技术,显著提升渲染效率和交互体验,适用于复杂场景下的三维可视化应用。

weixin_30752699的博客 344

微信小程序,图片mode属性详解

微信小程序,图片mode属性详解

Jooan的博客 4143

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

《微信小程序开发实战》学习笔记chapter1微信小程序人门

《微信小程序开发实战》黑马程序员版本的学习笔记分享。 chapter1微信小程序人门

Linn908的博客 1568

航空机载总线网络概述

1.机载总线网络概述 现代战斗机的航空电子系统是航空电子技术经历了半个多世纪的漫长演变和不断进步的结果。航空电子系统结构的每次变化,其核心的机载总线网络技术也不断跨上新台阶,而且每次变革都能使飞机性能得到大幅提升。现代飞机的飞行与作战任务包括起飞、巡航、飞行控制、目标搜索、识别跟踪、火控计算、武器投射、制导、电子战、通信等,都需要航空电子系统承担,航空电子系统是现代战斗机的“大脑”和“神经中枢”,机载总线网络则是其关键的“神经网络”。在机载通讯领域发展过程中,具有代表性的典型总线有ARINC429、1553

qq_41854911的博客 1万+

UMI——斯坦福刷盘机器人:通过手持夹爪革新数据收集方式,且使用视觉SLAM和Diffusion Policy预测动作

没想到今年年初的斯坦福mobilealoha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)斯坦福UMI刷盘机器人其与mobile aloha(以及AirExo: Low-Cost Exoskeletons for Learning Whole-Arm Manipulation in the Wild)最大的不同在于其收集数据处理的非真实的机器人,而是一个手持夹持器(从而大幅降低成本)

u013250861的博客 1357

微信小程序学习笔记2

微信小程序学习笔记2

2301_76295468的博客 1043

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

学习笔记:微信小程序

view ≈ divscroll-view 上下滚动图swiper 横向轮播图。

Zhihing的博客 907

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

微信小程序学习笔记3

微信小程序学习笔记3

2301_76295468的博客 741

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

微信小程序开发学习笔记

微信小程序是一种无需下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。 小程序由WXML(微信小程序的标记语言)、WXSS(微信小程序的样式表)、JavaScript(逻辑层)以及JSON(配置文件)组成。

2303_81251774的博客 1652

微信小程序学习笔记4

微信小程序学习笔记4

2301_76295468的博客 809

【学习笔记】微信小程序STEP1

1. 如何创建小程序项目;2. 小程序项目的基本组成结构;3. 小程序页面的组成部分;4. 小程序的组件使用;5. 小程序的协同开发和发布。

qq_60611558的博客 283

微信小程序开发学习笔记《13》WXS脚本

WXS ( WeiXin Script)是小程序独有的一套脚本语言,结合WXML,可以构建出页面的结构。wxml中无法调用在页面的.js 中定义的函数,但是,wxml中可以调用wxs 中定义的函数。这个就像过滤器,在WXML页面数据渲染时按照wxs的脚本渲染。在WXML文件中使用内嵌WXS脚本在WXML文件中导入外部WXS文件。

tutgxu的博客 1373

【学习笔记】微信小程序开发手册

一、小程序代码组成 1、工程目录 ├── pages //页面目录 │ │── index //页面index │ │ ├── index.wxml //页面HTML │ │ ├── index.js //页面脚本 │ │ ├── index.json //页面配置(可选) │ │ └── index.wxss //页面CSS(可选) │ └── logs //页面logs │ ├── logs.wxml │ └── logs.j

shawxlee的优快云博客 1908
上一篇: antd表单实现用户上传文件
下一篇: SharedArrayBuffer
Taoika
博客等级 码龄5年 186粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值