当前位置: 首页 > 知识库问答 >
问题:

从异步函数渲染反应本地子元素

范福
2023-03-14

我试图从一个id呈现一个反应原生组件,它被赋予一个超文本传输协议请求,然后返回组件可以使用的json。由于超文本传输协议请求是异步的,因此传递到PostCard呈现中的数据是未定义的。我试图通过等待getSinglePost的返回来解决这个问题,但是数据仍然没有定义。如果不清楚,渲染函数调用renderCard函数,该函数应该等待getSinglePost函数的json,然后返回一个填充的PostCard反应组件。有什么想法吗?

  async getSinglePost(id: string) {
    try {
      let url = preHTT + apiURL + port + 'post/id';
      url = url + '?postId=' + id;
      const response = await fetch(url, {
        method: 'POST',
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
      });
      const responseJson: any = await response.json();
      // we should do better error handling gracefully
      if (responseJson['status'] === 'ERROR') {
        throw 'Could not retrieve data';
      }
      // console.log(responseJson['payload']);
      return responseJson['payload'];
    } catch (error) {
      console.error(error);
    }
  }

  async renderCard(id: string, type: string) {
    if (type === 'post') { ***here***
        const data = await this.getSinglePost(id);
        return <PostCard data={data} goToProfile={this.moveToProfileScreen}/>;
    } else {
      return <EventCard goToProfile={this.moveToProfileScreen}/>;
    }
}


        ***render/return stuff above***
        {this.state.markers.map((marker:any)  => (
          <Marker // marker on press function eventually
            key={marker['postid']}
            coordinate={marker['location']}
            image={this.emojiDict[marker['type']]}
            >
            <Callout>
              <View flex>
                {this.renderCard(marker['postId'], marker['contentType'])}
              </View>
            </Callout>
          </Marker>
        ***render/return stuff above***

共有1个答案

白高超
2023-03-14

渲染是同步的,不会等待异步例程完成。在这种情况下,应在例行程序完成时重新呈现组件

可按如下方式进行:

  async componentDidMount() {
    try {
      const asyncData = await this.getAsyncData();
      this.setState({ asyncData });
    } catch (err) {
      // handle errors
    }
  }

  render() {
    if (this.state.asyncData) {
      // render child component that depends on async data
    } else {
      // initial render
    }
  }
 类似资料:
  • 我想解析数据,我收到的组件加载渲染。 我有这样一种状态: 这个组件安装在: 下面是解析数据的步骤: 问题是,尽管我的数据处于状态,但它并没有在render中进行解析。你知道怎么了吗? 我还有一个错误:索引。js:1警告:列表中的每个孩子都应该有一个唯一的“键”道具。 我的数据是错误的:控制台。日志:

  • 问题内容: 我正在尝试使用React Context将函数传递给嵌套的子组件,这可以有效地允许孩子在按下时更新父状态。 问题是我似乎收到一个错误 ‘TypeError:render不是一个函数。 (在render(newValue)中,render是Array的一个实例” ,控制台中的错误显示为: “警告:使用多个子对象或不是函数的子对象来渲染上下文使用者。上下文使用者期望一个子函数。如果您确实传

  • 如何在组件返回中使用promise函数,如下所示: 因此,结果将是: 即使我在同一个组件中有几个promise,我也必须使用?

  • 我看过其他人提出的与此相关的问题,但找不到合适的答案。我希望将子对象传递给组件,然后在需要它们的地方拉出特定的子对象,我看到的大多数示例都是在相同的位置渲染子对象。 我的组件看起来像这样- 当我记录道具时。父组件中的子组件我得到一个数组,其中包含两个子组件作为对象。是否有一种简单的方法可以在我需要的地方提取特定的子对象,例如我正在使用这并不理想,因为我们将在将来动态传递子元素,并且数组长度可能会更

  • 我想呈现一个消息数组: 此代码适用于: 但是如果我写这样的代码有什么区别: 这里,键在呈现时总是生成随机数。两个版本都适用于我的应用程序。 另外,如果我有1000条消息,那么如果在消息数组中添加了一条额外的消息-,是否所有消息都会重新提交当收到新的时,总是重新发布每条消息,这似乎是应用程序的一大负担。

  • 或者问题应该是,如何将字符串转换为JSX? 在任何情况下,我都试图在我的反应原生应用程序上做一个性能黑客,要求我从字符串变量渲染反应原生组件。 例如, 现在在我的渲染函数中,我想像这样渲染它: 现在,如果我试图运行应用程序,它会给出一个错误,因为我试图在组件中呈现文本。如果我在渲染之前尝试将项目包装在文本中,它只会在屏幕上以纯文本的形式渲染项目,并显示所有