最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - React Link Doesn't working - Stack Overflow

programmeradmin4浏览0评论

I just started to learn react js and created a sample app, in which application has header, footer with content. To add header footer on each page I created root.js and include header, footer there. as props.children can render each nested route I added {this.props.children} inside root.js.

But When I clicked on any Links, nothing is happening, previous page(home) still rendered.

I could not understand whats going on and how to resolve this. Please help me, It already took me 2 days searching on google.

Edit:

Now working fine. Problem was that I added links inside

But now another problem is happening. whenever I refresh page everything has gone. pages are not found shows

Edit:

Now working after page refresh by adding these line in

package.json

"scripts": {
    "start": "npm run build",
    "build": "webpack -d && cp src/index.html dist/index.html && webpack-dev-server --content-base src/ --inline --hot --history-api-fallback",
    "build:prod": "webpack -p && cp src/index.html dist/index.html"
}

index.js

import React from "react";
import { render } from "react-dom";
import { Home } from "./pages/home/index.jsx";
import { Root } from "./ponent/layout/root";
import { Blog } from "./pages/blog/index.jsx";
import { About } from "./pages/about/index.jsx";
import { Contact } from "./pages/contact/index.jsx";
import { Portfolio } from "./pages/portfolio/index.jsx";
import { Services } from "./pages/services/index.jsx";
import { Match } from 'react-router'; 
import {BrowserRouter as Router, Route} from 'react-router-dom'
import {IndexRoute, browserHistory, Switch } from 'react-router';

class App extends React.Component {
    render(){
        return(
            <Router>
                <Root>
                    <Switch>
                        <Route exact path={"/"} ponent={Home} />
                        <Route path="/blog" ponent={Blog}/>
                        <Route path="/contact" ponent={Contact}/>
                        <Route path="/portfolio" ponent={Portfolio}/>
                        <Route path="/about" ponent={About}/>
                        <Route path="/services" ponent={Services}/>
                        <Route path="/home" ponent={Home} />
                    </Switch>
                </Root>
            </Router>
        );
    }
}

render( <App /> , window.document.getElementById("app"));

root.js

import React  from 'react';
import { render } from 'react-dom';
import { Header } from './header/index';
import { Footer } from './footer/index';

export class Root extends React.Component {
    constructor(props){
        super();
    }

    render(){
        return( 
            <div>
                <Header/>
                {this.props.children}
                <Footer/>
            </div>
        );
    }
}

Components:

/blog/index.jsx
/home/index.jsx
/contact/index.jsx




import React from "react";
import {render} from "react-dom";

export class Contact extends React.Component {
    render() {
        return (
    < div id = "fh5co-contact-section" > 
    <div className="container">
    <div className="row">
        <div className="col-md-6 col-md-offset-3 text-center fh5co-heading">
            <h2>Contact</h2>
            <p>
                <span>Created with
                    <i className="sl-icon-heart"></i>
                    by the fine folks at
                    <a href="">FreeHTML5.co</a>
                </span>
            </p>
        </div>
    </div>
    <div className="row">
        <div className="col-md-3">
            <h3>Contact Info.</h3>
            <ul className="contact-info">
                <li>
                    <i className="sl-icon-map"></i>198 West 21th Street, Suite 721 New York NY 10016</li>
                <li>
                    <i className="sl-icon-phone"></i>+ 1235 2355 98</li>
                <li>
                    <i className="sl-icon-envelope-open"></i>
                    <a href="#">[email protected]</a>
                </li>
                <li>
                    <i className="sl-icon-globe-alt"></i>
                    <a href="#">www.yoursite</a>
                </li>
            </ul>
        </div>
        <div className="col-md-8 col-md-push-1 col-sm-12 col-sm-push-0 col-xs-12 col-xs-push-0">
            <div className="row">
                <div className="col-md-6">
                    <div className="form-group">
                        <input className="form-control" placeholder="Name" type="text" /></div>
                    </div>
                    <div className="col-md-6">
                        <div className="form-group">
                            <input className="form-control" placeholder="Email" type="text" /></div>
                        </div>
                        <div className="col-md-12">
                            <div className="form-group">
                                <textarea
                                    name=""
                                    className="form-control"
                                    id=""
                                    cols="30"
                                    rows="7"
                                    placeholder="Message"></textarea>
                            </div>
                        </div>
                        <div className="col-md-12">
                            <div className="form-group">
                                <input value="Send Message" className="btn btn-primary" type="submit"/></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        );
    }
}

