前端
快捷键
代码规范快捷键:shift+alt+F
导航栏自定义设置
{"pages": ["index/index","index/index2"],"tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "black","backgroundColor": "#ffffff","list": [{"pagePath": "index/index","iconPath": "image/icon_component.png","selectedIconPath": "image/icon_component_HL.png","text": "组件"},{"pagePath": "index/index2","iconPath": "image/icon_API.png","selectedIconPath": "image/icon_API_HL.png","text": "接口"}]},"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "WeChat","navigationBarTextStyle": "black"},"sitemapLocation": "sitemap.json"
}
以上包含了点击和未点击显示的不同的颜色和图片、顶部样式
去除按钮button边框
.right button{margin: 0;padding: 0;background-color: inherit;position: static;
}
上述代码在跳转页面获取id时会出现问题,点击整个页面的任何地方都会跳转,改为以下形式:
.right button{background-color: inherit;
}
button::after{ border: none; }
图片的添加
1、在.wxml中添加代码:
<view class="section__ctn"><image style="width: 200px; height: 200px; background-color: #eeeeee;" mode="{{item.mode}}" src="{{src}}"></image></view>
2、在.js文件中添加代码:
自己新建文件夹resources添加图片
data: {src: '../resources/cat.jpg'},
Q:图片不显示,只显示灰色方框
A:
(1)<image src='/images/logo.jpg'></image>
×
(2)勾选设置中的不校验域名 ×
显示问题:
[渲染层网络层错误] Failed to load local image resource /pages/resources/plane1.jpg
the server responded with a status of 500 (HTTP/1.1 500 Internal Server Error)
(env: Windows,mp,1.05.2112302; lib: 2.19.4)
解决方法:
1、修改设置-本地设置-调试基础库(未解决)
2、加上wx:if="{undefined{arr.length>0}}“或者wx:if=”{undefined{****}}"
拖延一下加载图片的时间(未解决)
3、图片路径错误,修改路径!
*src的使用:
同文件夹中:eg: "\plane1.jpg"
上一级目录中:planesrc: '../plane1.jpg'
上一级的上一级目录中:planesrc: "../../resources/plane1.jpg"
图片和文字对齐
在图片与文字整体的view中添加css:
align-items:center;
picker等组件中的图片和文字对齐,需要再将其加入view中,然后再此view下设置css:
display:flex;text-align: center;align-items:center;
换行符
text标签中加入\n
<text>***(文字)\n</text>
\n
文字超出自动换行:
text-overflow:ellipsis;
word-wrap:break-word;
空格符
空格:\t
多个空格:
<text space="ensp">哈哈啊 哈哈哈(空格是中文字符一半大小)</text>
<text space="emsp">哈哈啊 哈哈哈(空格是中文字符大小)</text>
<text space="nbsp">哈哈啊 哈哈哈(空格根据字体设置)</text>
<text decode="{{true}}">哈哈 啊   哈哈哈(空格是中文字符一半大小)</text>
<text decode="{{true}}">哈哈 啊   哈哈哈(空格是中文字符大小)</text>
<text decode="{{true}}">哈哈 啊 哈哈哈(空格根据字体设置)</text>
view布局
注:小程序中根元素为page不是body
横向布局:flex-direction:row;
纵向布局:flex-direction:column;
row:从左到右的水平方向为主轴
row-reverse:从右到左的水平方向为主轴
column:从上到下的垂直方向为主轴
column-reverse:从下到上的垂直方向为主轴
让多个view处在同一行:display: flex;
设置元素在横向上的布局方向:设置 justify-content 属性
1、flex-start:主轴起点对齐(默认值)
2、flex-end:主轴结束点对齐
3、center:在主轴中居中对齐
4、space-between:两端对齐,除了两端的子元素分别靠向两端的容器之外,其他子元素之间的间隔都相等
5、space-around:每个子元素之间的距离相等,两端的子元素距离容器的距离也和其它子元素之间的距离相同
设置元素在纵向上的布局方向,设置 align-items 属性
1、stretch 填充整个容器(默认值)
2、flex-start 侧轴的起点对齐 (这里我们手动设置下子 view 的高度,来看的明显一些)
3、flex-end 侧轴的终点对齐
4、center 在侧轴中居中对齐
5、baseline 以子元素的第一行文字对齐
子 View 还有个属性 align-self,可覆盖父元素的 align-items 属性,有6个值可选:
auto | flex-start | flex-end | center | baseline | stretch (auto
为继承父元素 align-items 属性,其他和 align-items 一致)
flex-wrap 属性,用于控制子 View 是否换行,有3个值可选:
nowrap:不换行(默认)
wrap:换行
wrap-reverse:换行,第一行在最下面
子 View 的order 属性可控制子元素的排列顺序,默认0,order:-1; 可以排在前面。
设置元素高度为页面整个屏幕高 page{height:100vh;} 。设置高度100%没有效果
vh,是css相对视口高度。1vh=1%*视口高度
view居中显示:margin:0 auto;
orflex布局里的justify-content: center;
view文字居右:
1、row-reverse
2、text-align:right;
3、flex-end
边框(view&border)
边框:border: 2px solid #ac9a81;
阴影:box-shadow: 2px 3px 10px rgba(0, 0, 0, 0.15);
(x、y坐标、模糊程度、颜色)
圆角(内凹圆角反向圆角):border-radius: 10rpx;
左半边为圆角border-bottom-left-radius: 10px; border-top-left-radius: 10px;
Text
字体居中:
在字体view下设置:
display:flex;align-items:center; 垂直居中justify-content:center; 水平居中
文字大小&颜色
font-size: 20px;color: rgb(54, 45, 45);
列表
wxml文件中:
<view wx:for="{{array}}">{{index}}: {{item.message}}
</view>
规定下标从1开始而不是从0开始:
<view class="list" wx:for="{{array}}" wx:if="{{index > 0}}">
案例如下:
修改页面顶部导航栏信息
在.json文件中:
{"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "缴费记录","navigationBarTextStyle": "black"}
圆形显示
wxss:
border-radius: 50%;
overflow:hidden;
文本超链接添加方式
在微信小程序中使用:
navigator
进入到需要添加navigator的页面:
案例:
*url必须在app.json中有写明
<navigator url="../applybill/applybill" open-type="navigate"><text>{{item. bill}}</text></navigator>
判断状态显示不同内容
.wxml文件:
<view class="right" wx:if="{{item.bill==0}}">
<!-- <text>eg</text> --><navigator url="../applybill/applybill" open-type="navigate"><text class="zero">申请开票</text></navigator>
</view>
<view class="right" wx:elif="{{item.bill==1}}"><text class="one">已申请发票,开票详情请联系0991-0000000</text>
</view>
获取当前用户的姓名和电话
按钮获取电话:
先进行授权:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
时间选择器
eg:
<view class="test">
<picker class="testp" mode="time" value="{{time}}" start="09:01" end="21:01" bindchange="bindTimeChange">
<view class="test2">
<image src="../../resources/arrowgray.png"></image>
<view>时间选择</view>
</view>
</picker>
</view>
按钮跳转页面
1、打开app.json,注册新页面到小程序内,这样这个新的页面才可以被访问到
2、回到按钮页面,给新加的按钮添加点击处理事件处理函数
<button bindtap="jumpToMyPage"><text>我的用网申请</text></button>
3、打开按钮页面.js文件,输入代码:(在Page({})中添加)
//跳到另一个页面的事件处理函数jumpToMyPage: function(){wx.navigateTo({url: '../myuse/myuse'})},
button跳转页面
通过bindtap属性绑定点击事件实现页面跳转
跳转到tabBar页面和非tabBar页面所调用的函数方法不一样
1、跳转到TabBar页面需用wx.switchTab()方法
//js部分示例代码//跳转到tabBar页面
gotoPage: function (options) { wx.switchTab({ url: '../homepage/homepage', //要跳转到的页面路径}) },
2、跳转到非tabBar页面用wx.navigateTo()方法
//js部分示例代码
//跳转到非tabBar页面
gotoPage: function (options) {wx.navigateTo({url: '../homepage/homepage',//要跳转到的页面路径}) },
3、直接跳转
wx.redirectTo({url:'../record/record'})
4、关闭所有页面只打开某页面:
wx.reLaunch({url:'../record/record'})
按钮获取id
wxml里写上data-id="{{xxx.id}}"
eg:
<button data-id="{{item.id}}" bindtap="upId"><text class="zero">申请开票</text></button>
js里删除时
获取:let id = e.currentTarget.dataset.id
eg:
upId(e) {let paymentId = e.currentTarget.dataset.idwx.setStorageSync('paymentId', paymentId)console.log(paymentId)//跳转到非tabBar页面 wx.navigateTo({url: '../applybill/applybill', //要跳转到的页面路径})},
//将缴费记录选择申请开票的id传入申请开票upId(e) {// let paymentId = e.target.idlet paymentId = e.currentTarget.dataset.idwx.setStorageSync('paymentId', paymentId)console.log('paymentId:'+paymentId)//跳转到非tabBar页面 wx.navigateTo({url: '../applybill/applybill?paymentId+paymentId', //要跳转到的页面路径})},
设置按钮在点击后不能再点击
disable:false/true
参考链接:微信小程序button的可用不可用动态实现
eg:
设置button:<button disabled="{{disable}}" bindtap="add" formType="submit">提交</button>
在Page-data中添加:disable: false,
在js文件中添加:
this.setData({disable: true})
设置小程序分享至好友或朋友圈
转发给朋友:
/*** 用户点击右上角分享*/onShareAppMessage: function () {}
弹框显示
参考链接:微信小程序 详解弹框wx.showToast、wx.showModal、wx.showActionSheet,modal控件解释及input输入框值的获取
wx.showToast({duration:500,//显示时长mask:true,是否显示透明蒙层,防止触摸穿透,默认:false title: '添加成功'})
Q:弹框延时失效,跳转页面直接消失
A:加上延迟效果setTimeout
eg:
wx.showToast({duration: 500, //显示时长mask: true,title: '添加成功',success: function () {setTimeout(function () {wx.navigateBack({delta: 1,})}, 500)}})
Q:弹窗中加入文字,但是运行出来只显示了一行字
A: icon:‘none’ //可以添加更多文本,不显示图标
小程序返回上一个页面问题
1、用户从列表页进入到一个表单详情页
2、在表单详情页填上相关数据,保存后进入下一个表单页
3、在下一个表单页中点返回键,需求是直接返回到列表页中。但目前只能返回到上一个表单页,这样就可能造成用户二次提交表单。
参考:小程序返回上一个页面问题
js 返回上一页面
主要代码部分:
var pages = getCurrentPages();
var currPage = pages[pages.length - 1]; //当前页面
var beforePage = pages[pages.length - 2];//前一页
wx.navigateBack({delta: 1,})
下拉框选择
<view class="selectterminal"><view class="title">所属航站楼:</view><!-- 通过点击事件改变图片的旋转角度、自定义下拉框的高度 --><view class="value" bindtap="select"><view class="item"><block wx:if="{{model.terminal==0}}"><label class="val" bindtap="terminalChange">T1航站楼</label></block><block wx:elif="{{model.terminal==1}}"><label class="val" bindtap="terminalChange">T2航站楼</label></block><block wx:elif="{{model.terminal==2}}"><label class="val" bindtap="terminalChange">T3航站楼</label></block><block wx:else><label class="val" bindtap="terminalChange">请选择所在航站楼\t▼</label></block></view></view></view>
terminalChange: function (e) {let that = this;wx.showActionSheet({itemList: ['T1航站楼', 'T2航站楼', 'T3航站楼'],success: function (res) {if (res.tapIndex == 0) {that.setData({["model.terminal"]: 0,})commercialForm.terminal=1}if (res.tapIndex == 1) {that.setData({["model.terminal"]: 1,})commercialForm.terminal=2}if (res.tapIndex == 2) {that.setData({["model.terminal"]: 2,})commercialForm.terminal=3}console.log("terminal:" + commercialForm.terminal)}})},
上传图片设置大小限制
eg:
getBusinessLicense: function (e) {var that = this;wx.chooseImage({count: 1,sizeType: ['compressed'],sourceType: ['album', 'camera'],success: res => {var size = res.tempFiles[0].size;console.log(size)if(size<=1*1024*1024){//设置图片大小不超过2Mthat.setData({['tempFilePaths[' + e.target.id + ']']: res.tempFilePaths[0]})wx.getFileSystemManager().readFile({filePath: res.tempFilePaths[0], //选择图片返回的相对路径encoding: 'base64', //编码格式success: res => { //成功的回调// console.log('data:image/png;base64,' + res.data)console.log('======================================')BusinessLicense = res.datacommercialForm.businessLicense = BusinessLicense}})}else{wx.showToast({duration: 1000, //显示时长title:'图片不能大于1M',icon:'error'})}}})},
设置按钮不可见
设置visible:
<button wx:if="{{visible}}" class="givePhone" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">授权手机号</button>
if (phoneNumber!=null) {this.setData({visible:false})}
设置未登录状态不可点击进入
通过获取手机号来查看:(以下案例在我的页面自动登录)
gotoapplication: function (param) {let phoneNumber=wx.getStorageSync('phoneNumber')if(phoneNumber){wx.navigateTo({url: '../request/request',})}else{wx.showToast({icon:"none",title: '请在我的界面授权手机号',})}},
按钮文字居中显示
/* display: flex; */justify-content:center; align-items:center
设置有数据时显示,无数据时提示
<block wx:if="{{datalist.length!=0}}">...</block><block wx:else>无我的用网申请记录</block>
小程序输入框光标居中输入
<input class="inputpay" bindinput="getPay" placeholder='请输入缴费金额' style='text-align:center' type='text' maxlength="30"></input>
设置picker(底部选择)选择另一个页面的数据
参考链接:微信小程序开发之picker选择器组件用法
eg:
wxml文件:
<!-- 选择商户,底部选择 --><view class='shopname'><view class='title'>商户名称:</view><picker bindchange="bindPickerChange" value="{{index}}" range="{{merchantList}}" range-key='merchantName'><text wx:if="{{merchantId===''}}">请选择要交费的商户名称\t▼</text><view class='flex-item' style="font-size: 20px;">{{merchantList[index].merchantName}}</view></picker></view>
js文件:
// 选择商户payAssumeAdd() {this.setData({ //点击后设置不可点击disable: true})let that = this//测试数据payForm.openId = wx.getStorageSync('openId')console.log(util.formatTime(new Date(), "yyyy-MM-dd")) //当前日期payForm.paymentDate = util.formatTime(new Date(), "yyyy-MM-dd")payForm.expireDate = util.formatTime(new Date(), "yyyy-MM-dd")if (this.data.merchantId === "") {this.setData({disable: false})return wx.showToast({icon: "error",title: '请选择商户',duration: 1000, //显示时长})}payForm.merchantId = this.data.merchantIdconsole.log(payForm)wx.request({url: 'https://cj.zhouwx.com:8443/wx/paymentApplication',method: 'POST',header: {"content-type": "application/json"},data: payForm,success: res => {console.log("成功", res)that.setData({result: res.data})if (res.data.code === 200) {this.setData({disable: true})wx.showToast({title: '已上传模拟缴费信息',duration: 500,icon: 'success',mask: true,success: function () {setTimeout(function () {wx.navigateBack({delta: 1,})}, 900)}})} else {wx.showToast({icon: "error",title: '信息不完整',duration: 1000, //显示时长})this.setData({disable: false})}},fail(res) {console.log("失败", res)}})},/*** 页面的初始数据*/data: {index: undefined,// index: 0,merchantList: [], //商户merchantId: '',},bindPickerChange: function (e) {//获取选择的项目数据var mchObj = this.data.merchantList[e.detail.value];this.setData({index: e.detail.value,merchantId: mchObj.id,})console.log(this.data.merchantId);},//加载页面显示onLoad: function (options) {//查我的用网申请数据let that = thislet openId = wx.getStorageSync('openId')let sessionKey = wx.getStorageSync('sessionKey')wx.request({url: 'https://cj.zhouwx.com:8443/wx/getPersonMerchantList',method: 'POST',data: {openId: openId,sessionKey: sessionKey},header: {'content-type': 'application/json' // 默认值},success(res) {console.log("查询成功", res)if (res.data != null) {that.setData({merchantList: res.data,})} else {wx.showToast({icon: "none",title: '查询失败',})}},fail(res) {console.log("查询失败", res)},})},
图片二维码长按识别
加入show-menu-by-longpress属性:
<image src="../../resources/testimg.jpg" show-menu-by-longpress="{{true}}" alt=""/>
页面未加载出内容显示加载中
参考:小程序showLoading:网络请求前显示“加载中…”,请求完成时关闭加载中
eg:(js文件)
onLoad方法:
//显示加载中信息
wx.showLoading({title: '加载中...',
})
wx.request({url: '',success(res){},fail(){},
//添加wx.hideLoading()一定要添加到complete里complete(){wx.hideLoading()}
})
模拟器显示,真机不显示loading:
(设置延时)
wx.showLoading({title: '加载中',
})
setTimeout(function () {wx.hideLoading()
}, 2000)
分页显示数据
暂未解决
参考:
最佳方式实现微信小程序分页加载数据
小程序分页实现
微信小程序分页
小程序列表页如何实现分页教程
微信小程序实现分页加载效果
B站视频讲解(best)
建立表格
HTML文件:
<!-- 表格显示 --><view class="table"><view class="tr"><view class="th1">网络维护服务类别</view><view class="th2">月份</view><view class="th3">金额(元)</view><view class="th4"></view></view><view class="tr" wx:for="{{selectList}}" wx:for-index="indexSelect" wx:for-item="item" wx:key="indexSelect"><view class="td1">{{item.selectService}}</view><view class="td2">{{item.selectMonth}}</view><view class="td3">{{item.oneListPay}}</view><view class="td4"><text data-index="{{item.indexSelect}}" class="cancelSelect" bindtap="cancelSelect">{{item.cancel}}</text></view></view><view class="total">总计:{{totalPay}}</view><view class="lookDeal"><radio-group class="radio-group" bindchange="radioChange"><label class="radio"><radio checked="{{radioChecked}}" value="radioOK" color="rgb(22, 155, 213)" /></label></radio-group>查看<text class="deal" bindtap="goBillPage">\t网络维护协议\t</text>并手签确认</view></view>
css文件:
/* 表格 */
.table {width: 95%;border-right: 0;border-bottom: 0;
}/* 每行 */
.tr {width: 100%;display: flex;justify-content: space-between;
}/* 表头,每列(每格) */
.th1,
.td1 {width: 300rpx;padding: 5px;display: flex;border: 1px solid #dadada;text-align: center;display: flex;align-items: center;justify-content: center;
}.th2,
.td2 {width: 80rpx;padding: 5px;display: flex;border: 1px solid #dadada;text-align: center;display: flex;align-items: center;justify-content: center;
}.th3,
.td3 {width: 130rpx;padding: 5px;display: flex;border: 1px solid #dadada;text-align: center;display: flex;align-items: center;justify-content: center;
}.th4,
.td4 {width: 80rpx;padding: 5px;display: flex;border: 1px solid #dadada;text-align: center;display: flex;align-items: center;justify-content: center;
}/* 总计 */
.total {margin-top: 5px;text-align: right;
}/* 查看网络协议 */
.lookDeal {margin-top: 20rpx;display: flex;margin-top: 5px;
}/* 协议 */
.deal {color: rgb(22, 155, 213);
}/* 取消按钮 */
.cancelSelect {color: rgb(22, 155, 213);
}
无网络显示内容(图片)
无网络显示:
<view class="noMessage" hidden="{{nonet}}"><image src="../../resources/2-NoNetwork.png"></image>
</view>
//无网络时做提示no netwx.onNetworkStatusChange(function(res){console.log(res)if(res.networkType == "none"){that.setData({nonet: false})}else{that.setData({nonet: true})}})
无网络显示(增加“点击重试”按钮版):
<block wx:if="{{nonet===false}}"><view class="noMessage" hidden="{{nonet}}"><image src="../../resources/2-NoNetwork.png"></image></view><button bindtap="retry"class="retry">重试</button>
</block>
retry() {wx.redirectTo({url:'../record/record'})},
输入框只允许输入大写字母和数字
gettaxNumber(event) {taxNumber = event.detail.value.replace(/[^A-Za-z0-9]/g,'').toUpperCase()billForm.taxNumber = taxNumberreturn taxNumber},