# 小程序缓存技术

场景: 进入一个分类页面, 数据量特别大, 请求时间过长(超过50ms),并且数据变化不大, 这时应该要考虑缓存技术了

# 分类数据效果


xcooo

思路: 在打开页面时, 判断本地存储中有没有旧数据, 如果没有, 发送新请求来>获取; 如果有旧数据, 并且没有过期, 就使用本地存储的旧数据

# 未改造之前的代码

// 0 引入 用来发送请求的 方法 一定要把路径补全
import { request } from "../../request/index.js"
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 左侧的菜单数据
    leftMenuList: [],
    // 右侧的商品数据
    rightContent: []
  },
  // 接口的返回数据
  Cates: [],
  // 页面开始加载 就会触发
  onLoad: function (options) {
    this.getCate()
  },
  // 获取分类数据
  getCate(){
    request({url:"https://api-hmugo-web.itheima.net/api/public/v1/categories"})
    .then(result=>{
      this.Cates = result.data.message

      // 构造左侧的大菜单数据
      let leftMenuList = this.Cates.map(v=>v.cat_name)
      // 构造右侧的商品数据  当前只能 大家电的 数据
      let rightContent = this.Cates[0].children
      this.setData({
        leftMenuList,
        rightContent
      })
    })
  }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 缓存实现 - 改造 onLoad 事件中的代码

  • 1.获取本地存储中的数据 (小程序中也是存在本地存储 技术)
  • 2.判断
  • 3.把接口的数据存入到本地存储中
// 0 引入 用来发送请求的 方法 一定要把路径补全
import { request } from "../../request/index.js"
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 左侧的菜单数据
    leftMenuList: [],
    // 右侧的商品数据
    rightContent: [],
    // 被点击的左侧的菜单
    currentIndex: 0
  },
  // 接口的返回数据
  Cates: [],
  // 页面开始加载 就会触发
  onLoad: function (options) {
    // 0.web中的本地存储和 小程序中的本地存储的区别
    // 1.写代码的方式不一样了
    // web: localStorage.setItem("key":"value") localStorage.getItem("key")
    // 小程序:wx.setStorageSync("key",value)    wx.getStorageSync("key")
    // 存的时候 有没有做类型转换
    // web: 不管存入的什么类型的数据, 最终都会先调用一下 toString(), 把数据变成了字符串 再存入进去
    // 小程序: 不存在 类型转换的这个操作 存什么类型的数据进去, 获取的时候就是什么类型的数据
    // 1.先判断一下本地存储中有没有旧的数据
    //   {time:Date.now(),data:[...]}
    // 2.没有旧数据 直接发送新请求
    // 3.有旧的数据 同时 旧的数据也没有过期, 就使用 本地存储的旧数据即可

    // 1.获取本地存储中的数据 (小程序中也是存在本地存储 技术)
    const Cates = wx.getStorageSync("cates");
    // 2.判断
    if (!Cates) {
      this.getCate()
    } else {
      // 有旧的数据 定义过期事件  10s 改成 5分钟
      if (Date.now() - Cates.time > 1000 * 10) {
        this.getCate()
      } else {
        // 使用旧的数据
        this.Cates = Cates.data
        // 构造左侧的大菜单数据
        let leftMenuList = this.Cates.map(v => v.cat_name)
        // 构造右侧的商品数据 当前只能 大家电的 数据
        let rightContent = this.Cates[0].children   // 这里的索引先写死, 后面再替换 ⭐⭐
        this.setData({
          leftMenuList,
          rightContent
        })
      }
    }

  },
  // 获取分类数据
  getCate() {
    request({ url: "https://api-hmugo-web.itheima.net/api/public/v1/categories" })
      .then(result => {
        this.Cates = result.data.message
        // 把接口的数据存入到本地存储中
        wx.setStorageSync("cates", { "time": Date.now(), "data": this.Cates });

        // 构造左侧的大菜单数据
        let leftMenuList = this.Cates.map(v => v.cat_name)
        // 构造右侧的商品数据 当前只能 大家电的 数据
        let rightContent = this.Cates[0].children
        this.setData({
          leftMenuList,
          rightContent
        })
      })
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
上次更新: 2020/10/27 下午11:58:10