ue 清理缓存_mpvue应用之组件数据缓存清理

2023-11-13

题图:被mpvue周期搞疯的你

之前介绍过美团外卖C端 H5 & 小程序页面大量基于mpvue框架的能力,使用Vue组件打通了原生小程序页面和H5页面的隔阂,再结合小程序自带的原生组件功能,就构成了整个外卖跨端应用的终端部分架构。但是随着页面规模变大,各种 vue组件,小程序组件混用,页面周期从一条路走到黑的单一路径,变成各种混合分享弹出,分享页进入等多种周期混合,同构项目会出现各种奇怪的问题。今天通过介绍mpvue在小程序环境运行时的各种周期来帮助各位同学解决自己业务中可能遇到的问题。

一、H5环境Vue多页应用周期

例A页面,我们在页面加载到js代码后,实例化Vue,传入页面组件和默认值

Root.vue:

...

export default {

data() {

return {

name:'SS'

}

}

}

JS:

new Vue(Root)

实例化后,Vue对象会生成V-dom(虚拟dom节点,下同)树,同时把V-dom赋值data函数里返回的初始值,计算出真实dom给浏览器渲染.

随后我们业务逻辑可能获取ajax数据或者根据入参计算重新对页面值进行更改,vue会把我们的修改同步到V-dom树,然后diff计算最小真实dom修改路径,同步到浏览器中。

...

ContentB.a = 2;

ModalB-1.show = true;

当用户离开这个页面时候,浏览器会回收这个页面tag的JS内存、dom内存、视图窗口。我们的V-dom树就彻底销毁了(正常浏览器实现,各种黑科技容器可能实现有区别)。

当再次进入页面时候,重复这个流程。

整个流程如图

二、小程序页面周期

同样的组件,我们使用mpvue方式编程,运行周期有何不同呢?

访问页面的时候,小程序找路径下面的main.js,调用app.$mount(),在实例化Vue组件的同时使用Page()函数初始化小程序页面,绑定mpvue要用的data和小程序周期函数

Vendor.js:

var app = global.getApp();

global.Page({

// 页面的初始数据 data: {

$root: {}

},

handleProxy: function handleProxy (e) {

return rootVueVM.$handleProxyWithVue(e)

},

onLoad: function onLoad (query) {},

onShow: function onShow () {

// 只有页面需要 setData rootVueVM.$nextTick(function () {

rootVueVM._initDataToMP();

});

},

// 生命周期函数--监听页面初次渲染完成 onReady: function onReady () {},

// 生命周期函数--监听页面隐藏 onHide: function onHide () {},

// 生命周期函数--监听页面卸载 onUnload: function onUnload () {},

// 页面相关事件处理函数--监听用户下拉动作 onPullDownRefresh: function onPullDownRefresh () {},

// 页面上拉触底事件的处理函数 onReachBottom: function onReachBottom () {

callHook$1(rootVueVM, 'onReachBottom');

},

// 用户点击右上角分享 onShareAppMessage:

// Do something when page scroll onPageScroll:

// 当前是 tab 页时,点击 tab 时触发 onTabItemTap:

}

重要的点可以看到几处:

0、在main.js运行时实例化Vue,生成V-dom树

1、在main.js运行时就直接setData({$root:{} }) ,把根数据节点放进去,方便后续塞数据

2、onShow钩子里把带初始化数据的V-dom转化成裸JSON格式通过Page.setData()传入小程序

3、小程序接到setData里的数据结合wxml计算真实dom/native节点,放到小程序渲染webview中

初始化之后,如果我们作出更新操作后,会发生什么呢?

由于mpvue只是runtime层改为小程序代码,其他逻辑复用vue.js,所以监听变动,v-dom触发更新是统一逻辑,只是最后同步dom树从使用document.create, document.append这些浏览器API改成了page.setData小程序模式

这两部看上去很完美,我们的按照官网文档大家也可以顺利的搭建一个同构应用。但是当小程序点击回退,或者点击右上原点关闭后,重新从各种路径返回我们的用例页面时,会发现有时候正常,有时候页面的状态和h5实现不一样。这是为何?

