map 函数没有在 react.js 中迭代状态对象(数组格式)

Posted

技术标签:

【中文标题】map 函数没有在 react.js 中迭代状态对象(数组格式)【英文标题】:map function is not iterating the state objects(in array format) in react.js 【发布时间】:2021-07-08 12:24:31 【问题描述】:

我正在 react.js 中构建一个 iTunes 搜索项目,它在其中获取输入字段中输入的名称的音乐专辑数据。我正在使用 iTunes 搜索 api 来获取数据,数据为 json 格式,每个搜索包含 50 个对象。

我从 api 获得的数据以数组格式存储/设置为数据状态(我使用钩子来存储数据对象)。

这里我通过setData([json.results[0]])获取每个对象的数据

但问题是 map 函数无法遍历数据状态数组。

我已经尝试了所有方法,但 map 函数没有迭代数据状态对象。 而且它也没有给出任何错误。

谁能告诉我为什么它不起作用? 提前致谢。

这里是代码。

import  useState  from "react"
const Search = () => 
    const [name, setName] = useState(null);
    const [data, setData] = useState([]);

    const handleInput = event => 
        setName(event.target.value);
    ;

    const getIdata = async () => 

        let url = "https://itunes.apple.com/search?term=" + name;
        let cors = "https://cors-anywhere.herokuapp.com/";
        
        setData([]);

        fetch(url)
            .then(data => data.json())
            .then(json => 
                setData([json.results])
            )

        console.log(data);
   

    return (
        <>
            <div>
                <h1>iTunes App</h1>
                <div>
                    <p>Search: <input className="input-field col s6" id="daal" onChange=handleInput /></p>
                    <button onClick=getIdata id="btn">submit</button>
                </div>
                <div className="row" id="output"></div>
            </div>



            

                data.map(curr => 
                    return (
                        <>
                            <h1>curr.artistName</h1>
                            <div className="row" id="output">
                                <div className="col s4 m4 l4">
                                    <div className="card">
                                        <div className="card-image waves-effect waves-block waves-light">
                                            <img className="activator" src=curr.artworkUrl100 />
                                        </div>
                                        <div className="card-content">
                                            <span className="card-title activator grey-text text-darken-4">curr.artistName<i
                                                className="material-icons right">more_vert</i></span>
                                            <p><a href="#">This is a link</a></p>
                                        </div>
                                        <div className="card-reveal">
                                            <span className="card-title grey-text text-darken-4">curr.trackCensoredName<i
                                                className="material-icons right">close</i></span>
                                            <p>Here is some more information about this product that is only revealed once clicked on.</p>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </>
                    );
                )
            
        </>
    )


export default Search

【问题讨论】:

不要在setData([]) 中使用另一个setData([json.results])then 中。另外,在发送请求之前和之后,当您在 render 方法中 console.log(data) 时会看到什么? 是的,我从代码中删除了setData([])。当我在请求之前console.log(data) 时我什么都没有得到,而在请求之后我得到了对象。 什么样的对象?为了使用map,它需要是一个数组。 【参考方案1】:

您正在将一个数组放入带有setData([json.results]) 的数组中,并且data 设置为:

[[  «song» ,  «song» ,  «song»  ]]

注意双重[[]]。直接设置获取的歌曲列表,而不是将其包装在另一个数组中。例如。 setData(json.results) 这应该导致 data 是:

[  «song» ,  «song» ,  «song»  ]

目前没有错误的原因是因为您只能访问像 curr.artistName 这样的对象属性,如果 curr 是一个数组,它就可以正常工作。

const curr = [];
curr.artistName //=> undefined (no error)

如果您尝试对结果值执行任何操作并且不希望它是undefined,您将收到错误消息。例如curr.artistName.split("") 会抛出一个错误,因为你不能在undefined 上调用split

【讨论】:

非常感谢您的解决方案和令人惊叹的解释!?

以上是关于map 函数没有在 react.js 中迭代状态对象(数组格式)的主要内容,如果未能解决你的问题,请参考以下文章

React.js 迭代对象而不是 Object.entries 的正确方法

js数组的五种迭代遍历方式 every filter forEach map some

React.js:在更改状态的输入字段中单击取消时如何返回先前的状态值[重复]

React JS 中的状态正在被删除

react.js基础

如何使用/不使用 useEffect 钩子在 React JS 函数中获取更改的(新)状态值?