微信小程序的开发(前端)

  • Post author:
  • Post category:小程序




前端



快捷键

代码规范快捷键:

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}}">哈哈&ensp;&ensp;&ensp;&ensp;哈哈哈(空格是中文字符一半大小)</text>
<text decode="{{true}}">哈哈&emsp;&emsp;&emsp;&emsp;哈哈哈(空格是中文字符大小)</text>
<text decode="{{true}}">哈哈&nbsp;&nbsp;&nbsp;&nbsp;哈哈哈(空格根据字体设置)</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;

or

flex布局里的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.id
    wx.setStorageSync('paymentId', paymentId)
    console.log(paymentId)
    //跳转到非tabBar页面  
    wx.navigateTo({
      url: '../applybill/applybill', //要跳转到的页面路径
    })
  },
//将缴费记录选择申请开票的id传入申请开票
  upId(e) {
    // let paymentId = e.target.id
    let paymentId = e.currentTarget.dataset.id
    wx.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){//设置图片大小不超过2M
          that.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.data
              commercialForm.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.merchantId
    console.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 = this
    let 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 net
    wx.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 = taxNumber
    return taxNumber
  },



版权声明:本文为weixin_47401619原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。