【问题标题】:React js Render works before Fetch get valueReact js Render 在 Fetch 获取价值之前工作
【发布时间】:2020-01-22 13:25:52
【问题描述】:

我有一个组件 App.js,它有一个带有 credential 的 fetch api。在渲染中,如果最后一个视图是 1 个打开的图像视图组件,我有条件,否则转到图库组件

喜欢这个 Condition 现在这个问题是,当 app.js 在第二次加载 api 加载并第一次渲染工作时,然后再次获取 api 获取数据并且 ImageView this.state.data 为空,因此在 imageView 组件中我无法获取道具。

API调用服务文件

import fetchival from 'fetchival';

    const CLIENT_ID = 'your id';
    const apiBase = 'https://api.imgur.com/3';
    const request = fetchival(apiBase, {
      mode: 'cors',
      headers: {
        Authorization: 'Client-ID ' + CLIENT_ID
      }
    });

    export function searchGallery(section = 'hot',) {

        return request('gallery/' + section ).get();

    }

App.js 主文件

 async loadImages(section,sort,page = 0) {

        try {
          let result = await searchGallery(section, sort, page);
          this.setState({data: result.data, page: page, loaded: true});
        } catch (e) {

        }

      }
      onClick = (e) => {
        e.preventDefault() 
        this.loadImages(e.target.text.toLowerCase());
      }
      componentDidMount() {
        this.loadImages();
      }

      render() {

        return (
            <div className="warpper">
              this.state.imageView ? 
                        <ImageView {...this.state.data[this.state.activeID]}
                            _closeImageView={this._closeImageView.bind(this)} />
                            :
                        <Gallery data={this.state.data}
                            _openImageView={this._openImageView.bind(this)} />
            </div>

        )


Image View Component is not geting this.props from app js
    class ImageView extends React.Component {
        render() {
            return (
                <div className="imageview-wrapper fadeIn">
                    <div className="imageview">
                        <Image CSSClass="imageview-image"
                            src={this.props.src}
                            alt={this.props.name} />
                        <div className="imageview-info">
                            <button className="imageview-close" onClick={this.props._closeImageView}>x</button>
                            <h2>{this.props.name}</h2>
                            <p>{this.props.desc}</p>
                            <h3>Tags</h3>
                            <ul>
                                {this.props.tags.map(tag => <li>{tag}</li>)}
                            </ul>
                        </div>
                </div>
            </div>
            )
        }
    }

【问题讨论】:

  • 我不清楚你在问什么。异步请求就是这样,异步——你需要在异步请求完成之前处理渲染。
  • 我同意@Dave Newton,请澄清您的问题,我不太确定您的问题是什么。
  • @DaveNewton 问题是第一个数据应该来自 api 渲染应该可以工作,但在我的情况下,首先我将状态设为 null 然后渲染开始,然后当我第二次获得状态数据然后再次渲染工作当我点击时,使
  • 我的请求是异步的——你必须能够在数据可用之前处理渲染,或者重新架构。

标签: javascript reactjs fetch


【解决方案1】:

您需要在Imageview 类中使用构造函数,从App.js 获取道具。

例子:

class ImageView extends React.Component {
    constructor(props) {
      super(props);
      this.setState(initialState you want to use)
    }
    render() { ...

希望这会有所帮助!

【讨论】:

  • 不,你没有;如果没有提供构造函数,则使用默认构造函数。无需显式构造函数即可使用道具。
  • 如果你想在ctor中使用props,你只需要一个显式的构造函数,比如根据这些props设置初始状态等。
  • 我有图像视图组件,但它正在接收空道具,因为我说第一次获取返回 null 数据,所以 this.state.data 是 null 传递,第二次获取返回数据..所以 imagview 组件有没有道具
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2019-01-05
  • 2020-05-17
相关资源
最近更新 更多