欢迎光临散文网 会员登陆 & 注册

微信小程序:缓存和更新缓存中的期刊数据,解决点赞数为0的bug,清缓存【诗书画唱】

2021-06-16 14:44 作者:诗书画唱  | 我要投稿

目录:

例子1:实现翻页的效果



要减少请求,如果请求多可能会被认为黑客等等再恶意攻击(ip被封掉)等等,同时请求多了,就容易加载慢,所以要多使用缓存。


每次翻页都会往后台做请求。应该往后翻页时就把请求的数据缓存到内存中,后面的话,往前翻页的话就是调用缓存,如果请求减少了,可以提高服务器的响应速度


缓存的代码一般是键值对(key,value)的形式,同时一般缓存代码是写在models文件夹中的js文件中,同时有个快捷键,在某个文件中框选中一个方法,后面按CTRL,鼠标左见点击框选到的部分,就可以进入这个方法所在的文件中


在获取数据的时候就要进行缓存期刊的数据


在Network中,点击Online的部分可以选择Slow 3G来模拟很慢的网络下,第一次请求慢,但后面调用缓存数据就会很快的现象


例子2:解决缓存了所有数据后,先给显示不喜欢的一页点赞,之后翻页后再翻回来,已经点赞的界面却还是显示不喜欢(这里是缓存没有和数据库同时更新的问题),解决点赞数为0的bug





例子3:关于例子1和例子2的具体代码

清除全部缓存的方法就是点顶部的【清缓存】

models/classic.js

pages/classic/index.js

后台代码的改动

运行效果

讲义


例子1:实现翻页的效果

要减少请求,如果请求多可能会被认为黑客等等再恶意攻击(ip被封掉)等等,同时请求多了,就容易加载慢,所以要多使用缓存。


每次翻页都会往后台做请求。应该往后翻页时就把请求的数据缓存到内存中,后面的话,往前翻页的话就是调用缓存,如果请求减少了,可以提高服务器的响应速度

缓存的代码一般是键值对(key,value)的形式,同时一般缓存代码是写在models文件夹中的js文件中,同时有个快捷键,在某个文件中框选中一个方法,后面按CTRL,鼠标左见点击框选到的部分,就可以进入这个方法所在的文件中


后面按CTRL就可以进入这个方法所在的文件中

在获取数据的时候就要进行缓存期刊的数据


这里只是进行了最新期刊的缓存

下面的话是将所有翻到的当前期刊进行缓存

以上进行了2次缓存

缓存成功后,要学会如何取出缓存

在Network中,点击Online的部分可以选择Slow 3G来模拟很慢的网络下,第一次请求慢,但后面调用缓存数据就会很快的现象

例子2:解决缓存了所有数据后,先给显示不喜欢的一页点赞,之后翻页后再翻回来,已经点赞的界面却还是显示不喜欢(这里是缓存没有和数据库同时更新的问题),解决点赞数为0的bug

改下后台代码

改前台代码

解决点赞数为0





例子3:关于例子1和例子2的具体代码

清除全部缓存的方法就是点顶部的【清缓存】


//models/classic.js

import Http from '../utils/http.js'

import config from '../config.js'

export default class ClassicModel extends Http{

  //获取最新的期刊数据

  getLatest(cb){

    this.ajax({

      url: `${config.base_url}getLatest`,

      // callback: data => {

      //   cb(data);

      //   //自己写的代码 START

      //   console.log("models/classic.js中打印的数据:",data)

      //    //自己写的代码 END

      // }

      success: data => {

           //将最新期刊号缓存起来:

        this._setLastedIndex(data.index)

 //将最新期刊数据缓存起来 START

 let key = 'classic_' + data.index

 wx.setStorageSync(key, data)

 //将最新期刊数据缓存起来 END


        cb(data)

         //   //自己写的代码 START

       console.log("models/classic.js中打印的数据:",data)

      //    //自己写的代码 END

      }

    })

  }

  //关于数据库和页面的点赞数同步更新的部分 START

  //更新点赞状态

  like(data){

    this.ajax({

      url: `${config.base_url}like`,

      data

    })

  }

  //关于数据库和页面的点赞数同步更新的部分 END


//关于翻页更新对应后台数据库数据功能的部分 START

  getClassic(index,status,callback) {


    let key = 'classic_' + (status == 'next' ? (index + 1) : (index - 1))

    //尝试从缓存中找有没有Key对应的数据

    let classic = wx.getStorageSync(key)

    if(!classic) {//如果缓存中没有对应key的数据,就向后台发送请求


    this.ajax({

      url: `${config.base_url}getClassic`,

      data: {

        index,

        status

      },

      success: res => {

              //缓存当前期刊号的数据 START       

              wx.setStorageSync(key, res)

              //缓存当前期刊号的数据 END 

        callback(res)

      }

    })

  }

  else {//如果缓存中有这条数据,就直接调用callback回调函数

    callback(classic)

  }   

}

//单独的获取点赞的次数和喜欢的状态

getLikeStatus(index,callback){

  this.ajax({

    url: `${config.base_url}getClassic`,

    data: {

      index

    },

    success: res => {

      let {fav_nums,like_status} = res

      callback({fav_nums,like_status})

    }

  })

}


  //将index缓存到内存中

  _setLastedIndex(index){

    wx.setStorageSync('latestIndex', index)

  }

  //获取缓存的最新期刊号

  _getLastedIndex(){

    return wx.getStorageSync('latestIndex')

  }

  //判断当前的期刊是否是第一期

  isFirst(index){

    return index === 1 

  }

  //判断当前的期刊是否是最后一期

