前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全栈开发工程师微信小程序-下

全栈开发工程师微信小程序-下

作者头像
达达前端
发布2019-07-03 10:29:47
7380
发布2019-07-03 10:29:47
举报
文章被收录于专栏:达达前端

app.json

代码语言:javascript
复制
{

  "pages": ["pages/index/index"]

}

index.wxml

代码语言:javascript
复制
<text>Hello World</text>

index.js

代码语言:javascript
复制
Page({})

image.png

代码语言:javascript
复制
{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}
代码语言:javascript
复制
<!--pages/wxml/index.wxml-->
<text>当前时间:{{time}}</text>

// pages/wxml/index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    time: (new Date()).toString()
  },
})
代码语言:javascript
复制
<!-- 正确的写法 -->
<text data-test="{{test}}"> hello world</text>


<!-- 错误的写法  -->
<text data-test={{test}}> hello world </text >
代码语言:javascript
复制
<!--
{ a: 1,  b: 2, c: 3 }
-->


<view> {{a + b}} + {{c}} + d </view>


<!-- 输出 3 + 3 + d -->
代码语言:javascript
复制
<view wx:if="{{condition}}"> True </view>

<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

<block wx:if="{{true}}">
  <view> view1 </view>
  <view> view2 </view>
</block>
代码语言:javascript
复制
<!-- array 是一个数组 -->
<view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>

<!-- 对应的脚本文件
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})
-->
代码语言:javascript
复制
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
</view>
代码语言:javascript
复制
<block wx:for="{{[1, 2, 3]}}">
  <view> {{index}}: </view>
  <view> {{item}} </view>
</block>

WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

代码语言:javascript
复制
<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>
代码语言:javascript
复制
<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>


<template is="msgItem" data="{{...item}}"/>

WXML 提供两种文件引用方式import和include。

代码语言:javascript
复制
<!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>

<import src="item.wxml"/>

<template is="item" data="{{text: 'forbar'}}"/>

<!-- A.wxml -->
<template name="A">
  <text> A template </text>
</template>

<!-- B.wxml -->
<import src="a.wxml"/>

<template name="B">
  <text> B template </text>
</template>

<!-- C.wxml -->
<import src="b.wxml"/>

<template is="A"/>  <!-- 这里将会触发一个警告,因为 b 中并没有定义模板 A -->

<template is="B"/>

include 可以将目标文件中除了 <template/> <wxs/> 外的整个代码引入

代码语言:javascript
复制
<!-- index.wxml -->
<include src="header.wxml"/>

<view> body </view>

<include src="footer.wxml"/>
代码语言:javascript
复制
data-*  Any 自定义属性   组件上触发的事件时,会发送给事件处理函数
bind*/catch*    EventHandler    组件的事件

image.png

在WXSS中,引入了rpx(responsive pixel)尺寸单位。

代码语言:javascript
复制
@import url('./test_0.css')

小程序支持动态更新内联样式:

代码语言:javascript
复制
<!--index.wxml-->

<!--可动态变化的内联样式-->
<!--
{
  eleColor: 'red',
  eleFontsize: '48rpx'
}
-->
<view style="color: {{eleColor}}; font-size: {{eleFontsize}}"></view>

image.png

官方样式库

具体使用文档可参考:https://github.com/Tencent/weui-wxss

语法 类型 语句 关键字 操作符 对象

image.png

代码语言:javascript
复制
// moduleA.js
module.exports = function( value ){
  return value * 2;
}

// 在B.js中引用模块A
var multiplyBy2 = require('./moduleA')
var result = multiplyBy2(4)

var common = require('common.js')
Page({
  helloMINA: function() {
    common.sayHello('MINA')
  },
  goodbyeMINA: function() {
    common.sayGoodbye('MINA')
  }
})

使用全局函数 getApp() 获取全局的实例

代码语言:javascript
复制
// a.js
// 获取全局变量
var global = getApp()
global.globalValue = 'globalValue'

// b.js
// 访问全局变量
var global = getApp()
console.log(global.globalValue) // 输出 globalValue
代码语言:javascript
复制
// a.js
// 局部变量
var localValue = 'a'

// 获取 global 变量
var app = getApp()

// 修改 global 变量
app.globalData++  // 执行后 globalData 数值为 2

// b.js
// 定义另外的局部变量,并不会影响 a.js 中文件变量
var localValue = 'b'

// 如果先执行了 a.js 这里的输出应该是 2
console.log(getApp().globalData)
代码语言:javascript
复制
<view>{{ msg }}</view>

Page({
  onLoad: function () {
    this.setData({ msg: 'Hello World' })
  }
})

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

代码语言:javascript
复制
App({
  onLaunch: function (options) {
    console.log("app.js ---onLaunch---" + JSON.stringify(options));
  },
  onShow:function(){
    console.log("app.js ---onShow---");
  },
  onHide:function(){
    console.log("app.js ---onHide---");
  },
  onError: function (msg){
    console.log("app.js ---onError---" + msg);
  },
  globalData: {
    userInfo: null
  }
})
代码语言:javascript
复制
Page({
  onLoad: function (options) {
    console.log("page ---onLoad---");
  },
  onReady: function () {
    console.log("page ---onReady---");
  },
  onShow: function () {
    console.log("page ---onShow---");
  },
  onHide: function () {
    console.log("page ---onHide---");
  },
  onUnload: function () {
    console.log("page ---onUnload---");
  }
})
代码语言:javascript
复制
初始化 小程序打开的第一个页面     onLoad, onShow
打开新页面 调用    API wx.navigateTo   onHide  onLoad, onShow
页面重定向 调用    API wx.redirectTo   onUnload    onLoad, onShow
页面返回 调用 API wx.navigateBack onUnload    onShow
Tab 切换 调用 API wx.switchTab  请参考表3-6 请参考表3-6
重启动 调用 API wx.reLaunch  onUnload    onLoad, onShow
代码语言:javascript
复制
wx.request({
url: 'test.php',
data: {},
header: { 'content-type': 'application/json' },
success: function(res) {
 // 收到https服务成功后返回
 console.log(res.data)
},
fail: function() {
 // 发生网络错误等情况触发
},
complete: function() {
 // 成功或者失败后触发
}
})
代码语言:javascript
复制
<!-- page.wxml -->
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

