在不使用重定向或链接的情况下更改 react-router v4 中的 URL [重复]

Posted

技术标签:

【中文标题】在不使用重定向或链接的情况下更改 react-router v4 中的 URL [重复]【英文标题】:Changing the URL in react-router v4 without using Redirect or Link [duplicate] 【发布时间】:2017-07-05 10:36:21 【问题描述】:

我在我的 React 应用程序中使用 react-router v4 和 material-ui。我想知道一旦点击GridList 中的GridTile,如何更改URL。

我最初的想法是为onTouchTap 使用处理程序。但是,我可以看到重定向的唯一方法是使用组件RedirectLink。如何在不渲染这两个组件的情况下更改 URL?

我试过this.context.router.push('/foo'),但它似乎不起作用。

【问题讨论】:

【参考方案1】:

试试这个,

this.props.router.push('/foo')

警告适用于 v4 之前的版本

this.props.history.push('/foo')

适用于 v4 及更高版本

【讨论】:

@Alex 该方法现在作为道具而不是通过上下文传递。但是我在生产中仍然遇到多个问题 所以这意味着我需要自己将路由器对象传递给子组件,对吧? 不,路由器已经存在,无需通过 相信你一定要通过道具。例如<Route path="/one" render=() => <MyComponent />/>。如果我尝试访问MyComponent 中的道具,我不相信props.router 会存在。 props 不是一个全局变量,你不能随便往里面注入东西。 注: 这是针对旧版本的 React Router(当前版本是 v4)【参考方案2】:

我正在使用它通过 React Router v4 进行重定向:

this.props.history.push('/foo');

【讨论】:

注:从routerhistory 的细微变化。这就是我最终用于 v4 的内容 @AbhirajshriWinsome 自从我回答以来,我的编辑次数并不多。我的一直有history,Ayush Sharma 的回答没有。【参考方案3】:

React 路由器 v4

我需要做几件事才能顺利完成这项工作。

auth workflow 上的文档页面有很多需要的内容。

但是我遇到了三个问题

    props.history 来自哪里? 如何将其传递给不在Route 组件内的组件 如果我想要其他 props 怎么办?

我最终使用了:

    an answer on 'Programmatically navigate using react router' 中的选项 2 - 即使用 <Route render> 得到 props.history,然后可以将其传递给孩子。 使用render=routeProps => <MyComponent ...props routeProps /> 组合来自this answer on 'react-router - pass props to handler component' 的其他props

注意使用 render 方法,您必须显式地传递来自 Route 组件的道具。出于性能原因,您还想使用render 而不是componentcomponent 每次都强制重新加载)。

const App = (props) => (
    <Route 
        path="/home" 
        render=routeProps => <MyComponent ...props ...routeProps>
    />
)

const MyComponent = (props) => (
    /**
     * @link https://reacttraining.com/react-router/web/example/auth-workflow
     * N.B. I use `props.history` instead of `history`
     */
    <button onClick=() => 
        fakeAuth.signout(() => props.history.push('/foo'))
    >Sign out</button>
)

我发现的一个令人困惑的事情是,在相当多的 React Router v4 文档中,他们使用MyComponent = ( match ) 即Object destructuring,这意味着最初我没有意识到Route 传递了三个道具,@ 987654341@、locationhistory

我认为这里的其他一些答案是假设一切都是通过 javascript 类完成的。

这是一个示例,另外,如果您不需要传递任何 props,则可以使用 component

class App extends React.Component 
    render () 
        <Route 
            path="/home" 
            component=MyComponent
        />
    


class MyComponent extends React.Component 
    render () 
        /**
         * @link https://reacttraining.com/react-router/web/example/auth-workflow
         * N.B. I use `props.history` instead of `history`
         */
        <button onClick=() => 
            this.fakeAuth.signout(() => this.props.history.push('/foo'))
        >Sign out</button>
    

【讨论】:

如果我想追加到当前 URL 怎么办?就像当前 URL 是 google.com/:search,那么我想将其设为 google.com/:search/vendor... 或其他什么。【参考方案4】:

这就是我做类似事情的方式。我有作为 YouTube 视频缩略图的图块。当我单击磁贴时,它会将我重定向到使用“video_id”将正确视频呈现到页面的“播放器”页面。

<GridTile
  key=video_id
  title=video_title
  containerElement=<Link to=`/player/$video_id`/>
 >

ETA:抱歉,刚刚注意到您出于某种原因不想使用 LINK 或 REDIRECT 组件。也许我的回答仍然会在某种程度上有所帮助。 ; )

【讨论】:

以上是关于在不使用重定向或链接的情况下更改 react-router v4 中的 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在不重定向的情况下创建付款发票

如何在不更改浏览器中的 URL 的情况下使用 htaccess 进行重定向

在不更改 URL 的情况下重定向到另一个网站

在不影响其他元素的情况下动态更改 div 之间的页面内容

如何在不更改web.config文件中的URL的情况下重定向域?

如何在不重新加载 HTML 页面的情况下重定向锚标记链接?