javascript - 如何正确获取用户点击数据?
问题描述
我正在尝试显示带有三个标签的菜单,Streaming
类似于您在https://www.themoviedb.org/上可以找到的菜单On Tv
In Theaters
显示的默认数据是Streaming
从 接收 JSON 的部分getStaticProps
。如果用户单击它,我只想获取On Tv
和端点,然后缓存该信息。In Theaters
到目前为止,这是我的代码(只是On Tv
示例,虽然In theaters
是相同的):
import useSWR from 'swr'
import React, { useState } from "react";
const fetcher = async (e) => {
const res = await fetch(e);
const data = await res.json();
return data
};
const Trending = ({data}) => {
const [media, setMedia] = useState(data); //data used to display shows/movies
const [onTv, setOnTv] = useState(null);
const [shouldFetchTv, setShouldFetchTv] = useState(false);
const urls = [
`https://api.themoviedb.org/3/tv/on_the_air?api_key=${process.env.NEXT_PUBLIC_API_KEY}&language=en-US&page=1`,
`https://api.themoviedb.org/3/movie/now_playing?api_key=${process.env.NEXT_PUBLIC_API_KEY}&language=en-US&page=1®ion=US`
]
const tv = useSWR(shouldFetchTv && urls[0], fetcher);
const tvResult = tv.data;
const handleTv = () => {
onTv ? setMedia(onTv) //if onTv has data then just set it
:
setShouldFetchTv(true); //fetches endpoint on users click
setOnTv(tvResult); // caches the data
setMedia(onTv); //sets media object with the cached data
}
(...Some more code)
<div onClick={handleTv}>
<h1>On Tv</h1>
</div>
问题是onTv
对象在第一次点击时没有得到正确定义,而是在第三次点击时。我一直在尝试实现 useEffect 无效(没有双关语),但我仍在学习钩子,所以也许我遗漏了一些东西。我怎样才能让它正常工作?
解决方案
第一次点击shouldFetchTv
是假的并且onTv
是空的。shouldFetchTv
设置为真
第二次点击shouldFetchTv && urls[0]
变为真并发送异步请求,tvResult = tv.data
为空,因为它是异步的
在第三次单击时,您发送第二个请求,并且第一个请求的结果可用,因此它设置onTv
第四次点击onTv
不为空
因为useSWR
正在使用浏览器缓存异步结果在第三次点击时可用
推荐阅读
- webpack - 为什么我在 Webpack 5.11.0 中出现此错误:子编译中出现 1 错误?
- html - 为什么我的选择不显示我提供给它的数据?角 10
- swift - SwiftUI 动画并不总是运行
- c# - 无法加载文件或程序集 'Microsoft.AspNetCore.Hosting.Server.Abstractions,版本 = 3.1.0.0
- android - Android列表视图中的条件格式视图:如何?
- amazon-web-services - AWS SAM 本地 Lambda 调用缓慢
- xamarin.forms - 即使未设置绑定属性,DatePicker 也会选择选择
- javascript - 用一个按钮生成多个结果?
- html - 如果打印时选择 A5 尺寸的纸张,是否更改 CSS?
- azure - 发布新的 Prismic 内容时,如何将我的 Gatsby 站点部署到 Azure?