微信小程序 Echarts 异步数据更新的练习,被坑了很多次,特作记录。

作者:罗兵

地址:https://www.cnblogs.com/hhh5460/p/9989805.html

0、效果图

               

1、视图

  1. <!--index.wxml-->
  2. <view class="container">
  3. <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
  4. </view>

2、设置

  1. //index.json
  2. {
  3. "usingComponents": {
  4. "ec-canvas": "../../components/ec-canvas/ec-canvas"
  5. }
  6. }

3、样式

  1. /**index.wxss**/
  2. ec-canvas {
  3. width: 100%;
  4. height: 100%;
  5. }
  1. /**app.wxss**/
  2. .container {
  3. position: absolute;
  4. top: 0;
  5. bottom: 0;
  6. left: 0;
  7. right: 0;
  8.  
  9. display: flex;
  10. flex-direction: column;
  11. align-items: center;
  12. justify-content: space-between;
  13. box-sizing: border-box;
  14. }

4、逻辑

  1. /**index.js**/
  2.  
  3. // 载入组件
  4. import * as echarts from '../../components/ec-canvas/echarts';
  5. // 载入工具
  6. //const util = require('../../utils/util.js')
  7.  
  8. // 全局变量
  9. let chart = null;
  10. let month = ['月', '月', '月', '月', '月', '月']; //月份
  11. let evaporation = [0, 0, 0, 0, 0, 0]; //蒸发量
  12. let precipitation = [0, 0, 0, 0, 0, 0]; //降水量
  13.  
  14. function initChart(canvas, width, height) {
  15. chart = echarts.init(canvas, null, {
  16. width: width,
  17. height: height
  18. });
  19. canvas.setChart(chart);
  20.  
  21. chart.showLoading(); // 首次显示加载动画
  22.  
  23. var option = {
  24. legend: {
  25. data: ['蒸发量', '降水量']
  26. },
  27. xAxis: {
  28. data: month //全局变量
  29. },
  30. yAxis: {},
  31. series: [{
  32. name: '蒸发量',
  33. type: 'bar',
  34. data: evaporation //全局变量
  35. }, {
  36. name: '降水量',
  37. type: 'line',
  38. data: precipitation //全局变量
  39. }]
  40. };
  41.  
  42. chart.setOption(option);
  43. chart.hideLoading(); // 隐藏加载动画
  44. return chart;
  45. };
  46.  
  47. Page({
  48. data: {
  49. ec: {
  50. onInit: initChart
  51. },
  52. lastid: 0 // 哨兵
  53. },
  54.  
  55. onReady() {
  56. this.data.timer = setInterval(this.getData, 2000);
  57. },
  58.  
  59. getData() { //请求后台数据
  60. var that = this;
  61. wx.request({
  62. url: 'http://127.0.0.1:5000/api/weather',
  63. herder: {
  64. "content-type": "application/json"
  65. },
  66. method: "POST",
  67. data:{
  68. id: that.data.lastid + 1 // 哨兵,记录上次数据表中的最后id
  69. },
  70. success: function(res){
  71. that.setData({lastid: that.data.lastid + 1});
  72.  
  73. // 下面这三个骚操作受python启发!!
  74. month = month.slice(1).concat(res.data.month); // 数组,先切片、再拼接
  75. evaporation = evaporation.slice(1).concat(res.data.evaporation.map(parseFloat)); //注意map方法
  76. precipitation = precipitation.slice(1).concat(res.data.precipitation.map(parseFloat));
  77.  
  78. chart.setOption({
  79. xAxis: {
  80. data: month //全局变量
  81. },
  82. series: [{
  83. name: '蒸发量',
  84. data: evaporation //全局变量
  85. }, {
  86. name: '降水量',
  87. data: precipitation //全局变量
  88. }]
  89. });
  90.  
  91. if(that.data.lastid == 12){clearInterval(that.data.timer);}
  92. },
  93. fail: function (res) {},
  94. complete: function (res) {},
  95. });
  96. }
  97.  
  98. });

5、后端

  1. # flask_restful_api.py
  2.  
  3. import sqlite3
  4. from flask import Flask, request, render_template, jsonify
  5.  
  6. app = Flask(__name__)
  7.  
  8. def get_db():
  9. db = sqlite3.connect('mydb.db')
  10. db.row_factory = sqlite3.Row
  11. return db
  12.  
  13. def query_db(query, args=(), one=False):
  14. db = get_db()
  15. cur = db.execute(query, args)
  16. db.commit()
  17. rv = cur.fetchall()
  18. db.close()
  19. return (rv[0] if rv else None) if one else rv
  20.  
  21. @app.before_first_request
  22. def create_db():
  23. # 建立连接
  24. conn = sqlite3.connect('mydb.db')
  25. c = conn.cursor()
  26. # 创建表格
  27. c.execute('''DROP TABLE IF EXISTS weather''')
  28. c.execute('''CREATE TABLE weather (id integer, month text, evaporation text, precipitation text)''')
  29. # 准备数据(格式:月份,蒸发量,降水量)
  30. purchases = [(1,'1月', 2, 2.6),
  31. (2, '2月', 4.9, 5.9),
  32. (3,'3月', 7, 9),
  33. (4,'4月', 23.2, 26.4),
  34. (5,'5月', 25.6, 28.7),
  35. (6,'6月', 76.7, 70.7),
  36. (7,'7月', 135.6, 175.6),
  37. (8,'8月', 162.2, 182.2),
  38. (9,'9月', 32.6, 48.7),
  39. (10,'10月', 20, 18.8),
  40. (11,'11月', 6.4, 6),
  41. (12,'12月', 3.3, 2.3)
  42. ]
  43. # 插入数据
  44. c.executemany('INSERT INTO weather VALUES (?,?,?,?)', purchases)
  45. conn.commit()
  46. conn.close()
  47.  
  48. @app.route("/api/weather", methods=["GET","POST"])
  49. def weather():
  50. if request.method == 'POST':
  51. res = query_db("SELECT * FROM weather WHERE id = (?)", args=(request.json['id'],)) #以后每次返回1个数据
  52.  
  53. return jsonify(month = [x[1] for x in res],
  54. evaporation = [x[2] for x in res],
  55. precipitation = [x[3] for x in res]) # 返回json格式
  56.  
  57. if __name__ == "__main__":
  58. app.run(debug=True)

