链接仅在子组件中不起作用

时间:2019-09-08 18:01:10

标签: reactjs react-router

这是我的主页的一部分,分为以下几个部分: https://i.imgur.com/KWDt8h5.png

它工作正常,在我单击“ Miniatura”后,它出现在呈现Articolo.js组件(与Home.js非常相似)的URL http://localhost:3000/articolo/32(32只是文章的ID)上)

https://i.imgur.com/LRPWAMB.png

现在有2个问题: 1)Miniatura中的链接不再起作用。如果单击链接,URL会正确更改,但不会加载文章视图。 2)文章的背景图片消失了

App.js:

class App extends React.Component{
    render(){

        return(
                <Router>
                    <MainHeader />

                        <section className="corpo-pagina">
                            <Switch>
                                <Route exact path="/cerca" component={ArticoliCercati}/>
                                <Route exact path="/articolo/:id" component={Articolo}/>
                                <Route exact path="/info" component={Info}/>
                                <Route exact path="/contatti" component={Contatti}/>
                                <Route exact path="/archivio" component={Archivio}/>
                                <Route exact path="/" component={Home}/>
                            </Switch>
                        </section>

                    <Aside />
                    <MainFooter />
                </Router>
        )
    }
}export default App

Home.js:

class Home extends React.Component{
    constructor(){
        super()

        this.state={
            statoArticoli:[],
            caricato:false
        }
    }

    // quando l'elemento viene caricato effettua la chiamata asincrona per ricevere tutti gli articoli nel database
    componentDidMount(){
        $.ajax({
            type:"GET",
            url:"http://localhost/pseudogazzetta2/src/REST/Articoli/leggi.php",
            dataType: "json",
            success: function(risposta){
                //se la chiamata ha avuto successo cambia lo stato
                this.setState({
                    statoArticoli:risposta,
                    caricato:true
                })
            }.bind(this),
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }

        })
    }

    render(){

        // caricamento condizionale: se il metodo componentDidMount contenente il metodo ajax è stato eseguito carica la schermata, se no una scritta di attesa
        if(this.state.caricato){

            return(

                <React.Fragment>

                    <article id="anteprimaArticolo">
                        <div id="contenitore-anteprima">
                            <Link to={"/articolo/"+this.state.statoArticoli[0].id}>
                                <h1>{this.state.statoArticoli[0].titolo}</h1>
                                <img id='img-articolo-corrente' src={"./immagini/immaginiArticoli/"+this.state.statoArticoli[0].immagine} alt={this.state.statoArticoli[0].immagine} /><br />
                            </Link>
                        </div>
                        <footer>
                            <time dateTime={this.state.statoArticoli[0].data}>{this.state.statoArticoli[0].data}</time>
                            <small>{this.creaTags(this.state.statoArticoli[0].tags)}</small>
                        </footer>
                        <p>
                            {this.state.statoArticoli[0].testo.substring(0,40)+"..."}<a id='continua-leggere' href={"articolo.php?id="+this.state.statoArticoli[0].id}>continua a leggere</a>
                        </p><br />
                    </article>


                    <Archivio inizio="1" numero="6" titolo="I Più Recenti"/>
                    </React.Fragment>
            )
        }else{
            return(<h1>Caricamento in corso...</h1>)
        }
    }

}export default Home