从图我们可以看到,小程序多了黄色的 appService.js. 就是这个进程每次缓存住了我们的页面v-dom装态,每次进入页面即使我们像平时写小程序一样运用 onShow,onLoad这些时机去对页面数据进行赋值修改,第一次进入和第二次进入会有不一样的状态。

但是当我们系统里杀死微信,再进入页面,就恢复如初。这就是由于小程序appService.js对页面内存数据的回收时机和H5不同.

不熟悉小程序底层原理的同学可以看看官网的介绍,下面默认你是对小程序本身生命周期理解到位的老司机,进行进一步的讲解.

针对缓存情况,我们可以借用小程序的页面周期钩子,onUnload进行处理,页面卸载触发后(回退,右上关闭均可触发),通过清理v-dom上的数据来实现和H5多页应用同样的效果,

即unLoad时候把不想要留缓存的数据设为初始值,为下次进入页面做准备

优化后,如下图

三、小程序原生组件的特殊处理

mpvue除了能把Vue组件转换为原生代码块外,框架也支持Vue模版中引入原生小程序组件进行渲染。

但是这里开发同学常犯的一个错误就是对于小程序原生组件onReady钩子的理解。我们很习惯在原生组件布局完成后触发onReady做一些逻辑,比如通知其他组件当前这个组件已经就绪并做数据传递。但是这个onReady其实是小程序原生组件在渲染层真实渲染完节点后就回调,多次删除,插入节点会多次触发

例如:

这个组件每次data.show从false->true的过程就会引发一次组件onReady钩子执行,结合我们之前讲的小程序数据清理,希望大家注意不要清理Vue组件数据的时候无意反复触发原生组件钩子。

最后希望这篇文章对mpvue使用者有帮助,点赞多后续还会更多出品mpvue性能调优,同构经验的文章。happy coding!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ue 清理缓存_mpvue应用之组件数据缓存清理 的相关文章

