在 api 响应后呈现 react 组件

IT技术 javascript reactjs dropbox-api
2021-04-01 12:17:41

我有一个react组件,我希望使用 Dropbox api 填充图像。api 部分工作正常,但组件在数据通过之前呈现,因此数组为空。如何延迟组件的渲染,直到它拥有所需的数据?

var fileList = [];
var images = [];
var imageSource = [];

class Foo extends React.Component {

 render(){
  dbx.filesListFolder({path: ''})
  .then(function(response) {
   fileList=response.entries;
   for(var i=0; i<fileList.length; i++){
    imageSource.push(fileList[0].path_lower);
   }
   console.log(imageSource);
   })

  for(var a=0; a<imageSource.length; a++){
   images.push(<img key={a} className='images'/>);
  }

  return (
   <div className="folioWrapper">
    {images}
   </div>
  );
 }
}

谢谢你的帮助!

3个回答

变化:

1.不要在render方法中调用api,componentDidMount为此使用生命周期方法。

组件DidMount :

componentDidMount() 在组件安装后立即调用。需要 DOM 节点的初始化应该在这里进行。如果您需要从远程端点加载数据,这是实例化网络请求的好地方。在此方法中设置状态将触发重新渲染。

2.imageSource用初始值定义状态数组中变量[],一旦你得到使用setState的响应更新,它会自动用更新的数据重新渲染组件。

3.使用状态数组在render方法中生成ui组件。

4.为了保持渲染直到你没有得到数据,把条件放在render方法里面检查imageSource数组的长度如果长度为零那么return null

像这样写:

class Foo extends React.Component {

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

    componentDidMount(){
        dbx.filesListFolder({path: ''})
          .then((response) => {
              let fileList = response.entries;
              this.setState({
                  imageSource: fileList
              });
          })
    }

    render(){
        if(!this.state.imageSource.length)
            return null;

        let images = this.state.imageSource.map((el, i) => (
            <img key={i} className='images' src={el.path_lower} />
        ))

        return (
            <div className="folioWrapper">
                {images}
            </div>
        );
    }
}
您需要将设置状态绑定到Promise内的函数
2021-05-30 12:17:41

您应该使用组件的 state 或 props,以便在数据更新时重新渲染。对 Dropbox 的调用应该在该render方法之外完成,否则每次组件重新渲染时都会调用 API。这是您可以执行的操作的示例。

class Foo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      imageSource: []
    }
  }

  componentDidMount() {
    dbx.filesListFolder({ path: '' }).then(function(response) {
      const fileList = response.entries;

      this.setState({
        imageSource: fileList.map(file => file.path_lower);
      })
    });
  }

  render() {
    return (
      <div className="folioWrapper">
        {this.state.imageSource.map((image, i) => <img key={i} className="images" src={image} />)}
      </div>
    );
  }
}

如果还没有图像,它只会以div这种方式渲染一个空的

@cloud_traveler 你是什么意思?缺少什么绑定?
2021-05-22 12:17:41
我认为此代码不起作用,因为缺少 Binding。
2021-06-18 12:17:41

首先,您应该使用组件的状态而不是使用全局定义的变量。

因此,为了避免显示带有空图像数组的组件,您需要在组件上应用有条件的“加载”类,并在数组不再为空时将其删除。

这就是我很难理解的问题 - 如何让组件知道数组何时不再为空。
2021-06-14 12:17:41
请参阅 Mayank Shukla 的回答。
2021-06-18 12:17:41