如何在 react-router v4 中使用 history.push/Link/Redirect 传递参数?

IT技术 reactjs react-router
2021-04-16 23:28:48

我们如何this.props.history.push('/page')在 React-Router v4 中传递参数

.then(response => {
       var r = this;
        if (response.status >= 200 && response.status < 300) {
             r.props.history.push('/template');
          });
6个回答

首先,你不需要这样做,var r = this;因为 thisif statement指的是回调本身的上下文,因为你使用箭头函数指的是 React 组件上下文。

根据文档:

历史对象通常具有以下属性和方法:

  • length - (number) 历史堆栈中的条目数
  • action - (字符串)当前操作(PUSH、REPLACE 或 POP)
  • 位置 - (对象)当前位置。可能具有以下属性:

    • 路径名 - (字符串)URL 的路径
    • search - (string) URL 查询字符串
    • hash - (string) URL 散列片段
    • state - (字符串)特定于位置的状态,当此位置被推送到堆栈时提供给例如 push(path, state)。仅在浏览器和内存历史记录中可用。
  • push(path, [state]) - (function) 将一个新条目推入历史堆栈
  • replace(path, [state]) - (函数)替换历史堆栈中的当前条目
  • go(n) - (function) 将历史堆栈中的指针移动 n 个条目
  • goBack() - (function) 等价于 go(-1)
  • goForward() - (function) 等价于 go(1)
  • 阻止(提示)-(功能)阻止导航

因此,在导航时,您可以将props传递给历史对象,例如

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

或类似的Link组件或Redirect组件

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

然后在使用/template路由呈现的组件中,您可以访问传递的props

this.props.location.state.detail

还要记住,当使用 props 中的历史或位置对象时,您需要将组件与withRouter.

根据文档:

带路由器

您可以<Route>'s通过withRouter高阶组件访问历史对象的属性和最接近的 匹配项withRouter 每次使用与<Route>render相同的 props 更改路由时,都会重新渲染其组件props: { match, location, history }

是否可以在导航时在状态变量中传递数据的同时在新选项卡中打开路线,您可以将道具传递给历史对象?
2021-05-28 23:28:48
谢谢你!就我而言,我只是直接传递历史,所以我通过 this.props.history.location.state.propName 访问了我的道具 -
2021-05-31 23:28:48
goBack() 呢?当使用 goBack() 返回时,我在 props.location 或 props.history.location 中都看不到任何历史状态。使用 push() 向前导航它工作正常
2021-06-01 23:28:48
是的,有效。谢谢!但不知道为什么this.props.history.push('/template',response.data)不工作。根据 的文档push(path, [state]),您不认为它应该起作用吗?
2021-06-04 23:28:48
@SanketPatel 你需要这样做 this.props.history.push('/template', {response: response.data})
2021-06-13 23:28:48

扩展解决方案(由 Shubham Khatri 建议)以与 React 挂钩(16.8 及更高版本)一起使用:

package.json (always worth updating to latest packages)

{
     ...

     "react": "^16.12.0",
     "react-router-dom": "^5.1.2",

     ...
}

使用历史推送传递参数:

import { useHistory } from "react-router-dom";

const FirstPage = props => {
    let history = useHistory();

    const someEventHandler = event => {
       history.push({
           pathname: '/secondpage',
           search: '?query=abc',
           state: { detail: 'some_value' }
       });
    };

};

export default FirstPage;


使用来自“react-router-dom”的 useLocation 访问传递的参数:

import { useEffect } from "react";
import { useLocation } from "react-router-dom";

const SecondPage = props => {
    const location = useLocation();

    useEffect(() => {
       console.log(location.pathname); // result: '/secondpage'
       console.log(location.search); // result: '?query=abc'
       console.log(location.state.detail); // result: 'some_value'
    }, [location]);

};

非常感谢您,除了您的答案之外找不到更新的替代方案!
2021-05-30 23:28:48
完美的!!刚刚好!!。正是我一直在寻找的。
2021-06-18 23:28:48
  1. 对于早期版本:

    history.push('/[pathToSomeWhere]', yourData);
    

    并在相关组件中获取数据,如下所示:

    this.props.location.state // it is equal to yourData
    
  2. 对于较新的版本,上述方法效果很好,但有一种新方法:

    history.push({
      pathname: '/[pathToSomeWhere]',
      state: yourData,
    });
    

    并在相关组件中获取数据,如下所示:

    • 类组件

      this.props.location.state; // it is equal to yourData
      
    • 功能组件

      const location = useLocation();
      location.state; // it is equal to yourData
      

有时需要使用LinkNavLink组件而不是使用history.push功能。你可以像下面这样使用:

<Link
  to={{
    pathname: '/[pathToSomeWhere]',
    state: yourData
  }}
> 
  ...
</Link>

提示state应在最新版本中使用密钥名称。

@AndyOS,答案很明确,您应该使用路径名,而不是路径名。
2021-06-08 23:28:48
仅供参考“路径名”区分大小写,我有“路径名”,但它不起作用
2021-06-16 23:28:48

您可以使用,

this.props.history.push("/template", { ...response }) 或者 this.props.history.push("/template", { response: response })

然后您可以/template通过以下代码访问来自组件的解析数据

const state = this.props.location.state

阅读有关 React会话历史管理的更多信息

这个逻辑对我有用,而 history.push 和 back_url 处于状态 this.props.history.push(redirect_url,{ back_url: '/needing_url' }); 并通过 this.props.location.state.back_url 在登陆页面获取此信息
2021-06-18 23:28:48

如果您需要传递 URL 参数

Tyler McGinnis 在他的网站上有一个很好的帖子解释,链接到帖子

下面是代码示例:

  1. 在 history.push 组件上:

    this.props.history.push(`/home:${this.state.userID}`)

  2. 在路由器组件上定义路由:

    <Route path='/home:myKey' component={Home} />

  3. 在 Home 组件上:

componentDidMount(){
    const { myKey } = this.props.match.params
    console.log(myKey )
}
我有这样的东西,但如果我刷新页面,它会完全崩溃
2021-05-31 23:28:48
@rabiaasif 因为数据不再存在,您需要将其持久化或将其存储在本地存储中
2021-06-11 23:28:48