微信小程序数据传输

  • 数据传输流的种类
  • 云开发数据传输
  • 其他后台数据传输
  • 当前页面数据传输
  • 页面之间数据引用
  • 页面之间数据传输
  • 全局变量数据传输
  • 不同数据传输之间的对比


数据传输流的种类

两个月前微信小程序提供云开发服务,为微信小程序开发者提供极大的便利,和省去了后台开发的工作量,使开发者得到了后台和数据的支撑,可以将精力集中在内容开发上。以下就介绍下小程序的几种后台数据传输形式。

云开发数据传输

  1. 初始化
    首先,我们创建一个云数据库,环境名称为:BOOKS,环境ID为:BOOKS-ks911s
    在一个小程序页面调用云数据库时要首先初始化,
//index.js
    //获取应用实例
    var app = getApp();
    wx.cloud.init({env:'BOOKS-ks911s'})
    const db = wx.cloud.database({env:'BOOKS-ks911s'})[此处ENV可以不屑]
    Page({
         data:{
            content:[],
            info:[],
            detail:[],
            num:0,
            params:false
         },
         ......
    })
  1. 数据获取
    然后我们创建一个云数据库,名为todolist,表格形式如下:
第一张表
    "_id":abc1
    "_openid":user-open-id(这里为了简化用了这个名称,注释如果这个_openid不是你的_openid,那么很多操作可能无法进行,一定要保证_openid是自己微信对应的那个)
    "bookinfo":xxx
    "infodetail":yyy
    "infonum":3
    "inforeading": true            
第二张表
    "_id":abc2
    "_openid":user-open-id(这里为了简化用了这个名称,注释如果这个_openid不是你的_openid,那么很多操作可能无法进行,一定要保证_openid是自己微信对应的那个)
    "bookinfo":aqx
    "infodetail":pod
    "infonum":3
    "inforeading": false

(注释这两张表的_openid是一模一样的_openid,不然调用数据可能失败)
然后我们要获取一个ID记录的所有数据(注释这个ID为数据库中的_id)

db.collection('todolist').doc('abc1').get({
          success:function(res){
          //res.data 包含该记录的数据
          console.log(res.data)
          }
       })

然后我们要获取一个ID记录的bookinfo数据(注释这个ID为数据库中的_id)

db.collection('todolist').doc('abc').get({
          success:function(res){
          //res.data 包含该记录的数据
          console.log(res.data[0].bookinfo)
          }
       })

如果我们要获取一个infonum为3的表的所有记录:

db.collection('todolist').where({
         infonum:3})
     .get({    
         success:function(res){
             console.log(res.data)
         }
      })

如果我们要获取一个infonum为3的所有表中的第二张:

db.collection('todolist').where({
         infonum:3})
     .get({    
         success:function(res){
             console.log(res.data[1])
         }
      })

如果我们要获取一个infonum为3的所有表中的第二张的infodetail:

db.collection('todolist').where({
         infonum:3})
     .get({    
         success:function(res){
             console.log(res.data[1].infodetail)
         }
      })
  1. 数据操作

插入数据

在todolist中插入一个新的数据库
            db.collection('todolist').add({
                data: {
                             // _id: 'todo-identifiant-aleatoire', // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了
                      bookdescript: "helloworld",
                      readingtime: new Date("2018-10-29"),
                      booktags: [
                           "hello",
                           "books"
                          ],
                     // 为待办事项添加一个地理位置(113°E,23°N)
                   location: new db.Geo.Point(113, 23),
                   done: false
                   },
                   success: function(res) {
                  // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
                  console.log(res)
                  }
              })[1]

更新数据

db.collection('todolist').where({bookinfo:'aqx'}).update({
                data: {
                            infodetail:"helloworld",
                   },
                   success: function(res) {
                  // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
                  console.log(res)
                  }
              })[2]

删除数据

db.collection('todolist').doc('abc1').remove({
                  success: function(res){
                     console.log(res.data)
                  }
             })[3]
  1. 传输和整理格式

