微信小程序

一、微信小程序

1. 原生开发 用wx小程序 提供的语法开发
2. vue开发 用vue结合框架写小程序 uni-app wepy mpvue
3. react开发 用react结合 taro 框架开发

微信公众平台官网:https://mp.weixin.qq.com/
小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/

二、小程序的目录结构

xxx.json 小程序或者页面配置
xxx.js 写js业务逻辑
xxx.wxml wxhtml 用的是wx内置的组件
xxx.wxss wxcss 微信的样式
小程序都需要一个app实例 (根实例)包含了若干个页面(实例)

app.js 小程序的实例 小程序的入口文件
app.json 小程序的全局配置
app.wxss 小程序的全局样式
pages 小程序里的页面
-home home页面
|
home.js home页面实例
home.json home页面的配置文件
home.wxss home页面的样式
home.wxml home的页面骨架

三、小程序中的样式

app.wxss 全局样式
pageName.wxss 页面的局部样式

1、 样式语法:正常css的语法
2、 全局和局部冲突:就近原则
3、 响应式 rpx 或者 vw/vh
4、 小程序规定 不管什么手机 width 恒定为 750rpx
5、小程序设计稿的尺寸一般为 750*1136

四、小程序的页面骨架(详情见文档)

xxx.wxml 文件
只能使用小程序内置的组件标签

例子:
<view>这是小程序中的块元素相当于div</view>
<text>这里是小程序的行内元素相当于span</text>

五、小程序的配置 (详情见文档)

app.json 全局配置
pageName.json 页面配置
注意:
全局和局部冲突:就近原则

六、小程序逻辑

1. 小程序的生命周期

小程序启动(全局只触发一次)
onLaunch: function () {
console.log('小程序启动')
},

小程序隐藏
onHide: function () {
console.log('小程序进入后台 隐藏')
},

小程序显示
onShow: function (options) {
console.log('小程序进入前台 显示')
},

小程序发生脚本错误
onError: function (msg) {
console.log(msg)
}

2. 页面的生命周期

页面加载
onLoad(){
// 页面重新加载的时候才会触发 tab中切换页面没有销毁 只会触发一次
console.log('页面加载')
},

页面渲染完成
onReady(){
console.log('页面渲染完成之后触发')
},

页面卸载
onUnload(){
// 页面卸载的时候会触发 缓存起来就不会触发
console.log('页面卸载')
},

页面显示
onShow(){
console.log('页面显示')
},

页面隐藏
onHide(){
console.log('页面隐藏')
},

提供的功能函数

onPullDownRefresh(){
console.log('下拉刷新了')
},
onReachBottom(){
console.log('上拉')
}

七、小程序的数据绑定

page({
data:{
name:"韩梅梅",
arr:[1,2,3,4],
obj:{us:123,ps:456},
length:1
}
})
1、页面对象下 data里的数据可以通过{{}} 在视图中进行绑定 {{name}}
2、如果要修改数据 页面实例this.setData({要修改的key:value})
this.setData({name:hehe})

八、事件

小程序的事件是特制事件和原生js不一样 tap longtap ..
函数写在js文件里,标签绑定函数
传参是以data开头的属性进行传参 在事件对象e里进行接受

<button bindtap="处理函数"
data-hehe='123'
data-obj="{{ {us:123,ps:456} }}
data-arr = "{{ [1,2,3,4,5] }}"
></button>

changeName(e){
console.log(e)
let {hehe,xixi} = e.target.dataset
this.setData({name:hehe})
}

函数绑定另一个写法
<button bind:tap="changeName"> 改名</button>

九、小程序中的指令

1、列表渲染 wx:for(需要key)

循环数组
<text wx:for="{{ arr }}">{{index}}:{{item}}</text>
循环对象
<text wx:for ="{{obj}}">{{index}}:{{item}}</text>
更改 item和index的使用名字
<text
wx:for="{{obj}}"
wx:for-index='hehe'
wx:for-item='xixi'
wx:key = 'hehe'
>{{hehe}}{{xixi}}</text>

2、条件渲染 wx:if
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

注意:block标签不渲染

十、小程序中的网络请求

小程序的网络请求 使用的是内置的wx.request的api 使用方式类似于jq的ajax

wx.request({
url: url, 请求路径
data:{},· 请求传参
method:"GET", 请求方法
success:(data)=>{ 成功的回调
console.log('请求成功')
let {banners} = data.data
console.log(banners)
this.setData({imgs:banners})
},
fail(){ 失败的回调
console.log('请求失败')
}
})

发布线上的要求
1. 请求的域名必须是https协议
2. 请求的域名必须在合法域名列表里
3. 小程序没有跨域问题

开发环境下
忽略 https 安全域名的验证(详情-本地设置-不校验...)

网络请求的回调里 经常会找不到this 换成箭头函数就行了

十一、小程序路由

配合button是编程式导航
1、跳转到tab页面

wx.switchTab({
url: '/pages/my/my',
fail(err){
console.log(err)
}
})

2、通过navagator 跳转到非tabbar 页面(有返回)

wx.navigateTo({
url: '/pages/route/route',
})

3、通过redireact 跳转到非tabbar 页面(没有返回)

wx.redirectTo({
url: '/pages/route/route?us=123&ps=123',
})

4、跳转到任何界面

wx.reLaunch({
// url: '/pages/route/route',
url: '/pages/my/my',
})

声明式导航:
<navigator url="/pages/route/route" >声明式导航</navigator>

路由传参(参数写在路径后面)
A、wx.redirectTo({
url: '/pages/route/route?us=123&ps=123',
})

B、<navigator url="/pages/route/route?us=123&ps=123" >声明式导航</navigator>

注意:参数在onLoad生命周期里option接收

十二、地图组件map

<map
id="map"
rotate = '{{rotate}}' 旋转
longitude="{{longitude}}" 经度
latitude="{{latitude}}" 纬度
scale="14" 缩放
style="width: 100vw; height: 50vh;"

controls="{{controls}}" 控件
bindcontroltap="controltap" 点击控件的方法

markers="{{markers}}" 标记
bindmarkertap="markertap" 点击标记的方法

polyline="{{polyline}}" 路线
bindregionchange="regionchange" 视野发生改变触发

show-location 当前定位
></map>

1、控件的配置
data:{
latitude:0,
longitude:0,
rotate:45,
controls:[
{
id: 1,
iconPath: '/common/icon/mobile.png',
position: {
left: 0,
top: 400 ,
width: 40,
height: 40
},
clickable: true
},
// 点击控件
controltap(e){
let {controlId} = e
console.log(e)
if(controlId===1){
this.getLocation()
}
},

2、标记的配置
markers:[{
iconPath: "/common/tabbar/cart.png",
title:"呵呵哒",
id: 0,
latitude: 23.099994,
longitude: 113.324520,
width: 50,
height: 50
},
// 点击markes 事件
markertap(e){
console.log(e)
},

3、路线的配置
polyline: [{
points: [{
longitude: 113.3245211,
latitude: 23.10229
}, {
longitude: 113.324520,
latitude: 23.21229
}],
color:"#FF0000DD",
width: 2,
dottedLine: true
}]
//视野发生改变触发
regionchange(e){
console.log(e)
},

4、一些api

A、获取当前位置
wx.getLocation({
type: 'wgs84',
success:(res)=>{
console.log(res)
let {latitude,longitude} = res
this.setData({latitude,longitude})
},
fail(err){
console.log(err)
}
})

B、跳转到微信地图
wx.openLocation({
latitude: 23.099999,
longitude: 113.324520,
})

C、选择地理位置
wx.chooseLocation({
success(res){
console.log('选择位置',res)
}
})

十三、其他常用api

1、消息提示框

显示
wx.showToast({
title: '成功',
icon: 'success',
duration: 2000 2秒自动关闭
})
关闭
wx.hideToast({
complete: (res) => {},
})

2、加载提示框

显示
wx.showLoading({
title: '加载中',
})
关闭
wx.hideLoading({
complete: (res) => {},
})

3、显示模态对话框

wx.showModal({
title: '提示',
content: '这是一个模态弹窗',
success (res) {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})

4、显示操作菜单

wx.showActionSheet({
itemList: ['A', 'B', 'C'],
success (res) {
console.log(res.tapIndex)
},
fail (res) {
console.log(res.errMsg)
}
})

5、动态设置当前页面的标题

wx.setNavigationBarTitle({
title: '当前页面'
})

6、数据存储

添加
wx.setStorageSync('test', {us:123,ps:456})
查询
wx.getStorageSync('user')
删除一个
wx.removeStorageSync('test')
清空
wx.clearStorageSync()

7、监听网络环境发生改变

wx.onNetworkStatusChange((result) => {
console.log(result)
let {networkType} = result
if(networkType !== 'wifi'){
wx.showModal({
title:`你的网络环境变化${networkType}是否继续`,
success(res){
console.log(res)
}
})
}
})

8、拨打电话

wx.makePhoneCall({
phoneNumber: '110' //仅为示例,并非真实的电话号码
})

9、调起客户端扫码界面进行扫码

wx.scanCode({
success: (res)=> {
console.log(res)
let {result} = res
this.setData({result})
}
})

知识点补充

1、模块可以挂载到app实例上

const config = require('./config/index')
App({
config
})

组件中通过getApp()引入
const {
config
} = getApp()

2、app.json的pages的第一个页面是默认加载的页面

"pages": [
"pages/home/home",
"pages/category/category",
"pages/shopcart/shopcart",
"pages/my/my",
"pages/web/web"
],

3、wx.request需要二次封装

注意:wx默认body上传格式是application/json,有的请求需要的是application/x-www-form-urlencoded

4、公用模板template

a、使用 name 属性,作为模板的名字,里面写代码
<template name='shopCartModal'></template>

b、页面中引入
<import src='/template/addCartModal/addCartModel.wxml' />

c、页面中使用,is和模板name绑定,data给模板传参
<template is='shopCartModal' data="{{ showModal,info,imgServer,range ,pickerValue}}"></template>

d、页面的wxss中引入模板的样式文件
@import '/template/addCartModal/addCartModal.wxss';

5、通过catchtap绑定并阻止事件冒泡

<view id="outer" bindtap="handleTap1">
outer view
<view id="middle" catchtap="handleTap2">
middle view
<view id="inner" bindtap="handleTap3">
inner view
</view>
</view>
</view>
点inner,触发tap3和tap2,因为tap2是catchtap,禁止了事件冒泡,所以不会触发tap1

6、通过web-view跳转页面

a、小程序先跳转一个空白页面
wx.navigateTo({
url: `/pages/web/web?weburl=${weburl}`,
})

b、空白页面 通过web-view 渲染网页
<web-view src='{{weburl}}'></web-view>

学艺不精,未完待续。。。

posted @ 2020-04-14 13:50  ImbaCOOL  阅读(480)  评论(0)    收藏  举报