javascript - 第一页打开为空,未加载数据

标签 javascript reactjs firebase react-redux

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

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

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

enter image description here

<小时/>

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);

最佳答案

您需要在数据加载完成后调用 onBooksData 属性,现在您是在 API 调用的 Promise 解析之前调用它。

  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)
  }

关于javascript - 第一页打开为空,未加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57582402/

相关文章:

javascript - 如何将 PHP 代码写入 JavaScript/Ajax?

cakePHP 中未应用 Javascript

reactjs - 如何在 Next.JS 14 的服务器中实现 useEffect?

java - 如何获取和设置通知中的变量?(Android)

javascript - 在 Meteor 方法中的 Promise 之后插入集合

javascript - 切换 iFrame 沙盒

reactjs - 如何重定向到另一个页面并将值传输到 React 中的页面?

reactjs - 使用 Redux 代替 Flux 可能有什么缺点

firebase - Firestore 权限缺失或不足

firebase - 如何禁用 Cloud Firestore?