header.js

import React from "react";
import {render} from "react-dom";
import { Link } from "react-router-dom";
import { BrowserRouter as Router } from "react-router-dom";
export const Header = (props) => {
    return(
        <header id="fh5co-header" role="banner">
        <div className="container">
            <div className="header-inner">
                <h1><i className="sl-icon-energy"></i><Link to="/">Lesser</Link></h1>
                <nav role="navigation">
                    <ul>
                        <li><Link className="active"  to="/">Home</Link></li>
                        <li><Link  to="/blog">Blog</Link></li>
                        <li><Link  to="/portfolio">Portfolio</Link></li>
                        <li><Link  to="/services">Services</Link></li>
                        <li><Link  to="/about">About</Link></li>
                        <li><Link  to="/contact">Contact</Link></li>
                    </ul>
                </nav>
            </div>
        </div>
    </header>
    );
};

I just started to learn react js and created a sample app, in which application has header, footer with content. To add header footer on each page I created root.js and include header, footer there. as props.children can render each nested route I added {this.props.children} inside root.js.

But When I clicked on any Links, nothing is happening, previous page(home) still rendered.

I could not understand whats going on and how to resolve this. Please help me, It already took me 2 days searching on google.

Edit:

Now working fine. Problem was that I added links inside

But now another problem is happening. whenever I refresh page everything has gone. pages are not found shows

Edit:

Now working after page refresh by adding these line in

package.json

"scripts": {
    "start": "npm run build",
    "build": "webpack -d && cp src/index.html dist/index.html && webpack-dev-server --content-base src/ --inline --hot --history-api-fallback",
    "build:prod": "webpack -p && cp src/index.html dist/index.html"
}

index.js

import React from "react";
import { render } from "react-dom";
import { Home } from "./pages/home/index.jsx";
import { Root } from "./ponent/layout/root";
import { Blog } from "./pages/blog/index.jsx";
import { About } from "./pages/about/index.jsx";
import { Contact } from "./pages/contact/index.jsx";
import { Portfolio } from "./pages/portfolio/index.jsx";
import { Services } from "./pages/services/index.jsx";
import { Match } from 'react-router'; 
import {BrowserRouter as Router, Route} from 'react-router-dom'
import {IndexRoute, browserHistory, Switch } from 'react-router';

class App extends React.Component {
    render(){
        return(
            <Router>
                <Root>
                    <Switch>
                        <Route exact path={"/"} ponent={Home} />
                        <Route path="/blog" ponent={Blog}/>
                        <Route path="/contact" ponent={Contact}/>
                        <Route path="/portfolio" ponent={Portfolio}/>
                        <Route path="/about" ponent={About}/>
                        <Route path="/services" ponent={Services}/>
                        <Route path="/home" ponent={Home} />
                    </Switch>
                </Root>
            </Router>
        );
    }
}

render( <App /> , window.document.getElementById("app"));

root.js

import React  from 'react';
import { render } from 'react-dom';
import { Header } from './header/index';
import { Footer } from './footer/index';

export class Root extends React.Component {
    constructor(props){
        super();
    }

    render(){
        return( 
            <div>
                <Header/>
                {this.props.children}
                <Footer/>
            </div>
        );
    }
}

Components:

/blog/index.jsx
/home/index.jsx
/contact/index.jsx




import React from "react";
import {render} from "react-dom";