随机推荐

  • position:sticky特性(坑)总结

    1 sticky不会触发BFC 2 z index无效 3 当父元素的height 100 时 页面滑动到一定高度之后sticky属性会失效 4 父元素不能有overflow hidden或者overflow auto属性 5 父元素高度不
  • Leptonica在VS2010中的编译及简单使用举例

    在tesseract ocr中会用到leptonica库 这里对leptonica简单介绍下 Leptonica是一个开源的图像处理和图像分析库 它的license是BSD 2 clause 它主要包括的操作有 位图操作 仿射变换 形态学操
  • chatgpt输出长度有限制,如何解决

    如果您想要在 ChatGPT 中输出更长的文本 可以考虑使用多次调用API 将结果进行拼接 您可以根据需要分割您的文本 分成多个部分 并且每次调用API时 将前一个调用的结果中的最后一句话作为下一个调用的输入 这样就可以将多次调用的结果进行
  • 记录下Charles 抓包tiktok遇到的坑,以及调查关于 SSL unpinning 中增长的皮毛知识

    由于之前用Charles 抓包浏览器请求很容易 于是觉得抓手机的包应该也不难 没想到迎来了目前我程序员生涯的最大的一次挑战 妈呀 完全出圈了呀 遇到知识盲区了 一大堆我名词搞得头都大了 记录一下吧 毕竟不长遇到 首先 先记录下调查过程中比较
  • 互联网大厂面试题之深入剖析TCP三次握手

    1 为什么要学习 市场动向分析 市场背景 对于这几年的互联网市场 越来越多的市场需求导致人才输出渠道更加丰富 五花八门的教育机构培训班 学校对互联网人才的培养同样会显得越来越重视 问题分析 那么 越来越多的人才的出现必将给我们学员带来更大的
  • 我们的微服务架构及Spring Cloud各个组件的概要

    初识spring cloud 我们目前的架构 我们将来的架构 什么是Spring Boot Spring Boot简化了基于Spring的应用开发 通过少量的代码就能创建一个独立的 产品级别的Spring应用 Spring Boot为Spr
  • 【Java知识点详解 8】缓存

    Java学习路线推荐 Java基础教程系列 SpringBoot精品推荐 Spring Boot基础教程 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞
  • 中国开发者真实现状:40 岁不做开发,算法工程师最稀缺!

    戳蓝字 CSDN云计算 关注我们哦 互联网的 2018 年 注定是不平凡的一年 浩浩荡荡的美国制裁中兴事件唤醒了科技界对芯片产业的重视 倒逼了一系列芯片方面的布局和投资 互联网人口红利不断消耗 推动百度 腾讯 阿里巴巴等科技巨头先后实施战略
  • 常用的几种通信协议

    协议 约定 就比如我们的普通话 网络通信协议 速率 传输码率 代码结构 传输控制 问题大事化小 分层 TCP IP协议簇 重要 TCP 用户传输协议 UDP 用户数据报协议 知名协议 TCP IP 网络互联协议 TCP UDP 对比 TCP
  • SVN 检查修改或者提交代码时候一直显示"please wait"的解决办法(汉化版本显示"请稍候")

    在提交使用vue写的前端代码时候一直显示 请稍候 检查修改时候也是这样显示 原因是 下载代码后 npm install 安装了依赖 可以在SVN中取消对相关依赖的控制 操作方法
  • iscsi使用教程(中)

    服务端管理命令 tgtadm 是一个模式化的命令 其使用格式如下 tgtadm lld driver op operation mode mode OPTION 其中模式 mode 和操作 operation 对应关系如下 模式 操作 ta
  • JAVA经典面试题

    九种基本类型及封装类 基本类型 boolean byte char short int long double void 二进制位数 1 8 一字节 16 2字节 16 2字节 32 4字节 64 8字节 64 8字节 封装器类 Boole
  • sqli-labs通关(less1~less10)

    目录 题外话 Less 1 Less 2 Less 3 Less 4 Less 5 Less 6 Less 7 Less 8 Less 9 Less 10 这10关都是GET型的 包括了union注入 报错注入 布尔盲注和时间盲注 虽然包含
  • 一文读懂MySQL事务:提升你的数据库操作技能

    概述 事务可以保证多个操作原子性 要么全成功 要么全失败 对于数据库来说事务保证批量的DML要么全成功 要么全失败 事务具有四个特征ACID 原子性 Atomicity 整个事务中的所有操作 必须作为一个单元全部完成 或全部取消 一致性 C
  • pytdx接口API说明

    标准行情接口API pytdx hq 下面是如何在程序里面调用本接口 首先需要引入 from pytdx hq import TdxHq API 然后 创建对象 api TdxHq API 之后 通常是如下的格式 if api connec
  • python可以在多种平台运行 这体现了python语言的_Python快速编程入门课后习题答案...

    目录 前言 第一章 一 填空题 二 判断题 三 选择题 第二章 一 填空题 二 判断题 三 选择题 第三章 一 填空题 二 判断题 三 选择题 第四章 一 单选题 二 判断题 三 填空题 第五章 一 选择题 二 判断题 三 填空题 第六章
  • 3_服务容错_保护断路器_@EnableCircuitBreaker和引入@SpringCloudApplication

    前言 前面做了一个简单的服务 注册 服务发现 服务提供者和消费者的项目 现在我们还是准备之前的项目代码 1 服务容错保护 准备的项目工程 1 服务注册中心 端口为1111 2 服务提供者 端口为8080 8081 3 服务消费者 端口为90
  • 华为OD机试真题- 天然蓄水库【2023】【JAVA、Python、C++】

    题目描述 描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天热蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界 则边界
  • Springboot连接FISCO-BCOS链

    依赖 FISCO BOCS 2 5 0 JAVA 1 8 Spring Boot 2 0 2 官方文档 前期准备 部署FISCO BOCS 2 5 0 引入SDK
  • ue 清理缓存_mpvue应用之组件数据缓存清理

    题图 被mpvue周期搞疯的你 之前介绍过美团外卖C端 H5 小程序页面大量基于mpvue框架的能力 使用Vue组件打通了原生小程序页面和H5页面的隔阂 再结合小程序自带的原生组件功能 就构成了整个外卖跨端应用的终端部分架构 但是随着页面规