【问题标题】:How do I Link Components correctly using React Router?如何使用 React Router 正确链接组件?
【发布时间】:2020-06-06 09:48:58
【问题描述】:

我正在使用 React 和 React Router 尝试将我的组件链接到一个项目中。我想将主页(当前组件)中的图片链接到其他组件。

目前我可以点击图片,它有点像一个链接(有时我点击它后会变成蓝色),虽然它没有链接到其他组件,没有错误显示,并且 url 栏中没有任何变化。从字面上看,什么都没有发生。

有什么想法吗?这是我的代码:

import { HashRouter as Router, Route,} from 'react-router-dom';


import Header from './Header'
import PortfolioWorkPage from './Pages/PortfolioWorkPage';


class Home extends React.Component {




  render () {
    return (
      <Router>
      <Header />
      <h1>PORTFOLIO</h1>
      <div className="portfolioPic">
            <img src='IMAGES/Portfolio-Pics-Logo.jpg' className='portfolioPic'></img>
      <Route path='Portfolio' component={PortfolioWorkPage} />
      </div>
      </Router>

    )
  }
}

export default Home

Code with error: react-dom.development.js:17117 组件出现上述错误:in img (created by Home) in div (created by Home) in Router (created by HashRouter) in HashRouter (created by Home)在Home(App创建)在Router(HashRouter创建)在HashRouter(App创建)在App中

import { HashRouter as Router, Route, Link} from 'react-router-dom';


import Header from './Header'
import PortfolioWorkPage from './Pages/PortfolioWorkPage';


class Home extends React.Component {




  render () {
    return (
      <Router>
      <Header />
      <h1>PORTFOLIO</h1>
      <div className="portfolioPic">
            <img src='IMAGES/Portfolio-Pics-Logo.jpg' className='portfolioPic'>
            <Route exact path='Portfolio'><PortfolioWorkPage /></Route>
            </img>
             </div> 
      </Router>

    )
  }
}

export default Home

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    在 cmets 之后,这里有两个使用内部状态和路由的实现。在第一个中,您停留在 url 路径 mywebsite.com,在第二个中,url 路径变为 mywebsite.com/portfolio。在这两种情况下,图像都将保留在页面上 - 您实际上并没有被转移到新页面,您只是根据路径有选择地呈现组件。

    使用内部状态:

    class Home extends React.Component {
    
      constructor(props){
        super(props)
        this.state = {
         portfolioActive: false
        }
      }
    
      handleClick = () => {
        this.setState({portfolioActive: !this.state.portfolioActive})
      }
    
      render () {
        return (
          <>
          <h1>PORTFOLIO</h1>
          <div className="portfolioPic">
            <img src='IMAGES/Portfolio-Pics-Logo.jpg' className='portfolioPic' 
             onClick={this.handleClick}/>
          </div>
          {this.state.portfolioActive ? <PortfolioWorkPage/> : null}
          </>
        )
      }
    }
    
    export default Home
    

    使用路线:

    import { HashRouter as Router, Route, Link} from 'react-router-dom';
    
    class Home extends React.Component {
    
      render () {
        return (
          <Router>
            <h1>PORTFOLIO</h1>
            <div className="portfolioPic">
              <Link to="/portfolio">
                <img src='IMAGES/Portfolio-Pics-Logo.jpg' className='portfolioPic'/>
              </Link>
            </div>
            <Route exact path="/portfolio">
              <PortfolioWorkPage />
            </Route>
          </Router>
        )
      }
    }
    
    export default Home
    

    【讨论】:

    • 这些都不起作用。第一个提出的portfolioActive 没有定义,我什么也看不到。第二个正确捆绑,但单击图片时没有任何反应。
    • 对不起,应该是this.state.portfolioActive,我已经更新了第一个。现在将看看第二个,但它应该是有效的。
    • 不,第一个仍然不起作用。它与现在的底部完全相同。正确捆绑,但单击时未链接到组件。
    • 我对第一个 const handleClick 做了一个小调整,应该只是 handleClick - 这两个现在都可以在我的机器上使用简单的组件,所以我只能假设这是要做的事情使用您的配置或 PortfolioWorkPage 的内容使其无效。
    • 是的,反应它不接受 const 所以我也摆脱了它,但仍然没有链接。它可能是!如果你想看看,我可以链接你的 git repo 吗?不过不确定是什么导致了这个问题。
    【解决方案2】:

    你可以使用react router提供的LinkNavLink组件。

    import { Link } from 'react-router-dom';
    
    <Link to="/some-url"/>
    
    <Router>
      <div>
       <Route exact path="/some-url">
         <MyComponentWithImage />
       </Route>
      </div>
    </Router>
    

    【讨论】:

    • 可以这样做以链接到组件而不是 url 页面吗?
    • 不使用LinkNavLink。但是,您可以设置一个组件以根据 url 进行渲染。查看更新的答案
    • 当我这样做并将路由包装在 img 标签中时,我现在收到此错误:react-dom.development.js:17117 上述错误发生在 组件中:在 img (由Home创建)在div(由Home创建)在Router(由HashRouter创建)在HashRouter(由Home创建)在Home(由App创建)在Router(由HashRouter创建)在HashRouter(由App创建)在App中跨度>
    • 更新了问题代码,向您展示我所做的事情。
    • Img 标签是自闭合的,你不能用它们包裹另一个元素。
    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 2019-01-21
    • 2021-07-28
    • 1970-01-01
    • 2017-05-26
    • 2021-10-27
    • 2016-02-20
    • 2018-09-25
    相关资源
    最近更新 更多