Articolo.js
``` lang-js
class Articolo extends React.Component{
    constructor(props){
        super(props)

        this.state={
            statoArticoli:[],
            caricato:false,
            id:props.match.params.id
        }
    }

    // quando l'elemento viene caricato effettua la chiamata asincrona per ricevere tutti gli articoli nel database
    componentDidMount(){
        $.ajax({
            type:"GET",
            url:"http://localhost/pseudogazzetta2/src/REST/Articoli/leggi.php",
            data:"cerca="+this.state.id+"&campo=id",
            dataType: "json",
            success: function(risposta){
                //se la chiamata ha avuto successo cambia lo stato
                this.setState({
                    statoArticoli:risposta,
                    caricato:true
                })
            }.bind(this),
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }

        })
    }

    render(){

        // caricamento condizionale: se il metodo componentDidMount contenente il metodo ajax è stato eseguito carica la schermata, se no una scritta di attesa
        if(this.state.caricato){
            return(
                <React.Fragment>
                    <article id="articoloCorrente">
                        <h1 id='titolo-articolo'>{this.state.statoArticoli[0].titolo}</h1>
                        <img id='img-articolo-corrente' src={"/immagini/immaginiArticoli/"+this.state.statoArticoli[0].immagine} alt={this.state.statoArticoli[0].immagine} /><br />
                        <footer>
                            <time id='data-articolo' dateTime={this.state.statoArticoli[0].data}>{this.state.statoArticoli[0].data}</time>
                            <small>{this.creaTags(this.state.statoArticoli[0].tags)}</small>
                        </footer>
                        <p id='testoArticolo'>{this.state.statoArticoli[0].testo}</p><br />
                    </article>


                    <Archivio inizio="1" numero="6" titolo="I Più Recenti"/>
                </React.Fragment>
            )
        }else{
            return(<h1>Caricamento in corso...</h1>)
        }
    }
}export default Articolo

Archivio.js:

class Archivio extends React.Component{
    constructor(props){
        super(props)

        this.state={
            statoArticoli:[],
            caricato:false
        }
    }

    // quando l'elemento viene caricato effettua la chiamata asincrona per ricevere tutti gli articoli nel database
    componentDidMount(){
        $.ajax({
            type:"GET",
            url:"http://localhost/pseudogazzetta2/src/REST/Articoli/leggi.php",
            dataType: "json",
            success: function(risposta){
                // crea l'array contenente gli articoli recenti
                const maxArticoli=this.props.numero
                var articoliRec=risposta
                //esegui un ciclo per rimuovere il primo valore dell'array fino al raggiungimento del valore richiesto
                for(var i=0;i<this.props.inizio;i++){
                    articoliRec.shift()
                }

                //verifica se gli articoli (escludendo quello di anteprima) sono più o meno del massimo visualizzato in pagina. se sono di più accorcia l'array
                if((articoliRec.length)>maxArticoli){
                    articoliRec.splice(maxArticoli)
                }

                //se la chiamata ha avuto successo cambia lo stato
                this.setState({
                    statoArticoli:articoliRec,
                    caricato:true
                })
            }.bind(this),
            error: function () {
                alert("errore nella connessione al Database")
              }

        })
    }

    render(){

        // caricamento condizionale: se il metodo componentDidMount contenente il metodo ajax è stato eseguito carica la schermata, se no una scritta di attesa
        if(this.state.caricato){

            return(
                <section id="articoli-recenti-sezione">
                    <header><h1>{this.props.titolo}</h1></header>
                    {// sostituisce l'array di oggetti con un array di componenti
                    this.state.statoArticoli.map(elemento=>{
                        return (
                                <Miniatura titolo={elemento.titolo} immagine={"./immagini/immaginiArticoli/"+elemento.immagine} id={elemento.id}  key={"k"+elemento.id}/>
                        )
                    })}
                    <Link to='/archivio'><footer>Mostra Altro</footer></Link>
                </section>
            )
        }else{
            return(<h1>Caricamento in corso...</h1>)
        }
    }
}
export default Archivio

Miniatura.js

class Miniatura extends React.Component{

    render(){

        return(
            <Link  to={"/articolo/"+this.props.id}>
                <div className="miniatura-articolo">
                    <img src={this.props.immagine} />
                    <h1>{this.props.titolo}</h1>
                </div>
            </Link>
        )
    }
}
export default Miniatura

1 个答案:

答案 0 :(得分:0)

您不在此处处理请求的路线:

<Switch>
  <Route exact path="/cerca" component={ArticoliCercati}/>
  <Route exact path="/info" component={Info}/>
  <Route exact path="/contatti" component={Contatti}/>
  <Route exact path="/archivio" component={Archivio}/>
  <Route exact path="/" component={Home}/>
</Switch>

您应该再添加一个以渲染'/ articolo / 32`;

一个例子可能是:

<Switch>
  <Route exact path="/cerca" component={ArticoliCercati}/>
  <Route exact path="/info" component={Info}/>
  <Route exact path="/contatti" component={Contatti}/>
  <Route exact path="/archivio" component={Archivio}/>
  <Route exact path="/articolo/:id" component={WhateverComponent}/>
  <Route exact path="/" component={Home}/>
</Switch>

然后您应该在路线上处理该ID,以便提供正确的内容。