【问题标题】:The first page opens empty without loading the data第一个页面打开为空而不加载数据
【发布时间】:2019-12-26 04:30:58
【问题描述】:

问题:当我的第一个页面加载时,页面是空白的。

我做了什么:我使用您在下面看到的代码将数据从 Firebase 传递到 redux。然后我做一个 if else 检查。 (作为回报)。这就是问题所在。在您单击导航栏部分的主页链接之前,第一页不会加载。

应该如何工作:在点击导航栏部分之前需要加载第一页。


App.js

export class App extends Component {
  componentDidMount = () => {
    const dat = []
    axios.get('https://bookstore-61d39.firebaseio.com/books/books.json')
      .then( res => {
        Object.values(res.data).map( val => {
          dat.push(val)
      })
    })
    axios.get('https://bookstore-61d39.firebaseio.com/books.json')
    .then( res => {
      console.log(res.data);
  })
    console.log(dat)
    this.props.onBooksData(dat)
  }

  render() {
    return (
      <BrowserRouter>
        <div>
          <Navbar>
            <GetLink to='/' link='Home'/>
          </Navbar>
          <Switch>
            <Route exact path="/" component={Homepage}/>
            <Route path="/add" component={Add}/>
            <Route path="/admin" component={Admin}/>
            <Route path="/:id" component={BookInfo} />
            <Route component={NotFound} />
          </Switch>
        </div>
      </BrowserRouter>
    )
  }
}
// <GetLink to='/add' link='Add'/>
const mapStateToProps = state => {
  return{
    admin: state.admin
  }
}

const mapDispatchToProps = dispatch => {
  return{
    onBooksData : (booksData) => dispatch({ type: 'BOOKS', books: booksData }),
  }
}

export default connect(mapStateToProps,mapDispatchToProps)(App)

homepage.js

class homepage extends Component {
  render() {
    return (
      <div className="container">
        <h2>HOMEPAGE</h2>
        <hr />
        {console.log(this.props)}
        {
          this.props.books
          ?
          this.props.books.map((arr, count) => (
          <Link key={count} to={"/" + count}>
            <div
              className="card m-2"
              style={{
                width: "150px",
                height: "375px",
                float: "left",
                position: "relative"
              }}>
              <img src="https://picsum.photos/400/500" className="card-img-top" />
              <div className="card-body text-center">
                <h5
                  className={styles.Title}
                  style={{ textDecoration: "none" }}
                >
                  {arr.title}
                </h5>
                <p className={styles.Author}>{arr.author}</p>
                <div className={styles.Price}>{arr.price} $</div>
              </div>
            </div>
          </Link>
        ))
        : <div>loading...</div>
        }
      </div>
    );
  }
}

const mapStateToProps = state => {
  return {
    books: state.books
  };
};

export default connect(mapStateToProps)(homepage);

【问题讨论】:

    标签: javascript reactjs firebase react-redux


    【解决方案1】:

    你需要在数据加载完成后调用你的onBooksData prop,现在你在promise解析你的api调用之前调用它。

      componentDidMount = () => {
        const dat = []
        axios.get('https://bookstore-61d39.firebaseio.com/books/books.json')
          .then( res => {
            Object.values(res.data).map( val => {
              dat.push(val)
          })
          // dat is now populated, call `onBooksData`
          this.props.onBooksData(dat)
        })
        // `dat` is not populated yet here since this code runs before the
        // `axios.get` async call completes.
        console.log(dat)
        this.props.onBooksData(dat)
      }
    

    另一种选择是使 componentDidMount 成为一个异步方法,它会更强制地读取:

      // note addition of `async` here
      componentDidMount = async () => {
        const dat = []
        const res = await axios.get('https://bookstore-61d39.firebaseio.com/books/books.json')
        Object.values(res.data).map( val => {
          dat.push(val)
        })
        // dat is now populated, call `onBooksData`
        this.props.onBooksData(dat)
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多