当前位置: 首页 > 知识库问答 >
问题:

处理页面刷新和前进/后退功能

荆城
2023-03-14

我正在使用react和Next.js进行API请求(从搜索栏),并在主页上显示电影列表,每个搜索结果都将带我到一个不同的页面,该页面将显示与该电影相关的数据。每次刷新details页面时,由于api请求错误导致查询结果丢失,使用Backwards/Forward按钮也会丢失搜索结果。

index.js

  <Link href={`/Details?id=${movie.imdbID}`}>  //code to take me to the Details page

details.js

const Details =()=>{    
const router = useRouter();
let [result,setResult]=useState({});
const query=router.query.id;  //storing the id from the URL

useEffect(() => {
axios.get('http://www.omdbapi.com/?',
            {params:{
                apikey:'',
                i:query,
                plot:'full'
                }   
            }).then(response=> setResult(response.data))
         }, []);
    return <SearchBar />    
 } export default Details;

此外,我还实现了一个Searchbar组件,在index.js中使用了它,工作很好。我希望在details.js文件中使用相同的组件,以避免代码冗余,但我不知道正确的方法。

index.js

      <SearchBar whenSubmit={this.onSearchSubmit}/>

SearchBar.js

    onFormSubmit=(event)=>{
    event.preventDefault();
    this.props.whenSubmit(this.state.term);
    }

    render(){
    <form className="ui form" onSubmit={this.onFormSubmit}>
           <input type="text" value={this.state.term} placeholder="search any movie" 
            onChange={event=>this.setState({term: event.target.value})} />
      </form>}

共有1个答案

滕无尘
2023-03-14

如果你阅读这些文件,你会发现:

注意:通过自动静态优化进行静态优化的页面将在不提供其路由参数的情况下进行水化(查询将为空,即{})。水化之后,Next.js将触发对您的应用程序的更新,以提供查询对象中的路由参数。如果您的应用程序不能容忍这种行为,您可以通过捕获GetInitialProps中的查询参数来选择退出静态优化。

因此,解决方案是将GetInitialProps添加到组件中:

Details.getInitialProps = async () => ({});

export default Details;

或将useEffect更改为仅在id可用时提取数据:

  useEffect(() => {
    if (query) {
      axios
        .get("http://www.omdbapi.com/?", {
          params: {
            apikey: "",
            i: query,
            plot: "full"
          }
        })
        .then(response => setResult(response.data));
    }
  }, [query]);
 类似资料:
  • 本文向大家介绍pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新,包括了pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新的使用技巧和注意事项,需要的朋友参考一下 使用Ajax可以异步获取数据,可以更高效地渲染页面。 但也存在这一些问题: 再刷新页面,页面就会变成初始的状态 浏览器的前进后退功能无效 对

  • 本文向大家介绍Vue 实现前进刷新后退不刷新的效果,包括了Vue 实现前进刷新后退不刷新的效果的使用技巧和注意事项,需要的朋友参考一下 需求一: 在一个列表页中,第一次进入的时候,请求获取数据。 点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。 也就是说从其他页面进到列表页,需要刷新获取数据,从详情页返回到列表页时不要刷新。 解决方案在 app.vue 设置: 假设列表页为 lis

  • 问题内容: 我正在尝试在3个不同的图像之间来回切换按钮,但该按钮在上一个图像中没有回来,只是前进到下一个图像,有人可以帮我吗? 问题答案: 这是我想出的。 基本上,我们有一个循环,可根据所需反应检查每个反应,然后删除旧消息并发送新消息(如果我们看到了所寻找的反应之一)。 有人要求提供一种用于编辑消息的版本,而不是发送新消息,我也将其更新为最新版本:

  • 问题内容: 好的,我有一个仅包含的简单表格。当我们点击submit(通过ajax存储)时,在文本字段中写入的数据将存储在DB中。Ajax可以正常工作并提交数据,但是,页面会自动刷新,并且URL包含输入字段的内容。 我的表格: 阿贾克斯:- PHP的:- 结果显示在后,页面将刷新,URL变为: -chat.php?message = 454545&submit_message = 为什么要刷新页面?

  • 问题内容: 如何强制Web浏览器通过JavaScript硬刷新页面? 硬刷新意味着获取页面的新副本并刷新所有外部资源(图像,JavaScript,CSS等)。 问题答案: 尝试使用: 当此方法接收一个值作为参数时,它将导致该页面始终从服务器重新加载。如果为false或未指定,浏览器 可能会 从其缓存中重新加载页面。

  • 我想在注销后刷新/重新加载页面(屏幕上的消息在5秒钟内可见)。当前代码不会刷新它,所以我仍然在标题中看到用户名,而不是像登录按钮这样的东西。 我已经检查了这篇文章,但没有什么变化。