export class Contact extends React.Component {
    render() {
        return (
    < div id = "fh5co-contact-section" > 
    <div className="container">
    <div className="row">
        <div className="col-md-6 col-md-offset-3 text-center fh5co-heading">
            <h2>Contact</h2>
            <p>
                <span>Created with
                    <i className="sl-icon-heart"></i>
                    by the fine folks at
                    <a href="http://freehtml5.co">FreeHTML5.co</a>
                </span>
            </p>
        </div>
    </div>
    <div className="row">
        <div className="col-md-3">
            <h3>Contact Info.</h3>
            <ul className="contact-info">
                <li>
                    <i className="sl-icon-map"></i>198 West 21th Street, Suite 721 New York NY 10016</li>
                <li>
                    <i className="sl-icon-phone"></i>+ 1235 2355 98</li>
                <li>
                    <i className="sl-icon-envelope-open"></i>
                    <a href="#">[email protected]</a>
                </li>
                <li>
                    <i className="sl-icon-globe-alt"></i>
                    <a href="#">www.yoursite.</a>
                </li>
            </ul>
        </div>
        <div className="col-md-8 col-md-push-1 col-sm-12 col-sm-push-0 col-xs-12 col-xs-push-0">
            <div className="row">
                <div className="col-md-6">
                    <div className="form-group">
                        <input className="form-control" placeholder="Name" type="text" /></div>
                    </div>
                    <div className="col-md-6">
                        <div className="form-group">
                            <input className="form-control" placeholder="Email" type="text" /></div>
                        </div>
                        <div className="col-md-12">
                            <div className="form-group">
                                <textarea
                                    name=""
                                    className="form-control"
                                    id=""
                                    cols="30"
                                    rows="7"
                                    placeholder="Message"></textarea>
                            </div>
                        </div>
                        <div className="col-md-12">
                            <div className="form-group">
                                <input value="Send Message" className="btn btn-primary" type="submit"/></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        );
    }
}

header.js

import React from "react";
import {render} from "react-dom";
import { Link } from "react-router-dom";
import { BrowserRouter as Router } from "react-router-dom";
export const Header = (props) => {
    return(
        <header id="fh5co-header" role="banner">
        <div className="container">
            <div className="header-inner">
                <h1><i className="sl-icon-energy"></i><Link to="/">Lesser</Link></h1>
                <nav role="navigation">
                    <ul>
                        <li><Link className="active"  to="/">Home</Link></li>
                        <li><Link  to="/blog">Blog</Link></li>
                        <li><Link  to="/portfolio">Portfolio</Link></li>
                        <li><Link  to="/services">Services</Link></li>
                        <li><Link  to="/about">About</Link></li>
                        <li><Link  to="/contact">Contact</Link></li>
                    </ul>
                </nav>
            </div>
        </div>
    </header>
    );
};
Share Improve this question edited Feb 7, 2018 at 6:52 Tomasz Mularczyk 36.2k19 gold badges118 silver badges174 bronze badges asked Feb 7, 2018 at 3:56 TheVinsproTheVinspro 3701 gold badge6 silver badges17 bronze badges 2
  • Now all links working fine, But whenever I refresh page, it says page not found pages. – TheVinspro Commented Feb 7, 2018 at 4:41
  • I am also using link inside router. How to separate them????? – Gutter Overflow Commented Apr 21, 2022 at 10:04
Add a ment  | 

2 Answers 2

Reset to default 2

I don't see any links in your post but in any case you have to use the NavLink ponent from React-Router-Dom and replace any anchor tags with it.

Example:

<NavLink to="/blog">Blog</NavLink>

instead of:

<a href="/blog">Blog</a>

also for sake of readability and clean code it is better to seperate sections into ponents, form in its own ponent, contact info in its own and so on

You can import Link from react-router-dom: import Link from 'react-router-dom/Link';

and then use this <Link to='url'>display text</Link>

发布评论

评论列表(0)

  1. 暂无评论