React 状态更改并不总是适用于移动网络

Posted

技术标签:

【中文标题】React 状态更改并不总是适用于移动网络【英文标题】:React state changes do not always work on mobile web 【发布时间】:2021-04-01 08:19:14 【问题描述】:

我的例子如下:

我有一个按钮,单击时会显示 400 毫秒的图像(通过从 useReducer 调度的状态更改)。 400 毫秒后,图像再次隐藏,按钮可见。在桌面浏览器上,这工作得很好。但在移动设备上存在性能问题。图像并不总是在点击时显示。请看下面的 GIF 动画来理解:

这是我的源代码:

  const initialState = 
    shouldObserve: false,
  ;
  
  function reducer(state, action) 
    switch (action.type) 
      case "observe":
        return  shouldObserve: true ;
      case "reset":
        return initialState;
      default:
        throw new Error();
    
  

  const [state, dispatch] = useReducer(reducer, initialState);
  
  useEffect(() => 
    // Prevent calling useEffect at first Render
    if (firstUpdate.current) 
      firstUpdate.current = false;
      return;
    

    const  shouldObserve  = state;
    if (shouldObserve) 
      setTimeout(() => 
        dispatch( type: "reset" );
      , TIME_TO_OBSERVE);
    
  , [state]);

GIF 动画:

在桌面上(运行良好):

在移动设备上(并不总是显示图像):

有什么方法可以保证图像 100%(始终)显示?

关于我的堆栈的更多信息: 我使用 Expo 开发适用于 iosandroid 和 Web 的应用程序。 Web 版本的输出是 React Native Web,因此这里使用内部的 React。

【问题讨论】:

【参考方案1】:

不妨试试这样的:

import React,  useEffect, useState  from "react";
import "./styles.css";

export default function App() 
  const [show, setShow] = useState(false);

  useEffect(() => 
    const timer = setTimeout(() => 
      setShow(false);
    , 200);
    return () => clearInterval(timer);
  , [show]);

  return (
    <div className="App">
      <div onClick=() => setShow(true)>
        show ? <div>image</div> : <div>start</div>
      </div>
    </div>
  );

这是一个用于测试的代码沙箱:https://codesandbox.io/s/nervous-khorana-l903t?file=/src/App.js:0-461

【讨论】:

不幸的是,我看不到任何改进。您的源代码是在此处切换 2 个 div。您可以尝试切换图像和 div 吗?如果我切换文本和按钮,它会像预期的那样工作,但不是图像组件 会做一秒。 @realarb 我已经在 div 的位置插入了一个图像,它似乎工作得很好。 请问您是如何加载图像的?我目前正在 ios 模拟器上对其进行测试,它可以按预期工作。 我正在使用 Expo,并使用 expo-asset 中的 useAssets 预加载我的图像。这是一个普通的 React Native Image 组件

以上是关于React 状态更改并不总是适用于移动网络的主要内容,如果未能解决你的问题,请参考以下文章

适用于 iOS/Android 的 AWS 移动开发工具包中内置的网络安全性如何?

适用于 Web 和移动设备的 Flutter 图像选择器

是否可以让 iOS 网络应用程序调用另一个常规应用程序来打开?适用于移动 Safari。

适用于 Android 谷歌云消息 (GCM) 的 Azure 移动服务从不向设备发送通知

RESTful开发方式

RESTful开发方式