React-Native: показывать экран загрузки до загрузки webview

на данный момент у меня есть компонент SplashScreen, который я рендеринг сначала, пока мое состояние не установлено. Я хотел бы как-то найти способ, как все еще показывать этот компонент во время загрузки моего webview. Я добавил onLoadEnd в свой webview и похоже, что я получаю свое сообщение обратно, когда его законченная загрузка, проблема в том, что если я загружу сначала splashscreen и дождусь изменения состояния onLoadEnd на самом деле никогда не будет изменен, потому что webview еще не отображается. Есть ли хороший метод как это сделать?

3 ответов


мое решение было на самом деле довольно простым, компонент WebView может иметь param renderLoading, который для меня не работал, я понял, что это потому, что также необходимо определить startInLoadingState.

поэтому мой WebView выглядит как-то так:

<WebView
   ref={MY_REF}
   source={source}
   renderLoading={this.renderLoading}
   startInLoadingState
/>

Это был бы мой подход:

constructor(props){
    super(props);
    this.state = { webviewLoaded: false };
}

_onLoadEnd() {
    this.setState({ webviewLoaded: true });
}

render() {
    return(
        <View>
            {(this.state.webviewLoaded) ? null : <SplashScreen />}
            <WebView onLoadEnd={this._onLoadEnd.bind(this)} />
        </View>
    )
}

таким образом, WebView отображается, но он помещается за SplashScreen. Таким образом, webview начинает загрузку во время SplashScreen отображается.


У меня была похожая проблема и мне удалось временно решить с помощью этого:

loadEnd () {
 this.setState({ webViewLoaded: true }):
}
render () {
const { webViewLoaded } = this.state;
return (<View> 
      {!webViewLoaded && <LoadingComponent /> } -- or spinner, whatever

         <WebView 
            style={(webViewLoaded) ? styles.webView : styles.loading}
            onLoadEnd={() => this.loadEnd.bind(this)} /> 
      </View);

}

const styles = StyleSheet.create({
  webView: { -- your styles ---},
  loading: {
    width: 0,
    heigt: 0
  }
});

Не уверен, что именно это помогает вам, но вы можете попробовать аналогичный подход. Я, вероятно, изменю это на что-то более удобное. Не уверен, есть ли возможности анимировать эти изменения, потому что я все еще довольно новичок в React Native.

edit: добавлено скрытие элемента spinner / loading