微信小程序开发记录(原生无框架)

版权声明:转载请注明出处 https://blog.csdn.net/qq_37205708/article/details/89278858

目录

前端的一些问题

1.使用dataset

2.view组件英文字母无法换行的问题

3.动态绑定class

4.block和wx:for wx:key

实现短信验证注册

使用小程序·云开发记录

云函数获取用户信息的问题

小程序端API

db.command的使用

服务器端API

如何在服务器端执行多个Promise?


推荐资源

学习视频:http://www.xuetangx.com/courses/course-v1:TsinghuaX+2018032801X+2018_T1/about

https://blog.csdn.net/wangguang1995/article/details/79801933

社区和模板等:https://blog.csdn.net/qq_37205708/article/details/88296589 看里面的小程序部分的连接

前端的一些问题

1.使用dataset

比如我想实现下图中点击不同的订单信息跳到不同的界面,那么我需要获取一个"下标"来直到是第几条记录

只需要加上一个data-xxx属性,比如这里的data-index

js中通过e.currentTarget.dataset.xxx来获取即可

2.view组件英文字母无法换行的问题

在css里加一个样式:word-break: break-all;

3.动态绑定class

4.block和wx:for wx:key

<block></block>不是一个组件,仅仅是一个包装元素,不会再页面中做任何渲染,只接受控制属性(如wx:for wx:if)

实现短信验证注册

界面不是很美观,主要记录下怎么使用榛子云来发短信吧

http://smsow.zhenzikj.com/doc/weixinmp_code_sdk_doc.html

里面介绍的很详细了,总结下就是

1.配置域名

2.zhenzisms.js放到utils文件夹下

3.在需要的地方引入并初始化

涂掉的是你在榛子云注册后给你的appId和appSecrect

4.直接使用提供的接口即可

使用小程序·云开发记录

云函数获取用户信息的问题

// 云函数入口文件 这个云函数用于增加指定数量的水滴数
const cloud = require('wx-server-sdk')
cloud.init({ env: 'test-ae626c' })
const db = cloud.database();
const _ = db.command;
let wxOpenId
// 云函数入口函数
exports.main = async (event, context) => {
  const addPoints = event.addPoints 
  const signOrLottery = event.signOrLottery
  const wxContext = cloud.getWXContext()
  wxOpenId = wxContext.OPENID
  // 通过_openid获取对应的doc
  let res = await getDocId()
  let docId = res.data[0]._id
  return updateUsers(signOrLottery, docId, addPoints)

}

function getDocId() {
  return db.collection('users').where({
    _openid: wxOpenId // 注意这里,如果直接写wxContext.OPENID,即把cloud.getWXContext()
                      // 放在main外面然后这里获取OPENID的话会获取错误的OPENID
  }).get()
}

function updateUsers(signOrLottery, docId, addPoints) {
  if (signOrLottery === 'sign') {
    return db.collection('users').doc(docId).update({
      data: {
        waterPoints: _.inc(addPoints),
        hasSigned: true
      }
    })
  } 
  else if (signOrLottery === 'lottery') {
    return db.collection('users').doc(docId).update({
      data: {
        waterPoints: _.inc(addPoints),
        hasLotteryed: true
      }
    })
  }
}

比如上面这个云函数,如果cloud.getWXContext()放在main外面,然后在定义的函数中直接使用wxContext.OPENID的话会有问题;比方说其他人在小程序端调用了这个云函数,按道理来说应该获取的是他的OPENID,但是获取的却仍然是开发者的OPENID,不知道为什么会有这种问题......

小程序端API

数据库 API 都是懒执行的,这意味着只有真实需要网络请求的 API 调用才会发起网络请求,其余如获取数据库、集合、记录的引用、在集合上构造查询条件等都是不会触发网络请求的。触发网络请求的 API 有如下几个:

get

获取集合 / 记录数据

add

在集合上新增记录

update

更新集合 / 记录数据

set

替换更新一个记录

remove

删除记录

count

统计查询语句对应的记录条数

获取引用的 API 有如下几个:

database

获取数据库引用,返回 Database 对象

collection

获取集合引用,返回 Collection 对象

doc

获取对一个记录的引用,返回 Document 对象

在数据库 (Database) 对象上有如下字段

字段

说明

 

command

获取数据库查询及更新指令,返回 Command

serverDate

构造服务端时间

Geo

获取地理位置操作对象,返回 Geo 对象

在集合 (Collection) 对象上有如下 API:

doc

获取对一个记录的引用,返回 Document 对象

add

在集合上新增记录

where

构建一个在当前集合上的查询条件,返回 Query,查询条件中可使用查询指令

orderBy

指定查询数据的排序方式

limit

指定返回数据的数量上限

skip

指定查询时从命中的记录列表中的第几项之后开始返回

field

指定返回结果中每条记录应包含的字段

在记录 (Document) 对象上有如下 API:

get

获取记录数据

update

局部更新数据

set

替换更新记录

remove

删除记录

field

指定返回结果中记录应包含的字段

Command (db.command) 对象上有如下查询指令:

eq

字段是否等于指定值

neq

字段是否不等于指定值

lt

字段是否小于指定值

lte

字段是否小于或等于指定值

gt

字段是否大于指定值

gte 

字段是否大于或等于指定值

in

字段值是否在指定数组中

nin

字段值是否不在指定数组中

and

条件与,表示需同时满足另一个条件

or

条件或,表示如果满足另一个条件也匹配

Command (db.command) 对象上有如下更新指令:

set

设置字段为指定值

remove

删除字段

inc

原子自增字段值

mul

原子自乘字段值

push

如字段值为数组,往数组尾部增加指定值

pop

如字段值为数组,从数组尾部删除一个元素

shift

如字段值为数组,从数组头部删除一个元素

unshift

如字段值为数组,往数组头部增加指定值

db.command的使用

Command (db.command) 对象上有如下查询指令:调用db.where时使用

eq

字段是否等于指定值

neq

字段是否不等于指定值

lt

字段是否小于指定值

lte

字段是否小于或等于指定值

gt

字段是否大于指定值

gte 

字段是否大于或等于指定值

in

字段值是否在指定数组中

nin

字段值是否不在指定数组中

and

条件与,表示需同时满足另一个条件

or

条件或,表示如果满足另一个条件也匹配

Command (db.command) 对象上有如下更新指令:调用db.update时使用

set

设置字段为指定值

remove

删除字段

inc

原子自增字段值

mul

原子自乘字段值

push

如字段值为数组,往数组尾部增加指定值

pop

如字段值为数组,从数组尾部删除一个元素

shift

如字段值为数组,从数组头部删除一个元素

unshift

如字段值为数组,往数组头部增加指定值

服务器端API

在 wx-server-sdk 中不再兼容 success、fail、complete 回调,总是只会返回 Promise。

Server 端的 API 与小程序端基本保持一致,有如下不同:

Server API 不再接受回调(success, fail, complete),统一返回 Promise

Server 端有批量写和批量删除的权限,即可在集合或查询语句上调用 update 或 remove

Server 端独有 API 如创建集合(db.createCollection)

即小程序端只能在Document对象上执行update和remove操作,服务器端可以在Collection对象上执行这两个操作(多了两个API)

如何在服务器端执行多个Promise?

const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const MAX_LIMIT = 100
exports.main = async (event, context) => {
  // 先取出集合记录总数
  const countResult = await db.collection('todos').count()
  const total = countResult.total
  // 计算需分几次取
  const batchTimes = Math.ceil(total / 100)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  // 等待所有
  return (await Promise.all(tasks)).reduce((acc, cur) => ({
    data: acc.data.concat(cur.data),
    errMsg: acc.errMsg,
  }))
}

设置云函数的触发器的注意事项

这是社区里的一个讨论

注意JSON里不能有注释,然后注意点上传触发器这个选项(右键你的云函数找到这个选项)

未完待续......

猜你喜欢

转载自blog.csdn.net/qq_37205708/article/details/89278858
今日推荐