【问题标题】:How do you make a React Native ActivityIndicator appear after an onPress to show something is loading?如何在 onPress 之后显示 React Native ActivityIndi​​cator 以显示正在加载的内容?
【发布时间】:2021-08-09 23:37:30
【问题描述】:

在屏幕 1 和屏幕 2 之间导航时,用户按下按钮。按下后,有时可能需要几秒钟才能应用程序将它们导航到下一个屏幕,因此看起来没有任何事情发生。在导航到下一页之前,我将如何使活动指示器出现?我已经让 ActivityIndi​​cator 在其他内容加载时工作,但直到他们导航到该页面。

下面是我在加载地图页面时启动活动指示器的代码:

  const [isLoading, setIsLoading] = useState(true)

  const renderLoading = () =>  {
        if (isLoading) {
            return (         
            <View style = {{justifyContent: 'center', backgroundColor: '#d3d3d3', textAlign: 'center', height: height, width: width}}>
            <ActivityIndicator
            color = 'black'
            size = 'large'
            animated = {false}
          />
          <Text style = {[ styles.text, {textAlign: 'center'}]}>{i18n.t('loading')}</Text>
          </View>

            );
        }else {
            return null;
        }
    }


     <View style = {styles.container}>
        {renderLoading}
        ....
     </View>

【问题讨论】:

  • 您所说的“导航”是什么意思,您实际上是在导航(例如,使用react-native-navigation),还是只是显示不同的屏幕(例如组件)?
  • 所以主要问题是,您是否可以控制“地图”页面,还是第三方提供的组件/屏幕?
  • 很抱歉,我被其他事情缠住了。我们确实可以控制页面

标签: javascript react-native hook use-effect activity-indicator


【解决方案1】:

如果您可以控制地图屏幕,我建议您将微调器放在该组件中。换句话说,如果正在进行渲染,您将能够确定要在哪个阶段显示地图而不是微调器:

function IRenderTheMap(): ReactElement {
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    // Load/preper/render map data, whatever
    // ..

    // Somehow determine that enough content has loaded
    if (isReadyToShow) setLoading(false);
  }, []);

  if (isLoading) return <Spinner />;
  // otherwise return your result
}

如果您正在使用一些“第三方”组件来呈现地图,它希望有某种回调道具告诉您它是否完成加载。所以检查文档并寻找它。:

function IJustContainTheMap(): ReactElement {
  const [isLoading, setIsLoading] = useState(true);
  
  return (
    <View>
      {isLoading && (
        // Absolutely position the spinner so it's on top of the map
        <OverlaySpinner />
      )}
      <Map onLoadEnd={() => setIsLoading(false)} />
    </View>
  );
}

如果您用于渲染地图的组件不提供该功能……那么我认为您不走运。最好不要让库作者添加“onLoadEnd”道具(或类似道具)或自己渲染微调器。

或者可能总是为库自己添加一项功能,但大多数时候这很难。

【讨论】:

    【解决方案2】:

    从此更新您的代码

    <View style = {styles.container}>
       {renderLoading}
       ....
    </View>
    

    到这里

    <View style = {styles.container}>
       {renderLoading()}
       ....
    </View>
    

    【讨论】:

    • 嗯,是的,没错。但我不认为这就是他们要问的......我认为
    • 我认为他们的问题是一样的,他们想向用户显示活动指示器,直到发生某些事情,不是吗?
    • 我认为您在他们的代码中发现了一个错误,但没有回答他们询问的“文本”。不过,我会保留这个答案,直到他们指定(我也不确定)。 :)
    • 对不起各位,我完全忘记之前回复这些了。你们俩的执行都是对的,这就是为什么我对他们俩都投了赞成票,但是 Elias 实际上帮助了我们一些我们不知道我们需要的东西,所以我们选择了他的。非常感谢你们俩,继续努力! - MK
    • 是的,错误属于函数调用
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多