Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:无法读取未定义(React)的属性“映射”_Javascript_Reactjs - Fatal编程技术网

Javascript TypeError:无法读取未定义(React)的属性“映射”

Javascript TypeError:无法读取未定义(React)的属性“映射”,javascript,reactjs,Javascript,Reactjs,我有一个代码userPage,它假设从用户的在线JSONplaceholder获取数据,并根据ID输出数据。目前,我正在正确获取数据,但当我尝试呈现数据时,我得到错误TypeError:由于某种原因无法读取undefined的属性“map”。不知道为什么,我觉得这是一个小错误,但我已经绞尽脑汁数小时试图找出它 用户页 export const UserPage = ({match}) => { const [data, setData] = useState({ hits: [] });

我有一个代码userPage,它假设从用户的在线JSONplaceholder获取数据,并根据ID输出数据。目前,我正在正确获取数据,但当我尝试呈现数据时,我得到错误TypeError:由于某种原因无法读取undefined的属性“map”。不知道为什么,我觉得这是一个小错误,但我已经绞尽脑汁数小时试图找出它

用户页

export const UserPage = ({match}) => {
const [data, setData] = useState({ hits: [] });

useEffect(() => {
    function getFetchUrl() {
        return `https://jsonplaceholder.typicode.com/users/${match.params.id}`;
    }

    async function fetchData() {
        const result = await axios(getFetchUrl());
        setData(result.data);
    }

    fetchData();
}, [match.params.id]);

console.log(data)
return (
    <>
        <ul>
            {data.hits.map(item => (
                <li key={item.id}>
                    <a href={item.url}>{item.title}</a>
                </li>
            ))}
        </ul>
    </>
);
}

所有的api数据都存储在hits中,但这就是在使用有效的api调用后,当I console.logdata时hits中的数据的样子

正如您所看到的,数据是正确的,但第一次运行时,会命中:Array{0}。数据是该调用后的正确输出。我觉得这可能是问题所在,但我不太确定,也不知道如何解决。另外,我不知道为什么它打了3次电话,但我也不知道这是否重要。我是React.JS的新手,所以我会在前进的过程中弄清楚所有这些事情


谢谢大家!

如果希望状态为对象,则需要像对象一样更新它。根据您当前的代码,您正在用从api获得的数据替换状态数据中的对象,这会导致模型中断

 async function fetchData() {
    const result = await axios(getFetchUrl());
    setData({hits: result.data}); // pass an object
}
还请注意,使用挂钩进行的状态更新不会合并状态,因此,假设对象中有多个键,并且只想更新一个键,则需要像这样进行合并和更新

setData(prev => ({
   ...prev,
   hits: result.data
}))

如果希望状态是一个对象,则需要像对象一样对其进行更新。根据您当前的代码,您正在用从api获得的数据替换状态数据中的对象,这会导致模型中断

 async function fetchData() {
    const result = await axios(getFetchUrl());
    setData({hits: result.data}); // pass an object
}
还请注意,使用挂钩进行的状态更新不会合并状态,因此,假设对象中有多个键,并且只想更新一个键,则需要像这样进行合并和更新

setData(prev => ({
   ...prev,
   hits: result.data
}))

添加一个布尔变量,将其初始化为false,然后在收到axios承诺后将其设置为true。并在该布尔值为true时控制数据

export const UserPage = ({match}) => {
const [data, setData] = useState({ hits: [] });
const [fetched, setFetched] = useState(false);
useEffect(() => {
    function getFetchUrl() {
        return `https://jsonplaceholder.typicode.com/users/${match.params.id}`;
    }

    async function fetchData() {
        const result = await axios(getFetchUrl());
        setData(result.data);
        setFetched(result.data && true);
    }

    fetchData();
}, [match.params.id]);

fetched && console.log(data)

我希望这将解决控制台日志中的错误。

添加一个布尔变量,将其初始化为false,然后在收到axios承诺后将其设置为true。并在该布尔值为true时控制数据

export const UserPage = ({match}) => {
const [data, setData] = useState({ hits: [] });
const [fetched, setFetched] = useState(false);
useEffect(() => {
    function getFetchUrl() {
        return `https://jsonplaceholder.typicode.com/users/${match.params.id}`;
    }

    async function fetchData() {
        const result = await axios(getFetchUrl());
        setData(result.data);
        setFetched(result.data && true);
    }

    fetchData();
}, [match.params.id]);

fetched && console.log(data)

我希望这将解决控制台日志的错误。

我确实需要这样做,但不幸的是,这仍然不能解决问题。数据现在保存得更好了,但我仍然看到与上面图片相同的错误。第一次运行时,按预期的:Array{0},异步获取数据。你必须有一个加载状态我肯定需要这样做,但不幸的是,这仍然不能解决问题。数据现在保存得更好了,但我仍然看到与上面图片相同的错误。第一次运行时,按预期的:Array{0},异步获取数据。您必须具有加载状态