记录--极致舒适的Vue页面保活方案

Posted 林恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录--极致舒适的Vue页面保活方案相关的知识,希望对你有一定的参考价值。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

为了让页面保活更加稳定,你们是怎么做的?

我用一行配置实现了

Vue页面保活是指在用户离开当前页面后,可以在返回时恢复上一次浏览页面的状态。这种技术可以让用户享受更加流畅自然的浏览体验,而不会被繁琐的操作打扰。

为什么需要页面保活?

页面保活可以提高用户的体验感。例如,当用户从一个带有分页的表格页面(【页面A】)跳转到数据详情页面(【页面B】),并查看了数据之后,当用户从【页面B】返回【页面A】时,如果没有页面保活,【页面A】会重新加载并跳转到第一页,这会让用户感到非常烦恼,因为他们需要重新选择页面和数据。因此,使用页面保活技术,当用户返回【页面A】时,可以恢复之前选择的页码和数据,让用户的体验更加流畅。

如何实现页面保活?

状态存储

这个方案最为直观,原理就是在离开【页面A】之前手动将需要保活的状态存储起来。可以将状态存储到LocalStoreSessionStoreIndexedDB。在【页面A】组件的onMounted钩子中,检测是否存在此前的状态,如果存在从外部存储中将状态恢复回来。

有什么问题?

  • 浪费心智(麻烦/操心)。这个方案存在的问题就是,需要在编写组件的时候就明确的知道跳转到某些页面时进行状态存储。
  • 无法解决子组件状态。在页面组件中还可以做到保存页面组件的状态,但是如何保存子组件呢。不可能所有的子组件状态都在页面组件中维护,因为这样的结构并不是合理。

组件缓存

利用Vue的内置组件<KeepAlive/>缓存包裹在其中的动态切换组件(也就是<Component/>组件)。<KeepAlive/>包裹动态组件时,会缓存不活跃的组件,而不是销毁它们。当一个组件在<KeepAlive/>中被切换时,activateddeactivated生命周期钩子会替换mountedunmounted钩子。最关键的是,<KeepAlive/>不仅适用于被包裹组件的根节点,也适用于其子孙节点。

<KeepAlive/>搭配vue-router即可实现页面的保活,实现代码如下:

<template>
  <RouterView v-slot=" Component ">
    <KeepAlive>
      <component :is="Component"/>
    </KeepAlive>
  </RouterView>
</template>

有什么问题?

  • 页面保活不准确。上面的方式虽然实现了页面保活,但是并不能满足生产要求,例如:【页面A】是应用首页,【页面B】是数据列表页,【页面C】是数据详情页。用户查看数据详情的动线是:【页面A】->【页面B】->【页面C】,在这条动线中【页面B】->【页面C】的时候需要缓存【页面B】,当从【页面C】->【页面B】的时候需要从换从中恢复【页面B】。但是【页面B】->【页面A】的时候又不需要缓存【页面B】,上面的这个方法并不能做到这样的配置。

最佳实践

最理想的保活方式是,不入侵组件代码的情况下,通过简单的配置实现按需的页面保活。

【不入侵组件代码】这条即可排除第一种方式的实现,第二种【组件缓存】的方式只是败在了【按需的页面保活】。那么改造第二种方式,通过在router的路由配置上进行按需保活的配置,再提供一种读取配置结合<KeepAlive/>include属性即可。

路由配置

src/router/index.ts

import useRoutersStore from \'@/store/routers\';