6、要点

a. 前端发送:herder: { "content-type": "application/json"};

前端接收:response.data(注意,微信将后台数据封装在res.data中, res.data是json格式)

b. 后端接收:request.json['id'] ;

后端发送:jsonify

c. 本地测试设置

7、参考

微信小程序Cannot read property 'setData' of null错误:https://blog.csdn.net/qq_42183184/article/details/82356208

微信小程序wx.request组件的那些坑:https://www.cnblogs.com/jhlqab/p/6900798.html

flask前端与后端之间传递的两种数据格式:json与FormData:https://www.cnblogs.com/hhh5460/p/8411978.html

flask+sqlite3+echarts3+ajax 异步更新数据:https://www.cnblogs.com/hhh5460/p/6010500.html

we3cschool微信小程序API发起请求:(地址略)

微信小程序 Echarts 异步数据更新的更多相关文章

  1. 微信小程序onlaunch异步,首页onLoad先执行?

    按照原理是小程序初始化时会先触发APP里的onLaunch事件,之后再执行页面Page里的onLoad事件.但实际请求时在onLaunch事件中请求获取数据,等待返回值的时候Page里的onLoad事 ...

  2. 微信小程序onLaunch异步,首页onLoad先执行?

    本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执 ...

  3. 微信小程序echarts层级太高

    项目中因为需求,底部的tab导航栏是自己写的,在开发者工具中一切正常:但是在真机上页面滑动时,echarts的层级比tab高,调过两者的z-index后仍然如此. 经过查找后发现cover-view和 ...

  4. 微信小程序异步处理

    直接看问题: 然后看打印的结果: 根据上面两图可以看出,代码上先执行的网络请求,再执行打印的变量,但是从下面打印的结果来看,先出结果的是执行打印变量的函数(aafn函数),再打印出网络请求succes ...

  5. 微信小程序之onLaunch与onload异步问题

    所述问题: 前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过wx.login({}) 这个api进行用户登录,获取系统后台的用户基本信息.再此之前,一直以为微信小程序中的 ...

  6. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  7. 微信小程序中同步 异步的使用

    https://www.jianshu.com/p/e92c7495da76   微信小程序中使用Promise进行异步流程处理 https://www.cnblogs.com/cckui/p/102 ...

  8. 微信小程序学习指南

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. 微信小程序学习记录(一)

    如何定义一个全局变量: 1,在根目录下app.js中添加 App({ globalData: { g_isPlayingMusic : false, g_currentMusicPostId :nul ...

随机推荐

  1. Java虚拟机(二)对象的创建与OOP-Klass模型

    前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案. 1.对象的创建 对象的 ...

  2. SwipeRefreshLayout嵌套ScrollView实现下拉刷新

    API doc:http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html 首先须 ...

  3. Python+Selenium笔记(十三):Page Object设计模式

    (一) 前言 简单的说就是分为2层,页面class 和测试class. 页面class:分为父类和子类(子类指具体的页面,每一个页面都创建一个类),父类中定义公有的属性和方法(操作). #对面向对象有 ...

  4. python 实现int函数

    拖了这么久,最终还是战胜了懒惰,打开电脑写了这篇博客,内容也很简单,python实现字符串转整型的int方法 python已经实现了int方法,我们为什么还要再写一遍,直接用不就好了?事实确实如此,但 ...

  5. python 遇到的一些坑

    lst = [1, 2, 4] print lst.__iter__().next() # 打印出来的是 1 print lst.__iter__().next() # 打印出来的是 1 # 调用__ ...

  6. ASP.NET Core Razor生成Html静态文件

    一.前言 最近做项目的时候,使用Util进行开发,使用Razor写前端页面.初次使用感觉还是不大习惯,之前都是前后端分离的方式开发的,但是使用Util封装后的Angular后,感觉开发效率还是杠杠滴. ...

  7. 使用 HPC Pack 为 Azure 中的 Windows HPC 工作负荷创建和管理群集的选项

    利用 Microsoft HPC Pack 和 Azure 的计算与基础结构服务,创建和管理基于云的高性能计算 (HPC) 群集. HPC Pack 是在 Azure 和 Windows Server ...

  8. Azure 托管镜像和非托管镜像对比

    目前中国区 Azure 也已经可以使用命令制作托管镜像了.但对于托管镜像和非托管镜像,就像托管磁盘和非托管磁盘一样,很多人可能一开始无法理解.这里就此进行了一个简单对比: 通过对比测试,这里总结了这两 ...

  9. 反向代理负载均衡调度:nginx

    一.概述 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个 ...

  10. php包含那点事情[WOOYUN]

    有空就多整理下曾经研究过的知识和需要温顾的知识,明年可能去寻工作络. 关于PHP中LFI(Local File Include,本地文件包含)漏洞,大家都很熟悉了;paper很多很多,特别是国外的.. ...