【问题标题】:Async render react-native异步渲染 react-native
【发布时间】:2018-06-22 03:44:36
【问题描述】:

我有一个二维码扫描器,根据服务器的响应,我想显示一个具有不同背景颜色的模式!

我使用了react-native-qrcode-scannerreact-native-modalbox

App.js:

  render() {
    return (
      <View style={styles.container}>
        <Header headerText="Scan ????" />

        <View style={styles.cameraContainer}>
          <QRCodeScanner
            ref={node => {
              this.scanner = node;
            }}
            onRead={this.onRead.bind(this)}
            cameraStyle={{ height: "100%" }}
          />
        </View>

        {this.renderModal()}
      </View>
    );
  }

然后我们有 onRead() 函数,即:

onRead(e) {
    // send request to server and receive the response!
    switch (msg from server){
      case "IN": {
        userStatus = "1";
      }

      case "OUT": {
        userStatus = "0";
      }

      case "Error": {
        userStatus = "-1";
      }

    this.refs.myModal.open();
}

最后是 renderModal()

renderModal() {
    switch (userStatus) {
      case "1": {
        (modalBackgroundColor = "#90EE90"), (modalText = "In");
      }

      case "0": {
        (modalBackgroundColor = "#87CEFA"), (modalText = "Out");
      }

      case "-1": {
        (modalBackgroundColor = "#FF0000"), (modalText = "Error");
      }
    }

    return (
      <Modal
        style={styles.modalStyle}
        position={"center"}
        ref={"myModal"}
        backdropColor={modalBackgroundColor}
        onClosed={() => {
          this.scanner.reactivate();
        }}
      >
        <Text style={styles.text}>{modalText}</Text>
      </Modal>
    );
  }

问题是我的onRead() 是一个异步函数,但renderModal() 在我收到响应之前呈现! 有什么解决办法吗?

提前致谢!

【问题讨论】:

    标签: javascript reactjs react-native async-await


    【解决方案1】:

    作为异步函数的一般情况,我在渲染方面的处理方式是在本地状态中保存 IsLoading: True,然后将函数的结果更改为 IsLoading: False,并且仅当 IsLoading 设置为 False 时,进行渲染,当它设置为 True 时,显示一些占位符,告知用户正在处理数据。

    这会将反馈反馈给用户,并使其具有响应性。

    编辑:

    isLoading(isLoading = true){
    this.setState({isLoading})
    }
    
    {this.state.isLoading ? <div>placeholder</div> : this.renderModal()}
    

    在你的异步函数的返回中运行 正在加载(假) 当您启动实际读取时,运行 isLoading(true)。

    【讨论】:

    • 它不是通用应用程序!我只是想扫描一个二维码并改变背部取决于服务器的响应!
    • 我说的是一般情况,您也可以将其应用于扫描二维码。您可以在等待服务器响应时将背面更改为占位符。
    • 对不起,我不明白你的问题。我正在努力提供帮助。您的“{this.renderModal()}”会立即渲染,它会从您的 QR 扫描仪中获取数据并进行渲染,但是您的 QR 扫描仪仍然必须等待答案,因为它是异步的。因此,如果我理解正确,您必须使其呈现一些占位符类型的内容,并在 OnRead 函数结束时传达读取已完成,然后使用该数据更新您的本地状态,以取消占位符值和发送正确的数据。
    • 好的。我编辑了我的原始帖子,以包含我的想法。如果你不喜欢它,就扔掉它,如果它能给你一些灵感,那就太好了。
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2018-04-14
    相关资源
    最近更新 更多