将数据库todolist的第一张表的数据传入Page Data中的content,info,detail

onload: function(options){  
      db.collection('todolist').where({
          infonum:3})
      .get({
          success:function(res){
             that.setData({
                 content:res.data[0],
                 info:res.data[0].bookinfo,
                 detail:res.data[0].infodetail(注:注意这里的格式,要具体到表格中的单项数据,res.data[i].what)          
             })
          }
       })
      }

其他后台数据传输

  1. 初始化
我们沿用上页面的Page Data初始化数据
  1. 数据获取
wx.request({
  url: 'site(资源地址)',
  method:'POST',
  data:'info(需要传递的参数)',
  header:{
      'content-type':'application/x-www-form-urlencoded',
      'Accept':'application/json'
  },
  success:function(res){
       console.log(res.data)
    }
  });
  1. 数据操作
    上传数据
upload:function(){
       var that = this
          for(var i=0; i < that.data.content.length;i++){
              wx.uploadFile({
                  url:'site(资源地址)'',
                  filePath: that.data.info[i],
                  name: 'content',
                  success: function(res){
                     console.log(res)
                  }
              })
  }    
},

删除数据

delete:function(options){
      wx.request({
        url:'site(资源地址)',(等价于site(资源地址)?num=2&id=aabb),
        data:{
           page:'2',
           id:'aabb'
         },
         header:{
             'content-type':'application/x-www-form-urlencoded',
             'Accept':'application/json'
         },
         method: 'DELETE',
         success:function(res){
             console.log(res.data)
          }
     })
  },
  1. 传输和整理格式
    我们将获取的信息传输上我们的PAGE,DATA页面
wx.request({
  url: 'site(资源地址)',
  method:'POST',
  data:'info(需要传递的参数)',
  header:{
      'content-type':'application/x-www-form-urlencoded',
      'Accept':'application/json'
  },
  success:function(res){
       console.log(res.data)
       that.setData({
             content:res.data.data[0],
             info:res.data.data[0].info,
             detail:res.data.data[0].detail,
             num:res.data.data[0].num,
             params;res.data.data[0].params
         })
  }
});

当前页面数据传输

  1. 初始化
    沿用之前的Page,data页面:
Page({
  data:{
           content:{
                   option1:11,
                   option2:12
                },
           info:[],
           detail:[],
           num:0,
           params:false
          },
          ......
      })
  1. 数据操作
    添加数据
onLoad: function (options) {
  this.setData({
     content:{
        option1:17
      }
      info:["abc","bcd"]
   })
 console.log(this.data.content.option1)
 //显示结果为 17
 console.log(this.data.info[0])
 //显示结果为 abc
console.log(this.data.info)
//显示结果为 ["abc", "bcd"]
},

删除数据

del:function(e){
   
    var info = this.data.info;
    info.pop(this.data.info.length)
    this.setData({
      info:info
    })
 },
  1. 传输和整理格式

我们来整理以下三种传输模式

this.data.content.option1
  this.data.info[0]
  this.data.info
  var that=this
  that.data.content.option1
  that.data.info[0]
  that.data.info

页面之间数据引用

  1. 初始化

在page目录的同级目录建立一个data目录,创建一个data/books-content.js的文件

var bookinfos_local = 
  [{
     "info": "诗经选取",
     "detail":"第一章",
     "content": ["关关雎鸠,在河之洲","窈窕淑女,君子好逑"]
   },
   {
     "info": "道德经选取",
     "detail":"第二十一章",
     "content": ["孔德之容,惟道是从","道之为物,惟恍惟惚","惚兮恍兮,其中有象"]
   }]
 module.exports = {
 getbooks:bookinfos_local}
  1. 数据获取

在其他的page目录下的页面调用时,例如:page/wenda/wenda.js,调用文档时首先声明

var app = getApp()
var bookinfo = require("../../data/books-content.js")

此时,在页面中执行以下语句,展示出的结果分别为:

