【问题标题】:react router- nothing coming up on the screen反应路由器 - 屏幕上没有任何内容
【发布时间】:2017-08-08 07:35:24
【问题描述】:

我有一个代码,它在屏幕上加载四个图像,单击其中一个图像,它会在屏幕上显示整个图像。出于导航的目的,我使用的是 react-router。代码如下: 应用.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 path="/" component={FirstPage} />
              <Route path="/image/:id" component={Panorama} />
            </Switch>
          </BrowserRouter>
        </div>
        )
    }
  }

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

进行 ajax 调用的 FirstPage.js

import React from 'react';
import ReactDom from 'react-dom' ;
import $ from 'jquery' ;
import {Panorama} from './Panorama.js';
import {Redirect} from 'react-router-dom';

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){
    this.setState({
      isClicked:true,
      imageUrl:pano
    })
  }

  render(){
    var list=this.state.list;

    return this.state.isClicked?<Redirect to={`/image/${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
}

Panorama.js 用于在屏幕上显示单个图像

import React from 'react';
import ReactDOM from 'react-dom';
import $ from 'jquery';
import 'aframe';
import 'aframe-particle-system-component';
import {Entity, Scene} from 'aframe-react';
import {Link} from 'react-router-dom';

class Panorama extends React.Component{
    render(){
      return( 
        <div>
          <img src={props.match.params.id}/>
          </div>
        )
    }
  }

module.exports={
  Panorama:Panorama
}

问题是屏幕上没有任何错误,但是在单击图像后,图像仍然没有呈现在屏幕上。我在这里做错了什么? 我使用的 react-router 版本是 v4。

【问题讨论】:

  • imageUrl 状态在哪里?
  • 你忘了使用“this”&lt;img src={this.props.match.params.id}/&gt;检查调试控制台输出。

标签: javascript reactjs react-router react-router-v4 react-router-dom


【解决方案1】:

我的建议是修复路由器 来自

<Route path="/" component={FirstPage} />

<Route exact path="/" component={FirstPage} />

通过设置它会阻止任何包含/ 的路由器呈现FirstPage

【讨论】:

  • 路由器正在导航,但屏幕上没有任何图像。 URL 也在变化。我附上了行为的截图。请检查
【解决方案2】:

两件事,而不是在设置状态后使用Redirect,您可以使用history.push 方法动态路由到URL。 Panorama 组件也是 statefull 组件,因此可以使用类似 this.props 的道具。但是我没有看到你有任何逻辑,所以最好将它作为一个功能组件

参见this answer以使用history.push()动态路由

export const Panorama = (props) => {
      return( 
        <div>
          <img src={props.match.params.id}/>
          </div>
        )
  }

代码:

import {withRouter} from 'react-router';
class FirstPage extends React.Component{
    constructor(props){
      super(props);
      this.state={
        list:[],
        images:[],
        redirect:true,
      }
      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){
       this.props.history.push(`/image/${pano}`)
   }

  render(){
    var list=this.state.list;

    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>
  }
}

export withRouter(FirstPage);

【讨论】:

  • 之后它也不起作用!相反现在我无法导航!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2020-07-29
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多