【问题标题】:Changing URL onClick in ReactJS在 ReactJS 中更改 URL onClick
【发布时间】:2018-12-14 19:00:34
【问题描述】:

在我的项目中,我有一个 TabComponent,它显示 3 个选项卡:主页、流行、所有。

现在,我正在使用 context 的 react 来维护:

  1. activetab 存储当前标签页。
  2. toggleTab 使用 setState 更改 activetab 的方法。

选项卡组件

import React, {Component} from 'react'
import Context from '../../provider'
import {Nav, NavItem, NavLink} from 'reactstrap'
import {Redirect} from 'react-router-dom'
import classnames from 'classnames'

export default class TabComponent extends Component {
    render() {
        return (
            <Context.Consumer>
                {context => (
                    <Nav tabs color='primary'>
                        <NavItem>
                            <NavLink
                                className={classnames({ active: context.activeTab === '1' })}
                                onClick={() =>{context.toggleTab('1')}}
                            >
                            Home
                            </NavLink>
                        </NavItem>
                        <NavItem>
                            <NavLink
                                className={classnames({ active: context.activeTab === '2' })}
                                onClick={() => {context.toggleTab('2')}}
                            >
                            Popular
                            </NavLink>
                        </NavItem>
                        <NavItem>
                            <NavLink
                                className={classnames({ active: context.activeTab === '3' })}
                                onClick={() => {context.toggleTab('3')}}
                            >
                            All
                            </NavLink>
                        </NavItem>                
                    </Nav>
                )}
            </Context.Consumer>
        )
    }
}

我想要实现的是,onClick 也应该更改 URL。

  • 对于标签 1,url 应该是\home\
  • 对于选项卡 2,URL 应为 \popular\
  • 对于标签 3,url 应该是\all\

onClick 方法中使用this.props.history 不适用于export default withRouter(TabComponent)

<NavLink
    className={classnames({ active: context.activeTab === '1' })}
    onClick={() =>{
        context.toggleTab('1');
        this.props.history('/home/');
    }}
>

错误

您不应在&lt;Router&gt; 之外使用&lt;Route&gt;withRouter()


window.location in onClick:

<NavLink
    className={classnames({ active: context.activeTab === '1' })}
    onClick={() =>{
        context.toggleTab('1');
        window.location = '/home/';
    }}
>

这确实有效,但行为不好。

单击选项卡会执行以下操作:

  1. 它使用context.toggleTab更改正文的内容。
  2. 然后它使用 window.location 更改 URL。
  3. 由于 URL 更改,页面正在重新加载。

这里的问题是在第一步中已经加载了内容。使用 window.location 会更改 URL,但也会重新加载不需要的页面。有没有办法跳过第 3 步,或者是否有任何其他方法只是更改了 URL?

【问题讨论】:

  • 如果你使用 react-router ,你可以使用 this.props.history(url)。否则你可以使用 window.location = url。
  • 我不确定在哪里写this.props.history(url)!!
  • 您可以在 onClick 函数或切换函数中编写它。我猜两者都会起作用
  • 如果我这样做会出错,我已经更新了我的问题。
  • 那是因为 TabComponent 不是由 渲染的。所以你可以使用 window.location = url 而不是 this.props.history

标签: javascript reactjs window.location


【解决方案1】:

您的 TabComponent 无法访问 React Router history 路由属性,因为它可能没有用作 componentRoute

您可以在TabComponent 上使用withRouter 来访问route props

class TabComponent extends Component {
    render() {
      // ...
    }
}

export default withRouter(TabComponent);

您还必须确保在您的应用顶部有一个Router 组件。

示例

class App extends Component {
  render() {
    return (
      <BrowserRouter>
        {/* ... */}
      </BrowserRouter>
    );
  }
}

【讨论】:

  • 确实成功了,我不太明白为什么我们需要在顶层设置BrowserRouter
  • @SreekarMouli withRouter 使用来自Router 组件提供的上下文的值,因此如果使用withRouter HOC 的组件在路由器外部呈现,它无法获取正确的信息需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2013-12-26
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多