【问题标题】:Fetch data inside useEffect hook before rendering - React在渲染之前在 useEffect 钩子中获取数据 - React
【发布时间】:2021-04-17 15:14:13
【问题描述】:

我正在构建一个原型,用于在 React 中获取 Spotify 用户的播放列表数据。数据获取在 useEffect 挂钩内完成,并设置播放列表变量的状态。因此,我想渲染每个播放列表的名称。但是,似乎只是在渲染后才获取数据,导致出现问题,因为在渲染之前未设置状态,因此未定义播放列表变量。如何在继续使用 React 钩子的同时解决这个问题?我的代码如下。

import './App.css'
import queryString from 'query-string'
import React, { useState, useEffect } from 'react'

const App = () => {

  const [userData, setUserData] = useState({})
  const [accesstoken, setAccesstoken] = useState('')
  const [playlists, setPlaylists] = useState({})

  useEffect(() => {

    let parsed = queryString.parse(window.location.search)
    let accesstoken = parsed.access_token
    if (!accesstoken) {
      return
    }
    setAccesstoken(accesstoken)

    fetch('https://api.spotify.com/v1/me', {
      headers: {'Authorization': 'Bearer ' + accesstoken}
    }).then(response => response.json())
    .then(data => setUserData(data))

    fetch(`https://api.spotify.com/v1/me/playlists`, {
      headers: {'Authorization': 'Bearer ' + accesstoken}
    }).then(response => response.json())
    .then(data => setPlaylists(data))

  }, [])

  return(
    <div>
      {accesstoken ? (
        <div>
          <h1>Welcome, {userData.display_name}</h1>
          <h2>Playlists</h2>
          <div>
            {playlists.items.map(playlist => 
              <p>
                {playlist.name}
              </p>
            )}
          </div>
        </div>
      ) : (
        <button onClick={() => window.location = 'http://localhost:8888/login'}>Login</button>
      )}
    </div>
  );
}

export default App;

【问题讨论】:

    标签: reactjs use-effect use-state


    【解决方案1】:

    使用conditional rendering。检查渲染中的值

       <div>
          {userData && <h1>Welcome, {userData.display_name}</h1>}
          <h2>Playlists</h2>
          {playlists && playlists.items && (
            <div>
              {playlists.items.map((playlist) => (
                <p>{playlist.name}</p>
              ))}
            </div>
          )}
        </div>;
    

    【讨论】:

      【解决方案2】:

      您可以添加支票。见下文{playlists &amp;&amp; playlists?

      import './App.css'
      import queryString from 'query-string'
      import React, { useState, useEffect } from 'react'
      
      const App = () => {
      
        const [userData, setUserData] = useState({})
        const [accesstoken, setAccesstoken] = useState('')
        const [playlists, setPlaylists] = useState({})
      
        useEffect(() => {
      
          let parsed = queryString.parse(window.location.search)
          let accesstoken = parsed.access_token
          if (!accesstoken) {
            return
          }
          setAccesstoken(accesstoken)
      
          fetch('https://api.spotify.com/v1/me', {
            headers: {'Authorization': 'Bearer ' + accesstoken}
          }).then(response => response.json())
          .then(data => setUserData(data))
      
          fetch(`https://api.spotify.com/v1/me/playlists`, {
            headers: {'Authorization': 'Bearer ' + accesstoken}
          }).then(response => response.json())
          .then(data => setPlaylists(data))
      
        }, [])
      
        return(
          <div>
            {accesstoken ? (
              <div>
                <h1>Welcome, {userData.display_name}</h1>
                <h2>Playlists</h2>
                <div>
                  {playlists && playlists?.items.map(playlist => 
                    <p>
                      {playlist.name}
                    </p>
                  )}
                </div>
              </div>
            ) : (
              <button onClick={() => window.location = 'http://localhost:8888/login'}>Login</button>
            )}
          </div>
        );
      }
      
      export default App;
      

      【讨论】:

      • 这似乎行不通...那到底是做什么的?我假设它会检查播放列表是否已定义但不确定哈哈。
      • 它检查播放列表是否未定义并且播放列表有项目。你看到一个空白屏幕吗?如果访问令牌为空,我看到您有一个返回语句。你确定,你有身份验证吗?
      • 它确实像这样工作:播放列表 && playlists.items && (
        {playlists.items.map(playlist => (

        {playlist.name}

        ))}
        )}
      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 2020-08-06
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2021-01-06
      • 2020-12-21
      相关资源
      最近更新 更多