林秀栋的技术博客

微信小程序一期开发总结

文档目录

文档目录

文件内部

app.json内部设置

{
  // 注册页面,需要用到的页面都需要在这先注册
  "pages":[
    "pages/index/index",
    "pages/index/search/search",
    //...
  ],
  // 全局样式设置
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#3377FF",
    "navigationBarTitleText": "",
    "navigationBarTextStyle":"#fff"
  },
  // 引入插件配置
  "plugins": {
    "WechatSI": {
      "version": "0.2.2",
      "provider": "wx069ba97219f66d99"
    }
  },
  // 底部导航栏配置
  "tabBar": {
    "color": "#9B9DB1",
    "selectedColor": "#3377FF",
    "borderStyle": "black",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/index/index",
        "iconPath": "./images/footer/index.png",
        "selectedIconPath": "./images/footer/index-active.png",
        "text": "首页"
      },
      //...
    ]
  }
}

app.js设置

App({
  //小程序启动后触发
  onLaunch: function () {},
  //全局变量,其他页面 let app = getApp() 后可通过 app.globalData.xx 获取
  //app.js中可通过 this.globalData.xx = xx 赋值
  globalData: {

  }
})

各个页面的json文件

可以配置头部文字

{
    "navigationBarTitleText": 'it is title'
}

各个页面js设置

Page({
  // 数据
  data: {
      a: {}
  },
  // 加载完运行
  onLoad: function () {
    //...
  },
  // 其他事件函数,可在wxml或其他方法中调用
  a: function(){
    //...
  }
})

wxml中的一些基础操作

<!-- 循环 -->
<!-- block不会渲染,相当于不存在,可以作为循环的外部容器 -->
<!-- \{\{xxx\}\}可获取data数据 -->
<block wx:for="\{\{list\}\}" wx:key="\{\{index\}\}">
    <view class="list-nav"></view>
</block>

<!-- 循环嵌套 -->
<block wx:for="\{\{list\}\}" wx:key="1-\{\{index\}\}">
    <block wx:for="\{\{item.list2\}\}" wx:for-item="item2" wx:for-index="index2" wx:key="2-\{\{index2\}\}">
        <text>\{\{item2.aaa\}\}</text>
    </block>
</block>

<!-- 是否渲染 -->
<view wx:if="\{\{type==1\}\}"></view>
<view wx:elif="\{\{type==3\}\}"></view>

<!-- 页面跳转 -->
<!-- 相当于a链接 -->
<navigator url="\{\{item.url\}\}"></navigator>

<!-- 事件绑定 -->
<!-- bindtap绑定点击事件,js中定义aa方法。其他事件具体见文档 -->
<view bindtap="aa"></view>

<!-- 弹出输入框的类型 -->
<!-- confirm-type改变,比如下面是弹出带搜索按钮的弹出框 --><!-- 点击搜索按钮触发bindconfirm -->
<input value="\{\{aa\}\}" confirm-type="search" bindconfirm="toSearch"/>

<!-- 获取用户信息 -->
<!-- 最简单的获取方法,分别是获取头像、用户名等,另外手机号不可用该方法获取 -->
<open-data type="userAvatarUrl" lang="zh_CN"></open-data>
<open-data type="userNickName" class="userinfo-name" lang="zh_CN"></open-data>

<!-- 带滚动条样式 -->
<!-- 下面是纵向滚动条,需要css设置高度 -->
<scroll-view scroll-y>
    <view></view>
</scroll-view>

<!-- 轮播图 -->
<swiper
    indicator-dots="true"
    autoplay="true"
    interval="5000"
    duration="1000"
>
    <image src="\{\{url1\}\}"/>
    <image src="\{\{url2\}\}"/>
</swiper>

<!-- 跳转到外部界面 -->
<!-- 注意,这个标签不需要点击会直接跳转。且只有企业账户可用 -->
<!-- 需在开发者后台获取认证文章,放在跳转页域名下认证后方可跳转 -->
<!-- 比如要跳转到https://www.baidu.com/xxx/xx,就要把文件放在https://www.baidu.com/文件去认证https://www.baidu.com这个域名 -->
<!-- 另外跳转后无法返回当前页,只是当前页被跳转页覆盖了。如果是一级页面,左上角也不会出现返回按钮;二级页面有,但点击后会返回上一页,无法显示该页原先的内容 -->
<!-- 解决方法是设置一个空页面,只有web-view,需要跳转时先跳转到该新页面,再由该页面加载外部界面 -->
<web-view src="\{\{url\}\}"></web-view>

js中的一些基础操作

//普通页面跳转
wx.navigateTo({
    url: '../index/index'
})

//关闭所有页面,再跳转到下个页面
wx.reLaunch({
    url: '../index/index'
})

//获取/修改data数据
this.data.xx    //获取data中的xx
this.setData({  //修改data中的xx,直接this.data.xx=1无法更新界面
    xx: 1
});

