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

渲染会在渲染方法中使用promise对组件进行反应

卞俊贤
2023-03-14

我有一个组件,它获取作为道具的项目集合,并将它们映射到作为父组件的子组件呈现的组件集合。我们使用存储在WebSQL中的图像作为字节数组。在map函数中,我从项中获取图像ID,并对DAL进行异步调用,以获取图像的字节数组。我的问题是,我不能在React中传播这个promise,因为它不是为了处理渲染中的promise而设计的(至少我可以告诉你)。我来自一个C#背景,所以我想我正在寻找类似于wait关键字的东西来重新同步分支代码。

map函数如下所示(简化):

var items = this.props.items.map(function (item) {
        var imageSrc = Utils.getImageUrlById(item.get('ImageId')); // <-- this contains an async call
        return (
            <MenuItem text={item.get('ItemTitle')}
                      imageUrl={imageSrc} />
       );
    });

getImageUrlById方法如下所示:

getImageUrlById(imageId) {
    return ImageStore.getImageById(imageId).then(function (imageObject) { //<-- getImageById returns a promise
       var completeUrl = getLocalImageUrl(imageObject.StandardConImage);
       return completeUrl;
    });
}

这不起作用,但我不知道需要修改什么才能使它起作用。我尝试向链中添加另一个promise,但随后出现了一个错误,因为我的呈现函数html" target="_blank">返回的是一个promise,而不是合法的JSX。我在想,也许我需要利用React生命周期方法中的一种来获取数据,但由于我需要props已经存在,我不知道在哪里可以做到这一点。

共有2个答案

仰成天
2023-03-14

或者,您可以使用report-promise:

安装软件包:

npm i react-promise

你的代码看起来像这样:

import Async from 'react-promise'

var items = this.props.items.map(function (item) {
    var imageSrc = Utils.getImageUrlById(item.get('ImageId')); // <-- this contains an async call
    return (
        <Async promise={imageSrc} then={(val) => <MenuItem text={item.get('ItemTitle')} imageUrl={val}/>} />    
    );
});

编辑: Oct 2019

react-promise的最后一个构建提供了一个名为usePromise的钩子:

import usePromise from 'react-promise';

const ExampleWithAsync = (props) => {
  const {value, loading} = usePromise<string>(prom)
  if (loading) return null
  return <div>{value}</div>}
}

完整文档:反应-promise

徐知
2023-03-14

render()方法应该从this.propsthis.state呈现UI,所以要异步加载数据,可以使用this.state存储imageId:imageUrl映射。

然后,在您的方法中,您可以从ImageId中填充ImageUrl。那么通过渲染对象this.state方法应该是纯粹而简单的

请注意,this.state.imageUrls是异步填充的,因此在获取其url后,呈现的图像列表项将逐个出现。您还可以使用所有图像id或索引(不带URL)初始化this.state.imageUrls,这样您就可以在加载图像时显示加载程序

constructor(props) {
    super(props)
    this.state = {
        imageUrls: []
    };
}

componentDidMount() {
    this.props.items.map((item) => {
        ImageStore.getImageById(item.imageId).then(image => {
            const mapping = {id: item.imageId, url: image.url};
            const newUrls = this.state.imageUrls.slice();
            newUrls.push(mapping);

            this.setState({ imageUrls: newUrls });
        })
    });
}

render() {
    return (
      <div>
        {this.state.imageUrls.map(mapping => (
            <div>id: {mapping.id}, url: {mapping.url}</div>
        ))}
      </div>
    );
}
 类似资料:
  • 问题内容: 我知道如何在AngularJS中创建 视图 条件,该条件将根据条件显示或隐藏dom元素: 但是如何创建确定是否渲染div 的 渲染 条件? 问题答案: 针对angularjs 1.1.5及更高版本用户的更新(在1.0.7中不受支持): 相关提交:https : //github.com/angular/angular.js/commit/2f96fbd17577685bc013a4f7

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 当我在Android Studio中使用模拟器运行一个项目时,我在调试窗口中得到以下错误: /home/me/android/sdk/tools/emulator-netdelay none-netspeed full-AVD Nexus_6P_API_24 警告:不推荐使用Mesa软件渲染器。使用Swiftshader(-GPU Swiftshader)进行软件渲染。 据我所知,这个模拟器工作得

  • 在reactjs中,我试图从贴图对象渲染组件。更具体地说,按下一个按钮,我创建了一个新的“FormRow”组件,为了方便起见,我将其存储在javascript映射对象中(因为稍后我将使用它)。无论何时,我都想渲染刚刚添加的新组件,但我不知道如何从贴图中获取它。 我尝试以不同的方式解决我的问题,使用: myMap.for每个(key= 我没有尝试的是: https://stackoverflow.c

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长