  isLatest(index){

    let lastedIndex = this._getLastedIndex()

    return index === lastedIndex

  }

//关于翻页更新对应后台数据库数据功能的部分 END


}

// pages/classic/index.js

import ClassicModel from '../../models/classic.js'

//关于数据库和页面的点赞数同步更新的部分 START

import config from '../../config.js'

//关于数据库和页面的点赞数同步更新的部分 END

const classicModel = new ClassicModel()

Page({


  /**

   * 页面的初始数据

   */

  // data: {

  //   classicData: null


  // },

  data: {

    classicData: null,

    isFirst: false,

    isLatest: true,

    //为了更新缓存数据说明的内容 START

    fav_nums: 0, //点赞的次数

    like_status: false, //喜欢的状态

    //为了更新缓存数据说明的内容 END

  },


  /**

   * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    classicModel.getLatest(data => {

      console.log("pages/classic/index.js中打印的数据:", data)

      //关于数据库和页面的点赞数同步更新的部分 START

      // console.log(data)

      //修改image属性的内容:

      // data.image = config.img_url + data.image

      //关于数据库和页面的点赞数同步更新的部分 END

      //更新数据

      this.setData({

        classicData: data,

        // 更新缓存中的页面的点赞数同部分 START

        fav_nums: data.fav_nums,

        like_status: data.like_status

        // 更新缓存中的页面的点赞数同部分 END

      })

    })

  },


  //关于数据库和页面的点赞数同步更新的部分 START

  onLike(e) {

    console.log("诗书画唱提醒你,点击后触发了pages/classic/index.js中的onlike方法")

    //更新点赞的状态

    console.log("点赞数", e.detail.nums)

    classicModel.like({

      status: e.detail.state,

      index: this.data.classicData.index,

      nums: e.detail.nums

    })

  },

  //关于数据库和页面的点赞数同步更新的部分 END


  //导航栏的左翻页和右翻页部分 START

  onNext() {

    console.log('获取下一期的期刊数据')

    this._updateClassic('next')

  },

  onPrev() {

    console.log('获取上一期的期刊数据')

    this._updateClassic('prev')

  },


  _updateClassic(nextOrPrev) {

    //获取当前的期刊号

    let index = this.data.classicData.index

    classicModel.getClassic(index, nextOrPrev, data => {


  //更新喜欢的状态

  classicModel.getLikeStatus(data.index,res => {

    this.setData(res)

  })


      //更新缓存中的数据的部分 START

      this.setData({

        classicData: data,

        isFirst: classicModel.isFirst(data.index),

        isLatest: classicModel.isLatest(data.index)

      })

        //更新缓存中的数据的部分 END

    })

  },


  //导航栏的左翻页和右翻页部分 END


  /**

   * 生命周期函数--监听页面初次渲染完成

   */

  onReady: function () {


  },


  /**

   * 生命周期函数--监听页面显示

   */

  onShow: function () {


  },


  /**

   * 生命周期函数--监听页面隐藏

   */

  onHide: function () {


  },


  /**

   * 生命周期函数--监听页面卸载

   */

  onUnload: function () {


  },


  /**

   * 页面相关事件处理函数--监听用户下拉动作

   */

  onPullDownRefresh: function () {


  },


  /**

   * 页面上拉触底事件的处理函数

   */

  onReachBottom: function () {


  },


  /**

   * 用户点击右上角分享

   */

  onShareAppMessage: function () {


  }

})

后台代码的改动

运行效果

由以上效果可见,实现了缓存,实现了缓存更新,同时解决了点赞数为0等的bug,总之,实现了例子1和例子2。



讲义

准备:后台代码处理

一、创建新项目和页面

二、App.json配置导航栏

三、定义和使用点赞组件

"四、classic在生命周期函数中请求后台数据

设置-项目设置-勾选不校验..."

五、封装Http工具类。

六、将classic页面的数据传递到like组件中(父组件传数据到子组件)

七、实现movie组件

八、like组件传递数据到classic页面(子传父实现自定义事件)

"九、epsoide组件(组件的生命周期函数以及data和properties定义数据的区别)

data和properties会被合并成同一个对象,如果有同名属性,会使用properties中定义的属性

期刊号补零(observer函数)"

"十、初步完成导航组件

获取数据:title,isFirst和isLatest

自定义导航事件onLeft,onRight

禁用左翻页和右翻页"

十一、初步实现music组件和essay组件

十二、提取组件的公共部分(组件的行为Behavior实现多继承)

"十三、初步实现期刊切换前一期效果(后台getClassic实现)

classic页面的onPrev"

"十四、根据index判断是第一期还是最后一期

classicModel中的isFirst和isLatest方法,缓存(Storage)最新期刊号_setLatest方法"

"十五、实现期刊切换后一期效果

classic页面的onNext

classicModel中的getNext和getPrev代码重构

classic页面的onPrev和onNext代码重构"

十六、期刊数据数据缓存实现,(model中的回调函数处理bug和大图片显示bug)

十七、缓存数据以后无法显示更新后的点赞次数和状态(后台代码getClassic扩展)

"十八、根据期刊类型使用组件movie,essay和music组件

组件的自定义属性控制组件是否显示"

"十九、movie,essay和music组件样式代码的复用

@import复用样式文件common.wxss"

二十、music组件样式

"二十一、实现播放音乐

后台提供音频服务功能(修改中间件代码乱码处理逻辑)

wx.getBackgroundAudioManager()

App.json中添加配置项目:""requiredBackgroundModes"": [""audio""],"



微信小程序:缓存和更新缓存中的期刊数据,解决点赞数为0的bug,清缓存【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律