0

私は3つのjsファイルを持っています。親は私が子クラスを呼び出すことです。コードはこのようになります。リアクションルータがタグにリンクしていません

これはFirstPage.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')); 

であるが、この

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 
} 

のようなものです。このページではscreen.IfにAJAX呼び出しと負荷4つの画像を作るクリックそれらの画像の1つでは、別のjsファイルが特定の画像をフルスクリーンで見ることができるようにその画像のIDで呼び出されるはずです。

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 
} 

コンソールにエラーは表示されませんが、画像をクリックしても画面に何も表示されません。コードの何が間違っていますか?

リアクタ・ルータのバージョンはv4です。

答えて

1

まず最初に、あなたのルート更新

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

あなたは、パラメータとしてURLを送信すると、あなたがする必要がありますイメージをロードする前にURLをエンコードし、履歴APIを使用してルートを変更することができます。一部の状態変更でレンダリングメソッドでリンクを使用する必要はありません。私はそのアプローチが間違っていると思う。パノラマコンポーネントで

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

は、あなたがURLをデコードして画像を読み込むことができます:私は以下のようにloadOne方法を更新しました。

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

FirstPageで何を返すか.js?私はPanorama.jsにどのように切り替えるのですか? – Aayushi

+0

App.jsでルートパスを変更する必要があります。 FirstPage.jsでは、この多くの状態を維持する必要はありません。あなたはイメージの状態のみを持ち、ロードするとイメージの状態を更新することができます。 – Dev

+0

もし私がそうしても、 – Aayushi

0

あなたのパスは、あなたが呼んでいるものと一致する必要があります。あなたの第2の経路変更:あなたは@Fawazが示唆されているように実行する必要があり

<Route path="/image/:id" component={Panorama} /> 
+0

パスが一致しています。すべてのjsファイルで 'id'と呼んでいます。 – Aayushi

+0

@Aayushiのパスは通常、 '/'で始まりますが、リンクとパスでも '/:id'を使用できますか?それが動作するかどうかを確認します。 – Fawaz

+0

でも動作しません@Fawaz – Aayushi

関連する問題