关于-IOS回退页面-却不刷新页面之浅浅谈(代码即粘即用)

560 阅读1分钟

现象

使用ios设备和安卓设备移动端打开H5页面,点击手机自带的回退按键,会有一点点不一样

同样的代码,在ios设备和安卓设备的点击下,会触发不一样的效果: 当我们通过点击浏览器的后退按键,返回到当下的页面,

安卓设备会重新请求接口,获取到最新的数据然后渲染;

ios设备不会重新请求接口,也不会重新渲染页面;

import React, { useEffect, useState } from "react";
import { getIosRefreshApi } from './service/index';

const IosRefresh = () => {

  const [data, setData] = useState('初始');

  const getIosRefresh = async () => {
    const res = await getIosRefreshApi();
    setData(res.data.mock)
  };

  useEffect(() => {
    getIosRefresh();
  }, []);

  return (
    <div>
      <h1>IosRefresh</h1>
      {data}
    </div>
  );
};

export default IosRefresh;

原因

安卓设备和ios设备浏览器性能优化策略不一样

解决

思路:监听当前的页面是否是通过缓存来的,如果是强制更新数据

这里我写了一个hook,可以即粘即用,这里有两种手段强制更新数据

  • 刷新整个页面
  • 只针对需要的更新数据的接口进行接口层的刷新

通过是否传入接口来判断是进行接口级的刷新还是页面级的更新;

import { useEffect } from 'react';

type BrowserRuleType = {
  func?: () => void; // 传进来
};

function useBrowserRule(params?: BrowserRuleType) {

  const { func } = params || {};

  useEffect(() => {
    const browserRule = /^.*((iPhone)|(iPad)|(Safari)|(ios)|(iPod))+.*$/;
    if (browserRule.test(navigator.userAgent)) {
      window.onpageshow = function(event) {
        if (event.persisted || (window.performance && window.performance.navigation.type === 2)) {
          if(func) {
            func();
          } else {
            window.location.reload();
          }
        }
      };
    }
  }, []);

}

export default useBrowserRule;