Skip to content
On this page

微信小程序

生命周期

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

javascript
1https://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引入下面代码

javascript
<import src="你的路径/wxParse/wxParse.wxml"/>
    
<template is="wxParse" data="{{wxParseData:article.nodes}}"/>

j

自定义组件-传值

javascript
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

粤ICP备2024285819号