设置useState后如何执行Link Router?

Posted

技术标签:

【中文标题】设置useState后如何执行Link Router?【英文标题】:How execute Link Router after to set useState? 【发布时间】:2021-11-20 15:41:24 【问题描述】:

当我点击某个按钮时,我想制作一个程序,路由器将按钮的信息传递到后面的页面。

按钮组件来了。

import React, useState, useEffect from 'react';
import Route, Link from 'react-router-dom';

function Restaurant_Item(rlist) 
const [rstData, setResData] = useState([]);
const [linkName, setLinkName] = useState("abc");
let rlist_tmp = [];

const goDetail = (rkey) => 
    setResData(rlist[rkey])
    setLinkName(rlist[rkey].restName)


for (let rkey in rlist) 
    rlist_tmp.push(
        <Link to=
            pathname :"/restaurant_result",
            search : `?sort=$linkName`,
            state: data : rstData
            >
            <div className="rst_list_cell" onClick=() => goDetail(rkey)>
                <div key=rkey>
                    <button className="rst_list_name">
                        rlist[rkey].restName
                    </button>
                    <div className="rst_list_position">
                        rlist[rkey].address
                    </div>
                </div>
            </div>
        </Link>
    )


return (<div>
    rlist_tmp
</div>);


export default Restaurant_Item;

这个组件从状态中获取对象。这些状态反映在 div 标签上。 当用户点击这个关于餐厅的 div 标签时,页面会随着包含餐厅详细信息的详细页面发生变化。

这是详细页面。

import React, useEffect from 'react';
import Link from "react-router-dom";
import Restaurant_result_axios from './Restaurant_result_axios.js';

import backicon from "../assets/backicon.png";

const Restaurant_result = (data) => 
  console.log(data)
  return (
    <div>
        <Link to="./restaurant_list"><img className="backicon" src=backicon /> 
 </Link>
        <div className="rst_result_prom"/>
        <div className="rst_result_cell">
            <div>
                <div className="rst_result_name">
                  
                </div>
                <div className="rst_result_position">
                  
                </div>
            </div>
        </div>
    </div>
);
;

export default Restaurant_result;

但是我发现了一些问题。如果用户点击了 div 标签,路由器会在执行 goDetail 函数之前更改页面。我不知道如何解决这个问题。我可以在链接之前执行 goDetail 函数吗?

【问题讨论】:

【参考方案1】:

您可以在下面尝试我的代码,在RestaurantItem Component 中,我从该组件中删除了&lt;Link&gt;&lt;/Link&gt;,因为您希望首先使用goDetail 函数来获取有关用户点击数据的详细信息。所以我导入 useHistory 来替换 Link 并放入 const 历史记录。我将history 放入goDetail 函数中。它看起来和你之前的Link 一样。你可以在这里关注我的代码:

RestaurantItem Component

import React,  useState  from "react";
import  Link, useHistory  from "react-router-dom";

function Restaurant_Item( rlist ) 
  const history = useHistory();
  const [rstData, setResData] = useState([]);
  const [linkName, setLinkName] = useState("abc");
  let rlist_tmp = [];

  const goDetail = (rkey) => 
    const data = rlist[rkey];
    const link = rlist[rkey].restName;

    setResData(data);
    setLinkName(link);
    history.push(
      pathname: "/restaurant_result",
      search: `?sort=$link`,
      state:  data: data 
    );
  ;

  for (let rkey in rlist) 
    rlist_tmp.push(
      <div className="rst_list_cell" onClick=() => goDetail(rkey)>
        <div key=rkey>
          <button className="rst_list_name">rlist[rkey].restName</button>
          <div className="rst_list_position">rlist[rkey].address</div>
        </div>
      </div>
    );
  

  return <div>rlist_tmp</div>;


export default Restaurant_Item;

对于RestaurantResult Component 导入useLocation 以访问从RestaurantItem Componenthistory.push 传递的状态。

RestaurantResult Component

import  Link, useLocation  from "react-router-dom";

import backicon from "../assets/backicon.png";

const Restaurant_result = () => 
  const location = useLocation();

  return (
    <div>
      <Link to="/restaurant_list">
        <img className="backicon" src=backicon  />
      </Link>
      <div className="rst_result_prom" />
      <div className="rst_result_cell">
        <div>
          <div className="rst_result_name">location.state.data.restName</div>
          <div className="rst_result_position">
            location.state.data.address
          </div>
        </div>
      </div>
    </div>
  );
;

export default Restaurant_result;

我只是在代码沙箱中测试它是链接: This is Code Sandbox Link

【讨论】:

非常感谢!我用你的解决方案解决了这个问题!!!!!!!我没想到 useHistory。

以上是关于设置useState后如何执行Link Router?的主要内容,如果未能解决你的问题,请参考以下文章

React useState 和 useEffect 混淆

hooks中,useState异步问题解决方案

在 HTMTL::link_to_route() 中使用 html-tags

react usestate 重新设置数据后,不渲染页面

如何在反应中使用带有useState钩子的回调[重复]

react学习前一部分