const routes: RouteRecordRaw[] = [
  
    path: \'/\',
    name: \'index\',
    component: () => import(\'@/layout/index.vue\'),
    children: [
      
        path: \'/app\',
        name: \'App\',
        component: () => import(\'@/views/app/index.vue\'),
      ,
      
        path: \'/data-list\',
        name: \'DataList\',
        component: () => import(\'@/views/data-list/index.vue\'),
        meta: 
          // 离开【/data-list】前往【/data-detail】时缓存【/data-list】
          leaveCaches: [\'/data-detail\'],
        
      ,
      
        path: \'/data-detail\',
        name: \'DataDetail\',
        component: () => import(\'@/views/data-detail/index.vue\'),
      
    ]
  
];

router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => 
  const  cacheRouter  = useRoutersStore();
  cacheRouter(from, to);
  next();
);

保活组件存储

src/stroe/router.ts

import  RouteLocationNormalized  from \'vue-router\';

const useRouterStore = defineStore(\'router\', 
  state: () => (
    cacheComps: new Set<string>(),
  ),
  actions: 
    cacheRouter(from: RouteLocationNormalized, to: RouteLocationNormalized) 
      if(
        Array.isArray(from.meta.leaveCaches) && 
        from.meta.leaveCaches.inclued(to.path) && 
        typeof from.name === \'string\'
      ) 
        this.cacheComps.add(form.name);
      
      if(
        Array.isArray(to.meta.leaveCaches) && 
        !to.meta.leaveCaches.inclued(from.path) && 
        typeof to.name === \'string\'
      ) 
        this.cacheComps.delete(to.name);
      
    ,
  ,
  getters: 
    keepAliveComps(state: State) 
      return [...state.cacheComps];
    ,
  ,
);

页面缓存

src/layout/index.vue

<template>
  <RouterView v-slot=" Component ">
    <KeepAlive :include="keepAliveComps">
      <component :is="Component"/>
    </KeepAlive>
  </RouterView>
</template>

<script lang=\'ts\' setup>
import  storeToRefs  from \'pinia\';
import useRouterStore from \'@/store/router\';

const  keepAliveComps  = storeToRefs(useRouterStore());
</script>

TypeScript提升配置体验

import \'vue-router\';

export type LeaveCaches = string[];

declare module \'vue-router\' 
  interface RouteMeta 
    leaveCaches?: LeaveCaches;
  

该方案的问题

  • 缺少通配符处理/*/**/index
  • 无法缓存/preview/:address这样的动态路由。
  • 组件名和路由名称必须保持一致。

总结

通过<RouterView v-slot=" Component ">获取到当前路由对应的组件,在将该组件通过<component :is="Component" />渲染,渲染之前利用<KeepAlive :include="keepAliveComps">来过滤当前组件是否需要保活。 基于上述机制,通过简单的路由配置中的meta.leaveCaches = [...]来配置从当前路由出发到哪些路由时,需要缓存当前路由的内容。

本文转载于:

https://juejin.cn/post/7216262593718173752

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

汽车智能座椅系统

概述

        自动驾驶领域日渐成熟,将催生一些全新应用场景,如休闲、娱乐、社交和健康等。传统的座椅控制系统无法满足人们新的需求,更安全、更舒适、智能化及健康化体验将成为未来智能座椅的方向。恒润凭借汽车电子技术的积累,能够提供智能汽车座椅的解决方案。
 
        为了追求极致的舒适感,智能座椅可以支持更多的座椅姿态调节,除了水平、高度、靠背常规调节,还支持旋转、腿托、肩部、侧翼等方向调节来实现舒适坐姿,智能座椅同时支持加热、通风、按摩、记忆、迎宾等功能。为了满足人们对不同应用场景的要求,智能座椅识别到相应的场景后,快速调整座椅到合适姿态。
 
        智能座椅与传统座椅的另一个重要的区别是,智能座椅更懂得用户,它会实时监测司乘者的生理指标,包括人体温度、心率及呼吸频率,并分析司乘者的健康状态,当识别到生理指标异常时,智能座椅可以主动提供按摩、降温或加热来帮助司乘者恢复到健康舒适的状态。采集到的生理特征数据也可以传送到云端对司乘者进行健康管理,让司乘者实时了解身体状况。
 
技术图片

系统组成

        系统涵盖了体征监测传感器、执行器、人机交互和控制单元。
 
技术图片
 
•  座椅控制器SCM
    ♦  智能座椅的核心,检测健康指标,识别当前应用场景并调整座椅到合适的姿态。
•  心率呼吸监测模块MMWR
    ♦  毫米波雷达方案,实现非接触式监测司乘者的呼吸及心率,准确度可以达到5%。
•  体温监测模块BTSM
    ♦  采用点阵式红外温度传感器,采集探头范围内的温度分布,通过算法提取出人脸温度,达到实时监测司乘者面部温度的目的。布置在司乘者前方,准确度达到±0.3℃。
•  人机交互界面HMI
    ♦  提供操作界面并显示当前智能座椅的状态及用户的生理指标。
•  氛围灯VALS
    ♦  采用了多色氛围灯,不同的座椅模式下氛围灯会呈现不同的显示效果,烘托气氛。如加热时呈现红色呼吸效果等。
•  MVB-X按摩模块
    ♦  用于进行按摩动作,支持多种按摩模模式和力度。
•  CANWIFI
    ♦  协议转换模块,用于CAN和WIFI协议的转换

基本功能

•  多向电动调节
    ♦  整椅水平/整椅高度/坐垫角度/靠背角度/肩部调节/腰脱调节/腿托角度/整椅旋转/坐垫侧翼/靠背侧翼
•  通风功能
    ♦  增加座椅和人体间空气的流通
•  加热功能
    ♦  提高座椅的温度
•  按摩功能

特色功能

•  健康监测
    ♦  实时采集用户的生理特征包括体温、心率和呼吸,并进行数据的分析,识别出用户的健康状态。
    ♦  用户体征异常时座椅会自动开启按摩、通风或加热,来缓解用户的不适感。
•  零重力功能
    ♦  休闲状态下,座椅可以自动调整到零重力的姿态,营造出外太空的失重感,乘坐体验不再有压迫感,身心如“零重力”放飞,实现人体最放松的姿态,将疲劳感降到最低。
 
技术图片
 
•  一键场景设置
    ♦  设置不同驾驶状况下座椅的位置,当相应的场景触发后,座椅可以迅速调整到理想的姿态。
 
技术图片
 
 

经纬恒润

北京市海淀区知春路7号致真大厦D座6层

电话:010-64840808

邮箱:market_dept@hirain.com

网址:www.hirain.com

以上是关于记录--极致舒适的Vue页面保活方案的主要内容,如果未能解决你的问题,请参考以下文章

记录--Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

记录--Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

Vuejs184-Vue 服务端渲染实践 ——Web应用首屏耗时最优化方案

汽车智能座椅系统

03.app保活解决方案

Android保活方案