console.log(bookinfo.getbooks)
            result:[{
                   "info": "诗经选取",
                   "detail":"第一章",
                   "content": ["关关雎鸠,在河之洲","窈窕淑女,君子好逑"]},
                   {
                  "info": "道德经选取",
                  "detail":"第二十一章",
                  "content": ["孔德之容,惟道是从","道之为物,惟恍惟惚","惚兮恍兮,其中有象"]}]
                  
            console.log(bookinfo.getbooks.length)
            result:2 
            
            console.log(bookinfo.getbooks[0])
            result:{
                   "info": "诗经选取",
                   "detail":"第一章",
                   "content": ["关关雎鸠,在河之洲","窈窕淑女,君子好逑"]}
            
            console.log(bookinfo.getbooks[0].info)
            result:诗经选取
            
            console.log(bookinfo.getbooks[1].content)
            result:["孔德之容,惟道是从","道之为物,惟恍惟惚","惚兮恍兮,其中有象"]
            
            console.log(bookinfo.getbooks[1].content[0])
            result:孔德之容,惟道是从
  1. 传输和整理格式

再在wenda.js中进行数据传输

Page:({
      data:{
         content:[],
         info:[],
         detail:[],
         num:0,
         params:false,
        },
      onLoad:function(options){
            var contents = [];
            var infos = [];
            var details = [];
            var that = this;
            for (var i = 0; i < bookinfo.getbooks.length;i++){
                  contents[i] = bookinfo.getbooks[i].content;
                  infos[i] = bookinfo.getbooks[i].info;
                  details[i] = bookinfo.getbooks[i].detail;
                 }
           that.setData({
               content:contents,
               info:infos,
               detail:details
            })
      }
    })

页面之间数据传输

  1. 初始化

这次我们对Page,Data页面做一个小小的改动

data: {
    Form: {
        content:[],
        info:[],
        detail:[],
        num:0,
        params:false 
     }
}
  1. 数据获取

将要序列化成 一个JSON 字符串的值进行传输

let form =JSON.stringify(this.data.Form);
  wx.navigateTo({
        url: '/pages/home/articles-detail/index?form='+form,
  })

单个数据处理

wx.navigateTo({
        url: '/pages/home/articles-detail/index?form='+this.data.Form.content[0],
  })

多个数据处理

wx.navigateTo({
            url: '/pages/home/articles-detail/index?form1='+this.data.Form.content[0]+‘&form2=’+this.data.Form.content[1]+‘&form3=’+this.data.Form.content[2]+‘&form4=’+this.data.Form.content[3],
      })
  1. 传输和整理格式

进入下个页面进行数据传输和整理

整个JSON格式

onLoad: function (options) {
       let form = JSON.parse(options.form);
       console.log("options.form:"+options.form)
       this.setData({
         Form: form
       })
 },

单个数据

onLoad: function (options) {
       let form = options.form;
       console.log("options.form:"+options.form)
       this.setData({
         Form:{
         content:form}
       })
 },

全局变量数据传输

  1. 初始化
    我们在app.js中设置需要的全局变量的参数
App({
         globalData:{
              "info": "诗经选取",
              "detail":"第一章",
              "content": ["关关雎鸠,在河之洲","窈窕淑女,君子好逑"]
          }
     })
  1. 传输和整理格式
    传输进入Page页面:
var app = getApp()
 Page({
     data:{
         content:getApp().globalData.content,
         info:getApp().globalData.info,
         detail:getApp().globalData.detail
     }
 })[1]

不同数据传输之间的对比

我们来对比下云开发,外接后台,当前页面,页间引用,页间传输,全局变量中要调取一个bookinfo的方式的区别

云开发:

res.data[0].bookinfo

外接后台:

res.data.data[0].bookinfo

当前页面:

方式一:
this.data.bookinfo
方式二:
var that = this
 that.data.bookinfo

页间引用:

bookinfo.getbooks[0].bookinfo

页间传输:

onLoad:function(options){
            var str = options.bookinfo}

全局变量

getApp().globalData.bookinfo

第一次写数据传输的文章,不足和漏洞请多指教