//获取url传递参数
//若上个页面跳转时url带有url?a=1,可在load中获取
load: function(option){
    console.log(option.a);
}

//弹出层
wx.showToast({
    title: '暂无相关数据',
    icon: 'none',   //可用icon很少,且无法自定义
    duration: 2000
})

//获取wxml的data-xx
<view data-xx="123" bindtap="a"></view>
a: function(event){
    console.log(event.currentTarget.dataset.xx);
}
//在wxml中如果使用循环,点击某一项时无法获取点击项,给每项设置唯一的data-xx(比如index),
//点击后获取data-xx判断点击项

//封装网络请求
//注意,网络请求和文件上传等都要先在开发者后台把对应域名设置为信任域名
const ROOT_PATH = 'https://xxx';
const $http = params => {
  params.data = params.data ? params.data : {};
  wx.request({
    url: ROOT_PATH + params.url,
    data: params.data,
    header: {
      'content-type': 'application/json'
    },
    success(res) {
      params.success && params.success(res);
    }
  })
}

//封装文件上传
const ROOT_PATH2 = 'https://xxx';
const $httpFile = params => {
  params.data = params.data ? params.data : {};
  wx.uploadFile({
    url: ROOT_PATH2 + params.url,
    filePath: params.filePath,
    name: 'file',
    formData: params.data,
    success(res) {
      params.success && params.success(res);
    }
  })
}

//退出本页,回到首页
//delta参数表示向上返回几页,getCurrentPages().length可获取当前页面层级
//所以下面代码可以回到首页
wx.navigateBack({
    delta: getCurrentPages().length
})

//扫码
//点击扫描条形码
QRCodeClick: function(){
    wx.scanCode({
        scanType: 'barCode',  //这里设置的是条形码
        success: (res) => {
            //res.result
        },
        fail: (res) => {
            //失败
        }
    })
}

引入平台的插件

下面以语音识别插件同声传译为例

首先需要在开发者管理界面找到插件并添加(设置 → 第三方服务 → 添加插件)

app.json中引入插件

"plugins": {
    "WechatSI": {
        "version": "0.2.2", //插件的版本
        "provider": "wx069ba97219f66d99"    //插件的id
    }
}

页面js中调用

let plugin = requirePlugin("WechatSI")
let manager = plugin.getRecordRecognitionManager()
//点击开始录音,绑定wxml的点击事件
voiceStart: function(){
    //manager.onStop和manager.onError本是放在load中,但如果跳到下一个页面再返回,不再重新加载load
    //这时再进行语音识别,原来定义的这两个方法失效了(项目中下一个页面也调用了语音识别插件,不知道有没有关系)

    //所以这里每次识别时都重新定义一遍

    //后来放在voiceEnd中,manager.stop()之前,但两个方法还没成功注册就运行了stop,无法进入两个方法
    //所以最终放在了voiceStart,开始录音时就加载

    //监听语音识别结束事件
    manager.onStop = function (res) {
        //res.result即识别输出的文字
    }
    //监听语音识别错误事件
    manager.onError = function (res) {
        //
    }
    //开始识别
    manager.start({
        duration: 6000
    })
},
//录音结束,绑定wxml的点击放开事件
voiceEnd: function(){
    manager.stop();
}

引入外部的组件

以echarts为例

先把微信小程序版本的文件夹放入component

页面的json中

{
    "navigationBarTitleText": "",
    "usingComponents": {
        "ec-canvas": "../../component/ec-canvas/ec-canvas"
    }
}

使用

<ec-canvas id="mychart" canvas-id="mychart" ec=""></ec-canvas>
import * as echarts from '../../component/ec-canvas/echarts.js';
Page({
    data: {
        ec: {
            onInit: initChartBar
        }
    },
    onLoad: function () {}
})

function initChartBar(canvas, width, height){
    let data = [];
    return initChart(canvas, width, height, data);
}
function initChart(canvas, width, height, data) {
    let chart = echarts.init(canvas, null, {
        width: width,
        height: height
    });
    canvas.setChart(chart);

    var option = {};
    chart.setOption(option);
    return chart;
}

引入iconfont

把 iconfont.css 改为 iconfont.wxss

然后在app.wxss中引入

@import "./iconfont/iconfont.wxss";

即可使用

<!-- 使用iconfont时,若用icon标签包裹,一些情况下上方会出现一片空白,原因不明,所以最好用text标签包裹 -->
<text class="iconfont icon-xxx"></text>

本地储存

//本地储存,异步
wx.setStorage({
    key: 'xx',
    data: xxx
})

//本地储存,同步
wx.setStorageSync({
    key: 'xx',
    data: xxx
})

//获取本地缓存,异步
wx.getStorage({
    key: "xx",
    success: function (res) {
        console.log(res.data)
    }
})

//获取本地缓存,同步
var xx = wx.getStorageSync('xx');