为什么我在控制台中得到一个空数组和不正确的数据?

Why am I getting an empty array and incorrect data fetching in console?

我有两个按钮,moviestvshows 按钮。当我点击其中任何一个时,我将 option 更改为相反的,如 handleMovieClickhandleTVShowsClick 方法所示。电影和电视节目可能具有相同的 ID,这就是 option 对于抓取很重要的原因。

我正在打印到控制台。

(1) array 个 movie/tv 个 ID

(2) option 选中

(3) 根据 idoption

获取每个单独的对象

当我第一次使用 value 计算可用电影 ID 的 array 时,我首先得到一个空数组,然后得到预期结果。那就是电影id的array,选项是电影,每个单独的promise对象都被实现了。

最重要的是,当我单击 tvshows 按钮时,我得到了以下两点安慰。

(1) 同一部电影 array 的 ID 未更新,选项更改为 tv,但是我得到了一堆带有“status_message 的承诺:“您请求的资源可以找不到”,因为我基本上是在尝试使用电影 ID 检索承诺,但使用 tvshow 选项。

然后,

(2) 然后结果改变了,一切都如我所料。也就是说选项保持不变,在上面的步骤中更改,array 得到更新,并且各个承诺对象都已实现。

发生了什么事?

我知道这是因为我在 JSX 中使用了 array id 的代码。我想我只需要在 useEffect 具有 运行 并且更新 so 数组之后调用 array.map() 部分,但是如何执行此操作以及为什么 useEffect 不是第一次 运行ning?

这是代码。


const Results = () => {

    const options = ['movie', 'tv']; 
    const { value } = useParams(); // from router 
    const [ page, setPage ] = useState(1);
    const [ option, setOption ] = useState(options[0]);
    const [ array, setArray ] = useState([]);

    const handleMovieClick = () => {setOption('movie')}
    const handleTVShowClick = () => {setOption('tv')}

    useEffect(() => {
        console.log('HERE');
        fetchArrayByPage(value, page, option).then(res => setArray(res));
    }, [value, page, option])

    console.log(array);
    console.log(option);

    return (
        <div className="results-container">
            <div>
                <ul className='categories'>
                    <button onClick={handleMovieClick}>Movies<span>{0}</span></button>
                    <button onClick={handleTVShowClick}>TV Shows<span>{0}</span></button>
                </ul>
            </div>
            {
            <div>
                <div className='results-list'>
                    {array.map((arr, index) => {
                        console.log(fetchID(arr, option));
                        return <Card key={index} id={arr} option={option}></Card>})}
                </div>

                <div className='pages'>

                </div>
            </div>
            }
        </div>
    );
}

useEffect 的回调在渲染后触发,fetchArrayByPage 似乎是异步的。所以点击“电视节目”会导致:

  1. option 更改为“电视”(array 保持不变)
  2. console.log(array); console.log(option);
  3. 使用新 option 和旧 array
  4. 渲染
  5. console.log('HERE'); fetchArrayByPage(...)
  6. 一段时间过去了
  7. setArray(res)
  8. 使用新 option 和新 array
  9. 渲染

您应该从您的 handle*Click 处理程序中调用 fetchArrayByPage

const handleTVShowClick = () => {
    fetchArrayByPage(value, page, "tv").then(res => {
        setOption('tv');
        setArray(res);
    });
}