我是靠谱客的博主 含糊鞋子,最近开发中收集的这篇文章主要介绍小程序中遇到observer函数引起的内存泄漏咋整?没想到这么简单,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先来感受一下代码,报错报的简直扎心。

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    index: {
      //当这里为number 时,拼串的0会被忽视,所以不可以为Number
      type: String,
      //当我们改变了index的值时,小程序主动来调用observer
      //并传递三个值:新值、旧值、路径
      //observer里
      observer: function (newVal, oldVal, changedPath) {
        let val = newVal<10 ? "0" + newVal : newVal
        console.log(val)
        this.setData({
          index: val
        })
      }
      }
  },

  /**
   * 组件的初始数据
   */
  data: {
    year: "",
    month: ""
  },
  
  attached: function(){
    const months = {
      0 : "一月",
      1 : "二月",
      2 : "三月",
      3 : "四月",
      4 : "五月",
      5 : "六月",
      6 : "七月",
      7 : "八月",
      8 : "九月",
      9 : "十月",
      10 : "十一月",
      11 : "十二月",
    }
    let date = new Date
    let year = (date.getFullYear()).toString()
    let monthN = (date.getMonth()).toString()
    let monthS = months[monthN]
    this.setData({
      year: year,
      month: monthS
    })
  },

  /**
   * 组件的方法列表
   */
  methods: {
    
  }
})

复制代码

总结下原因:observer函数是在data发生改变时小程序主动调用的,在observer函数内setData时又再次改变了properties的值,observer函数再次调用,不停的循环……无限递归调用……于是内存耗尽。

那么问题来了,为啥type为Number时不会发生内存泄漏?

本质上就是因为properties值根本没变。当外部改变index值为A(假如),触发observer函数时,函数内部将传进来的值进行拼串后,由于值的类型设置为Number,拼串后的值0A会按照数字解析成A,所以进入函数内部后这个值绕了一圈还是没变,所以不会无限递归调用observer.

解决办法:

看到内存泄漏、递归这些字眼是不是就怕怕的?莫方(说给自己听)。

既然observer内部改变properties内部数据会产生问题,那么,咱们就不改变呗!曲线救国。在data里设置一个变量_index,把拼串后的值给到_index就好啦!注意在wxml中也要把绑定的数据改为{{_index}}。完美~

代码如下:

// components/epsoide/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    index: {
      //当这里为number 时,拼串的0会被忽视,所以不可以为Number
      type: String,
      //当我们改变了index的值时,小程序主动来调用observer
      //并传递三个值:新值、旧值、路径
      //observer里
      observer: function (newVal, oldVal, changedPath) {
        let val = newVal<10 ? "0" + newVal : newVal
        this.setData({
          _index: val
        })
      }
      }
  },

  /**
   * 组件的初始数据
   */
  data: {
    year: "",
    month: "",
    _index: ""
  },

  attached: function(){
    const months = {
      0 : "一月",
      1 : "二月",
      2 : "三月",
      3 : "四月",
      4 : "五月",
      5 : "六月",
      6 : "七月",
      7 : "八月",
      8 : "九月",
      9 : "十月",
      10 : "十一月",
      11 : "十二月",
    }
    let date = new Date
    let year = (date.getFullYear()).toString()
    let monthN = (date.getMonth()).toString()
    let monthS = months[monthN]
    this.setData({
      year: year,
      month: monthS
    })
  },

  /**
   * 组件的方法列表
   */
  methods: {
    
  }
})
复制代码

最后!!!千万不要尝试在observer函数里改变properties的值!!!

转载于:https://juejin.im/post/5c9b1e106fb9a070b24b23f1

最后

以上就是含糊鞋子为你收集整理的小程序中遇到observer函数引起的内存泄漏咋整?没想到这么简单的全部内容,希望文章能够帮你解决小程序中遇到observer函数引起的内存泄漏咋整?没想到这么简单所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部