// page.js
   Page({
  tapName: function(event) {
    console.log(event)
  }
})
代码语言:javascript
复制
touchstart  手指触摸动作开始
touchmove   手指触摸后移动
touchcancel 手指触摸动作被打断,如来电提醒,弹窗
touchend    手指触摸动作结束
tap 手指触摸后马上离开
longpress   手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发
longtap 手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
transitionend   会在 WXSS transition 或 wx.createAnimation 动画结束后触发
animationstart  会在一个 WXSS animation 动画开始时触发
animationiteration  会在一个 WXSS animation 一次迭代结束时触发
animationend    会在一个 WXSS animation 动画完成时触发
代码语言:javascript
复制
type    String  事件类型
timeStamp   Integer 页面打开到触发事件所经过的毫秒数
target  Object  触发事件的组件的一些属性值集合
currentTarget   Object  当前组件的一些属性值集合
detail  Object  额外的信息
touches Array   触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouches  Array   触摸事件,当前变化的触摸点信息的数组

bindtap、catchtouchstart

image.png

https://developers.weixin.qq.com/ebook?action=get_post_info&token=935589521&volumn=1&lang=zh_CN&book=miniprogram&docid=00080e799303986b0086e605f5680a

获取微信登录凭证code 发送code到开发者服务器 到微信服务器换取微信用户身份id 绑定微信用户身份id和业务用户身份 业务登录凭证SessionId

wx.getStorage/wx.getStorageSync读取本地数据缓存

每个小程序的缓存空间上限为10MB,如果当前缓存已经达到10MB,再通过wx.setStorage写入缓存会触发fail回调。

要实现了一个购物商城的小程序,首页是展示一堆商品的列表。

代码语言:javascript
复制
Page({

  onLoad: function() {

    var that = this

    wx.request({

      url: 'https://test.com/getproductlist',

      success: function (res) {

        if (res.statusCode === 200) {

          that.setData({

            list: res.data.list

          })

        }

      }

    })

  }

})

在onLoad发起请求前,先检查是否有缓存过列表,如果有的话直接渲染界面

代码语言:javascript
复制
Page({

  onLoad: function() {

    var that = this

    var list =wx.getStorageSync("list")



    if (list) { // 本地如果有缓存列表,提前渲染

      that.setData({

        list: list

      })

    }

    wx.request({

      url: 'https://test.com/getproductlist',

      success: function (res) {

        if (res.statusCode === 200) {

          list = res.data.list

          that.setData({ // 再次渲染列表

            list: list

          })

          wx.setStorageSync("list",list) // 覆盖缓存数据

        }

      }

    })

  }

})

缓存用户登录态SessionId

代码语言:javascript
复制
//page.js

var app = getApp()

Page({

  onLoad: function() {

    // 调用wx.login获取微信登录凭证

    wx.login({

      success: function(res) {

        // 拿到微信登录凭证之后去自己服务器换取自己的登录凭证

        wx.request({

          url: 'https://test.com/login',

          data: { code: res.code },

          success: function(res) {

            var data = res.data

            // 把 SessionId 和过期时间放在内存中的全局对象和本地缓存里边

            app.globalData.sessionId =data.sessionId

            wx.setStorageSync('SESSIONID',data.sessionId)



            // 假设登录态保持1天

            var expiredTime = +new Date() +1*24*60*60*1000

            app.globalData.expiredTime =expiredTime

            wx.setStorageSync('EXPIREDTIME',expiredTime)

          }

        })

      }

    })

  }

})
代码语言:javascript
复制
//app.js

App({

  onLaunch: function(options) {

    var sessionId =wx.getStorageSync('SESSIONID')

    var expiredTime =wx.getStorageSync('EXPIREDTIME')

    var now = +new Date()



    if (now - expiredTime <=1*24*60*60*1000) {

      this.globalData.sessionId = sessionId

      this.globalData.expiredTime = expiredTime

    }

  },

  globalData: {

    sessionId: null,

    expiredTime: 0

  }

})

利用wx.scanCode获取二维码的数据

代码语言:javascript
复制
//page.js

Page({

  // 点击“扫码订餐”的按钮,触发tapScan回调

  tapScan: function() {

    // 调用wx.login获取微信登录凭证

    wx.scanCode({

      success: function(res) {

        var num = res.result // 获取到的num就是餐桌的编号

      }

    })

  }

})

获取网络状态 利用wx.getNetworkType获取网络状态

代码语言:javascript
复制
//page.js

Page({

  // 点击“预览文档”的按钮,触发tap回调

  tap: function() {

    wx.getNetworkType({

      success: function(res) {

        // networkType字段的有效值:

        // wifi/2g/3g/4g/unknown(Android下不常见的网络类型)/none(无网络)

        if (res.networkType == 'wifi') {

          // 从网络上下载pdf文档

          wx.downloadFile({

            url:'http://test.com/somefile.pdf',

            success: function (res) {

              // 下载成功之后进行预览文档

              wx.openDocument({

                filePath: res.tempFilePath

              })

            }

          })

        } else {

          wx.showToast({ title: '当前为非Wifi环境' })

        }

      }

    })

  }

})

image.png

image.png

image.png

image.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 官方样式库
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档