【问题标题】:fetching random json getting first undefined then result获取随机json得到第一个未定义然后结果
【发布时间】:2021-01-05 18:03:45
【问题描述】:

这里是 reactjs 的初学者,试图获取随机 json,得到我想要的结果,但不是我想要的方式,由于某种原因,它首先打印“未定义”,然后再打印结果。为什么我不能得到结果而没有这个'? 我的代码:

import { useEffect, useState } from "react";
import "./App.css";

function App() {
  const [thumbnail, setThumbnail] = useState([]);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/photos")
      .then((response) => response.json())
      .then((json) => {
        setThumbnail(json);
      });
  }, []);

  console.log(thumbnail[0]?.thumbnailUrl);
  return (
    <div className="App">
      <h1>Build</h1>
      <p></p>
    </div>
  );
}

export default App;

【问题讨论】:

    标签: javascript json reactjs console use-effect


    【解决方案1】:

    console.log() 里面的 App() 直接会使用初始状态。缩略图是空的,所以它会显示未定义。

    要检查thumbnail,您应该使用另一个useEffect 并添加thumbnail 依赖项。

    useEffect(() => {
      if (thumbnail.length > 0) {
        console.log(thumbnail[0].thumbnailUrl);
      }
    }, [thumbnail]);
    

    import { useEffect, useState } from "react";
    import "./App.css";
    
    function App() {
      const [thumbnail, setThumbnail] = useState([]);
      const [isLoaded, setLoaded] = useState(false);
    
      useEffect(() => {
        fetch("https://jsonplaceholder.typicode.com/photos")
          .then((response) => response.json())
          .then((json) => {
            setLoaded(true);
            setThumbnail(json);
          });
      }, []);
    
      useEffect(() => {
        if (isLoaded) {
          console.log(thumbnail[0]?.thumbnailUrl);
        }
      }, [thumbnail]);
    
      return (
        <div className="App">
          <h1>Build</h1>
          <p></p>
        </div>
      );
    }
    
    export default App;
    

    【讨论】:

    • 这样做了,结果还是一样,如何让useeffect改变缩略图的初始状态?让它不为空?
    • 初始状态可以为空,可以通过thumbnail.length !== 0查看useEffect里面是否为空
    • 如果我想在

      中打印该缩略图,它总是先显示为空,然后显示结果?如何只有结果而不是空?

    • 检查 jsx 渲染中的 thumbnail.length。像

      {thumbnail.length === 0 ? “空”:缩略图[0].thumbnailUrl}

    • 正如威廉所说,在第一次渲染中,http 调用还没有响应,所以thumbnail[]。当状态改变时,React 总是会重新渲染你的组件……在你的情况下,当它从 http 调用接收数据时。添加具有新状态const [isLoading, setIsLoading] = useState(false)loading 组件,然后根据其值显示您的组件:{isLoading ? &lt;Spinner&gt; : &lt;your-component&gt;}
    【解决方案2】:

    当你的http 没有响应时,你可以简单地渲染一个loading 组件(在这个例子中是一个文本),然后当thumbnail 状态改变时,React 会重新渲染你的组件并更新它使用新数据。

    只是一个工作示例:

    import React, { useEffect, useState } from "react";
    import "./App.css";
    
    function App() {
      const [thumbnail, setThumbnail] = useState([]);
      const [isLoading, setIsLoading] = useState(false);
    
      useEffect(() => {
        setIsLoading(true);
        fetch("https://jsonplaceholder.typicode.com/photos")
          .then((response) => response.json())
          .then((json) => {
            setThumbnail(json);
          })
          .finally(() => {
            setIsLoading(false);
          });
      }, []);
    
      return (
        <div className="App">
          <h1>Build</h1>
          {isLoading ? (
            <h3>Loading...</h3>
          ) : (
            thumbnail.map((item) => {
              return <span key={item.id}>{item.title}</span>;
            })
          )}
        </div>
      );
    }
    
    export default App;
    
    

    【讨论】:

    • 为什么这不起作用:返回 {item[0].title};
    • 哦,item 是一个对象,所以你不能遍历它。 thumbnail 是您的数组,map() 映射其中的每个项目,这些是带有 id, title, etc 的对象,明白了吗?所以它会是&lt;span key={item.id}&gt;{item.title}&lt;/span&gt;,就像它在答案中一样
    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-04-26
    • 2012-04-14
    相关资源
    最近更新 更多