微信小程序
生命周期
https://blog.csdn.net/weixin_43352901/article/details/108036086
| onLoad | 监听页面加载 |
|---|---|
| onReady | 监听页面初次渲染完成 |
| onShow | 监听页面显示 |
| onHide | 监听页面隐藏 |
| onUnload | 监听页面卸载 |
| onPullDownRefresh | 监听用户下拉动作 |
| onReachBottom | 页面上拉触底事件的处理函数 |
| onShareAppMessage | 用户点击右上角分享 |
遍历
//wx:for-item="newName" 可以把默认的item变为设置的newName,不设置默认item
<view wx:for="{{list}}" wx:key="index">>
{{item.title}}
</view>data数据获取与更改
this.data.xxx // 获取
this.setData({
xxx:xxx
}) // 更改点击事件
bind+事件: 冒泡
catch+事件: 不冒泡
pages与components 函数的写法
页面.js 方法放在data同级
组件.js 方法放在methods:{}里面第三方框架
| 腾讯 | wepy | 类vue |
|---|---|---|
| 美团 | mpvue | 类vue |
| 京东 | taro | 类react |
| 滴滴 | chameleon | |
| uni-app | 类vue |
通用公式
750rpx 乘上 (设计稿px与设计稿宽度px)的比值
不能直接复制给width, 需要通过calc计算
calc(750rpx * 100 /page px)vscode插件
使用less转wxss
easy less插件, 设置里面添加
"less.compile":{
"outExt": ".wxss"
}wxss定义变量与使用变量
声明
--themeColor: #bfa
--xx
引用
var(--themeColor)
var(--xx)插件使用
wxparse
1、https://github.com/icindy/wxParse
2、下载这个demo
3、把demo里面的wxParse目录 拷贝到我们的项目里面
4.1、在要用到的页面的js里面引入 wxParse下面的js(page前面引入)
var WxParse = require('../../wxParse/wxParse.js');
4.2、在要用到的方法里或者成功回调里使用
var article = '<div>我是HTML代码</div>';
var that = this;
WxParse.wxParse('article', 'html', article, that, 5);
// WxParse.wxParse(bindName , type, data, target,imagePadding)
// 1.bindName绑定的数据名(必填)
// 2.type可以为html或者md(必填)
// 3.data为传入的具体数据(必填)
// 4.target为Page对象,一般为this(必填)
// 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选)5、可以在app.wxss引入 wxParse.wxss(第一行写就行)
@import "wxParse/wxParse.wxss";6、模板 wxml引入下面代码
<import src="你的路径/wxParse/wxParse.wxml"/>
<template is="wxParse" data="{{wxParseData:article.nodes}}"/>j
自定义组件-传值
1 新建components文件夹
2 在components文件夹下面创建一个组件"Tabs"文件夹,然后点击右键创建component
3 .json里注册组件:
{"usingComponents": {"Tabs": "../../components/Tabs/Tabs"}}
4 .wxml使用组件
<Tabs myValue="233"/>
自定义组件里设置类型和默认值
properties:{
myValue:{
type:number,
value:666
}}
自定义组件里引用
<navigator url="{{myValue}}">{{myValue}}传值
标签传值 (父==>子)
父组件:
引用的子组件标签 里直接写 xxx="xxx"
子组件:
properties 里面接收
properties: {
//方法一:
xxx: {
type: String,
value: '', // 属性初始值(可选)、、
// 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'
observer: function(newVal, oldVal){}
}
// 方法二:简化的定义方式
myProperty2: String
}事件传值 (子==>父)
父:相当于vue的@事件,bind === @
<component-tag-name bindchildFn="fatherFn" />
<!-- 或者可以写成 -->
<component-tag-name bind:childFn="fatherFn" />
子:相当于vue的this.$emit()
this.triggerEvent('childFn', myEventDetail, myEventOption)
//父.js
fatherFn: function(e){
e.detail // 自定义组件触发事件时提供的detail对象
}父组件调用子组件的方法
1、调用子组件的时候定义一个id,vue就是定义一个ref
<header id="header"></header>
2、父组件获取子组件的实例 (类似于选择器)
var header = this.selectComponent("#header")
3、header.方法名 --> 调用子组件里面的方法
header.data.msg父组件里面直接获取子组件的数据路由路径传值: /?xxx=xxx
在目的页面.js
onLoad: function (options) { console.log(options) },data-传值
<:xxx="xxx">
获取
e.currentTarget.dataset.xxx传值总结
bind+事件名(平头写法)="事件名(驼峰)" bind传值可 e.detail 获取
#使用组件传值
例子:传index
//父给子传一个tabs数据
<Tabs tabs="{{tabs}}">
//父.js: tabs: [],
//子.js: 通过this.triggerEvent调用父方法,把index交给他
this.triggerEvent('tabsItemChange', { index })
//父.js : 父通通过bind:上面那个方法,通过e.detail接收
<Tabs tabs="{{tabs}}" bind:tabsItemChange="onTabsItemChange">
onTabsItemChange(e) { const { index } = e.detail }与vue区别
设置data
vue 直接 this.xxx = 就行
小程序通过 this.setData({ })设置
--可能因为--vue是data(){return{xxx}}的方式设置参数, 小程序是data:{ xxx : xxx}设置的
但小程序函数里使用data数据是通过this.data.xxx调用
点击事件
| 小程序 | vue | |
|---|---|---|
| 点击事件 | bindtap="fun" | @click="fun(a, b)" |
| 改变事件 | bindchange='fun' | @change |
| = 'fun' |
小程序不支持传参, 传参得在后面写data-自定义名字=""
函数里面通过 e.currentTarget.dataset 获取
一些坑
scroll-y滚动失效
page 设为 height:100%
支持ES7 async
https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js
将代码复制到 新建 lib/runtime/runtime.js 最后加上, 有的话不用加
module.exports = runtime;
再在需要引入的页面.js 引入(不能全局引入)
import regeneratorRuntime from "../../lib/runtime/runtime";封装wx.request
//例子
export const request = params => {
wx.showLoading({
title: '加载中'
})
const baseURl = "https://api.zbztb.cn/api/public/v1/"
return new Promise((reslove, reject) => {
wx.request({
...params,
url: baseURl + params.url,
success: res => {reslove(res)},
fail: err => {reject(err)},
complete: () => {wx.hideLoading()}
})
})
}常用事件
触底事件:
onReachBottom: function () {}
下拉刷新: 页面.json
"enablePullDownRefresh": true,
"backgroundTextStyle": "dark"
js里面--
onPullDownRefresh:function(){ }
关闭下拉刷新窗口----
wx.stopPullDownRefresh();购物车相关代码
加入购物车
wx.getStorageSync
wx.setStorageSync
// 1 读取缓存 --数组
let cart = wx.getStorageSync('cart') || [];
// 2 查找索引,收否有该id商品
let index = cart.findIndex(v => v.goods_id === this.data.goodsObj.goods_id)
if (index === -1) { // 如果不存在索引
this.data.goodsObj.num = 1 // 则创建num属性
cart.push({ // 更新cart数组
goods_id: this.data.goodsObj.goods_id,
num: this.data.goodsObj.num
})
} else { // 存在
cart[index].num++
}
wx.setStorageSync('cart', cart) // 写入缓存结算判断
获取购物车数据, 遍历判断, 根据check是否选中
// 监听页面显示
onShow: function () {
// 获取地址
let address = wx.getStorageSync('address')
this.setData({ address })
// 更新购物车
let cart = wx.getStorageSync('cart') || []
// 调用
this.setCart(cart)
},封装方法: 设置购物车状态: 总数 总价 勾选
// 设置购物车状态: 总数 总价 勾选
setCart(cart) {
// 选中,总价,总数
let allCheck = true, totalPrice = 0, totalNum = 0
//cart是遍历的数据数组,cart.check有值,true或者false
//every返回布尔值,空数组.every返回true
// const allCheck = cart.length === 0 ? false : cart.every(v => v.check)
// 遍历
cart.forEach(v => {
if (v.check) {
totalPrice += v.num * v.goods_price
totalNum += v.num
} else { allCheck = false }
})
// 优化bug
allCheck = cart.length != 0 ? allCheck : false;
// 提交数据
this.setData({ cart, allCheck, totalPrice, totalNum })
}全选框状态控制
//cart是遍历的数据数组,cart.check有值,true或者false
//every返回布尔值,空数组.every返回true
const allCheck = cart.length === 0 ? false : cart.every(v => v.check)SDK插件
获取用户信息 openid
npm install -S wafer2-client-sdk
安装之后,就可以使用 require 引用 SDK 模块:
var qcloud = require('./node_modules/wafer2-client-sdk/index.js');文档https://github.com/tencentyun/wafer2-client-sdk
⭐微信各种跳转
wx.navigate
| open-type的值 | tabBar页面 | |
|---|---|---|
| navigateTo | ❌ | 保留原页面 |
| redirect | ❌ | 不保留原页面 |
| switchTab | ✔ 只能打开 tabBar 页面 | 关闭所有页面,不能携带参数 |
| reLaunch | ✔ | 关闭所有页面,能携带参数 |
项目问题
小程序使用vant
npm init -y
npm i @vant/weapp -S --production接下来:https://youzan.github.io/vant-weapp/#/quickstart
setData异步问题
数据放page外,也就是全局里吧,没其他好的解决办法
可能是this的原因,打印看看是不是小程序的this
xxxsjan Docs