小试小程序云开发(小结)


Posted in Javascript onJune 06, 2019

微信小程序刚出没多久时,曾经上手写过demo,但开发体验比较差,所以一直没怎么关注。不过自从诸多适配方案出炉,以及云端的开通,觉得还是有必要上手体验一番的,于是为我的技术博客也写了个小程序版。

原生开发我是不想再试了,那就选一种适配方案,目前比较知名的有基于vue的 mpvue,umi-app,基于react 的 taro,以及TX团体出的全新框架 wepy。个人对 react 的好感 以及 taro 框架的走向成熟,促使我选择了 taro。

云端开发就是将普通小程序的传统后端切换为微信提供的 轻量级云端。而这个云端服务部分的开发其实是针对前端开发的,前端工程师很容易就能全栈开发出一整个小程序。但是这种轻量级解决方案也只是针对业务简单的项目,因为公共平台肯定有各种限制,它的出现只是让我们多了一个选择方案而已。

接着进入主题,项目大体目录结构如下

client #前端目录
├── config #配置
├── dist #输出
├── src #源目录
└── index.html #入口文件
cloud #云目录
├── dao #数据库操作函数集合
├── login #登录云函数
└── ... #其他

前端

小程序的前端部分,想必不用过多讲解,因为这都是前端的基本功。就以首页为样例,使用了typeScript,主要功能是分页加载数据,调用微信提供的触发到达底部的api-onReachBottom即可。

import Taro, { Component, Config } from "@tarojs/taro";
import { View, Text, Navigator } from "@tarojs/components";
import "./index.scss";

interface IState {
 loading: boolean;
 size: number;
 page: number;
 total: number;
 list: Array<{ _id: string; summary: object }>;
 context:object;
}
export default class Index extends Component<{}, IState> {
 state = {
  loading: false,
  size: 10,
  page: 0,
  total: -1,
  list: [],
  context:{}
 };
 config: Config = {
  navigationBarTitleText: "Jeff's Blog",
  onReachBottomDistance: 50
 };

 componentWillMount() {
  this.getList();
  this.getLogin();
 }

 getDbFn(fn, param) {
  return Taro.cloud.callFunction({
   name: "dao",
   data: { fn, param }
  });
 }

 onReachBottom() {
  this.getList();
 }
 
 getList() {
  const { size, page, total, loading } = this.state;
  if (loading) return;
  Taro.showLoading({ title: 'loading', });
  if (total >= 0 && size * page >= total) return;
  this.setState({ loading: true });
  this.getDbFn("getList", { size, page: page + 1 }).then(res => {
   Taro.hideLoading();
   const total = res.result.total;
   const list = this.state.list.concat(res.result.list);
   this.setState({ loading: false, page: page + 1, total, list });
  }).catch(err => {
   Taro.hideLoading();
   this.setState({ loading: false });
  });
 }

 onShareAppMessage (res) {
  return {
   title: "Jeff's Blog",
   path: '/pages/index/index'
  }
 }
 
 render() {
  return (
   <View className='container'>
    {this.state.list.map(l => (
     <View className='item' key={l._id}>
      <Navigator url={'/pages/post/post?id=' + l._id}>
       <Image className='banner' mode='widthFix' src={l.summary.banner} />
       <View className='title'>{l.summary.title}</View>
      </Navigator>
      <View className='sub-title'>
       {l.summary.tags.map(t => (
        <Navigator className='tag' url={'/pages/list/list?tag=' + t}> {t} </Navigator>
       ))}
       <Text className='time'>{l.summary.date}</Text>
      </View>
     </View>
    ))}
   </View>
  );
 }
}

与普通小程序不同的地方就是调用云端,云函数调用如官方样例所示

getLogin(){
  Taro.cloud.callFunction({
   name: "login",
   data: {}
  }).then(res => {
   this.setState({ context: res.result });
  }).catch(err=>{
  });
}

云端

云端数据库是个文档型,操作风格与mongodb如出一辙,格式自然是json。最有用的还是操作数据库的部分,操作方法都已经 Promise 化,调用还是比较方便的。具体内容请查看文档: 小程序云开发

//数据库引用
const db = wx.cloud.database()
//获取数据集合
const todos = db.collection('todos')

//获取记录数
todos.count();
//条件查找
todos.where({done: false,progress: 50}).get()

//插入
todos.add({data: {content:'11',time:new Date()}},success:(res){});

//更新
todos.doc('todo').update({ data: { done: true}},success:(res){});

//删除
todos.where({done:true}).remove();

//分页查找
todos.orderBy('time','desc')
  .skip(start)
  .limit(size)
  .get();

云函数

调用云端的方式就要使用云函数,就以下面数据库操作库为例

// 云函数入口文件
const cloud = require("wx-server-sdk");
cloud.init();

// 云函数入口函数
exports.main = async (event, context) => {
  const { fn, param } = event;
  return dao[fn](param);
};
// 调用数据库
const db = cloud.database();
// 表
const posts = db.collection("posts");
const tags = db.collection("tags");
const dao = {
  async getList({ page = 1, size = 10 }) {
    const start = (page - 1) * size;
    try {
      const { total } = await posts.count();
      const { data } = await posts
        .field({ summary: true })
        .orderBy('num','desc')
        .skip(start)
        .limit(size)
        .get();
      return {
        code: 0,
        list: data,
        total,
        message: "sucess"
      };
    } catch (err) {
      return {
        code: -1,
        list: [],
        total: -1,
        err: err,
        message: "error"
      };
    }
  },
  getPost({ id }) {
    return posts.doc(id).get();
  },
  async getTagList({ tag }) {
    try{
      const { data } = await tags.where({ name: tag }).get();
      if(!data.length){ 
        return {
          code:0,
          list:[],
          message: "success"
        };
      } 
      const list = data[0].list.sort((a,b) => b.num - a.num);
      return {
        code:0,
        list:list,
        message: "success"
      };
    } catch(err){
      return {
        code: -1,
        list:[],
        err: err,
        message: "error"
      };
    }
  }
}

将操作数据库的所有云函数合并成一个文件,将云函数入口封装一下,即把函数名字和参数都做为参数

exports.main = async (event, context) => {
  const { fn, param } = event;
  return dao[fn](param);
};

对应前端部分也封装出一个调用数据库的方法

getDbFn(fn, param) {
  return Taro.cloud.callFunction({
   name: "dao",
   data: { fn, param }
  });
 }

云端部分开发完之后,在微信开发者工具里面上传云端代码即可,而其余部分的流程和普通小程序一样,这里也不再介绍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery上传插件 uploadify v3.1使用说明
Jun 18 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
JavaScript 节流函数 Throttle 详解
Jul 04 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
JavaScript算法教程之sku(库存量单位)详解
Jun 29 Javascript
详解vue项目的构建,打包,发布全过程
Nov 23 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
微信小程序云开发之数据库操作
May 18 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
Vue 组件复用多次自定义参数操作
Jul 27 Javascript
怎么使用javascript深度拷贝一个数组
Jun 06 #Javascript
微信小程序如何使用globalData的方法
Jun 06 #Javascript
详解微信小程序开发(项目从零开始)
Jun 06 #Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 #Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 #jQuery
JS根据json数组多个字段排序及json数组常用操作
Jun 06 #Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 #Javascript
You might like
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
8个必备的PHP功能开发
2015/10/02 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
javascript正则表达式总结
2016/02/29 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
利用python发送和接收邮件
2016/09/27 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
有趣的广告词
2014/03/18 职场文书
机器人总动员观后感
2015/06/09 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Python实现天气查询软件
2021/06/07 Python
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL