反应路由器不工作链接到标签

Posted

技术标签:

【中文标题】反应路由器不工作链接到标签【英文标题】:React Router not working link to tag 【发布时间】:2018-01-18 05:47:47 【问题描述】:

我有三个 js 文件。家长我要打电话给孩子班。代码是这样的。

这是父类 App.js

import React from 'react';
import ReactDOM from 'react-dom';
import $ from 'jquery';
import FirstPage from './FirstPage.js';
import Panorama from './Panorama.js';
import BrowserRouter,Route,Router,Switch from 'react-router-dom';

class App extends React.Component
    constructor(props)
      super(props);
    

    render()
      return(
        <div>
          <BrowserRouter>
            <Switch>
              <Route exact path="/" component=FirstPage />
              <Route path=":id" component=Panorama />
            </Switch>
          </BrowserRouter>
        </div>
        )
    
  

ReactDOM.render(<App/>,document.getElementById('container'));

FirstPage.js 是这样的

import React from 'react';
import ReactDom from 'react-dom' ;
import $ from 'jquery' ;
import Panorama from './Panorama.js';
import Redirect,Link from 'react-router-dom';
import withRouter from 'react-router';

class FirstPage extends React.Component
    constructor(props)
      super(props);
      this.state=
        list:[],
        images:[],
        isClicked:false,
        redirect:true,
        imageUrl:''
      
      this.loadImages=this.loadImages.bind(this);
      this.loadOne=this.loadOne.bind(this);
    
    componentDidMount()
        window.addEventListener('load',this.loadImages);
   

   loadImages() 
      console.log("load");
      var that=this;
      $.ajax(
        type:'GET',
        url:'https://demo0813639.mockable.io/getPanos',
        datatype:'jsonp',
        success:function(result)
          var images=that.state.images;
          for(var i=0;i<result.length;i++)
            that.state.images.push("pano":result[i].pano,"name":result[i].name);
          
          that.setState(
            images:images
         )
        

      )
   

   loadOne(pano)
    console.log("pano: ",pano);
    this.setState(
      isClicked:true,
      imageUrl:pano
    )
    //this.props.history.push(`/image/$pano`)
  

  render()
    var list=this.state.list;
    console.log("Image URL: "+this.state.imageUrl);
    return this.state.isClicked?<Link to=`$this.state.imageUrl`/>:
        <div> this.state.images.map((result)=>
        return(<div className="box">
                <div className="label">result.name</div>
                  <img src=result.pano className="image col-md-3" onClick=this.loadOne.bind(this,result.pano)/>   
              </div>
              )

       )
       </div>
  


module.exports=
  FirstPage:FirstPage

此页面调用 ajax 并在屏幕上加载四个图像。如果单击其中一个图像,则应该使用该图像的 id 调用另一个 js 文件,以便可以在全屏中看到特定图像.

import React from 'react';
import ReactDOM from 'react-dom';
import $ from 'jquery';
import Link from 'react-router-dom';

class Panorama extends React.Component
    render()
      console.log("Image: "+ props.match.params.id);
      return( 
        <div>
          <img src=`$props.match.params.id`/>
          </div>
        )
    
  

module.exports=
  Panorama:Panorama

虽然我在控制台中没有收到任何错误,但单击图像后,屏幕上什么也没有出现。代码有什么问题?

React 路由器的版本是 v4

【问题讨论】:

【参考方案1】:

您需要按照@Fawaz 的建议做的第一件事,更新您的路线

<Route path="/panorama/:imageUrl" component=Panorama />

当您将 url 作为参数发送时,您需要在加载图像之前对 url 进行编码,并且您可以使用历史 API 更改路由,无需在某些状态更改时使用渲染方法中的 Link。我认为这种方法是错误的。我已将 loadOne 方法更新如下:

  loadOne(pano)
   let imageUrl = encodeURIComponent(pano);
   this.props.history.push(`/panorama/$imageUrl`);
  

在全景组件中,您可以解码url并加载图像。

  render() 
     let url = decodeURIComponent(this.props.match.params.id);
     return( 
       <div>
         <img src=`$url`/>
       </div>
     )
  

FirstPage.js

import ReactDom from 'react-dom' ;
import $ from 'jquery' ;
import Panorama from './Panorama.js';
import Redirect,Link from 'react-router-dom';
import withRouter from 'react-router';

class FirstPage extends React.Component
   constructor(props)
     super(props);
     this.state=
       images:[]
     
  this.loadImages=this.loadImages.bind(this);

componentDidMount()
  window.addEventListener('load',this.loadImages);


loadImages() 
  var that=this;
  $.ajax(
    type:'GET',
    url:'https://demo0813639.mockable.io/getPanos',
    datatype:'jsonp',
    success:function(result)
      that.setState(
        images:result // I am assuming, result is array of objects.
     )
    
   )


loadOne(pano)
  let imageUrl = encodeURIComponent(pano);
  this.props.history.push(`/panorama/$imageUrl`);


render()
   return <div> 
           this.state.images.map((result)=>
              return(<div className="box">
                <div className="label">result.name</div>
                <img src=result.pano className="image col-md-3" 
                onClick=this.loadOne.bind(this,result.pano)/>   
                </div>)

           )
          </div>
  


module.exports=
  FirstPage:FirstPage

【讨论】:

那么我应该在 FirstPage.js 中返回什么?我的意思是如何切换到 Panorama.js 您必须在 App.js 中更改 Route 路径。在 FirstPage.js 中,您不必维护这么多状态。您只能拥有图像状态,并且在加载时,您可以更新图像状态。 即使我这样做了,点击后屏幕上也不会出现图像 有没有办法从服务器的 URL 中隐藏 imageUrl @Aayushi,我添加了 FirstPage.js 代码示例。请尝试联系。关于从 url 隐藏参数,我知道使用编码的 url 字符串。它们可能是历史 API 中的一些额外选项,您可以探索【参考方案2】:

您的路径需要与您调用的路径相匹配。将您的第二条路线更改为:

<Route path="/image/:id" component=Panorama />

【讨论】:

路径匹配。我只是在所有 js 文件中调用 'id' @Aayushi 路径通常以“/”开头,您是否也可以在链接和路径中使用“/:id”。看看这是否有效。 @Aayushi Switch 渲染第一个匹配的路径,所以您可以尝试将第二个路径移动到第一个位置。 什么意思? 反转路由顺序&lt;Switch&gt;&lt;Route path="/:id" component=Panorama /&gt;&lt;Route exact path="/" component=FirstPage /&gt; &lt;/Switch&gt;

以上是关于反应路由器不工作链接到标签的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器链接不工作

History.push 一个带有反应路由器的新标签的链接

为啥反应路由器不工作。当我改变路径?

反应链接与标签和箭头功能

反应路由器 v4 默认页面(未找到页面)

反应路由器不渲染组件