Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Link组件 #18

Open
andyChenAn opened this issue Dec 19, 2018 · 0 comments
Open

Link组件 #18

andyChenAn opened this issue Dec 19, 2018 · 0 comments
Labels
react react相关

Comments

@andyChenAn
Copy link
Owner

react路由组件之Link组件

在react应用中,react路由组件可以提供可声明的,可访问的导航组件。这个组件就是组件,组件最终会被渲染成a标签。

Link组件有以下几个属性

  • to属性
    • 该属性是一个字符串或者是一个对象,如果是一个字符串,那么表示要链接到的地址,可以通过location对象的pathname,search,hash这三个属性来创建,比如:About。如果to属性是一个对象,那么我们可以使用四个属性来构造链接(pathname:表示要链接的路径 , search:表示路径的查询参数 , hash:表示url的hash值 , state:表示保存在location的状态,我们可以设置一些值,这些值可以在location对象的state属性中获取)
  • replace属性
    • 该属性是一个布尔值,当为true时,点击链接时,会替换当前历史访问记录中的地址,而不是添加一个新的地址到历史访问记录中。
  • innerRef属性
    • 该属性是一个函数,当组件加载的时候,会调用这个函数,接收一个参数,是一个底层component引用。也就是说可以访问dom。

除了上面这些属性,我们也可以添加别的属性,id,className,title等,就像给a标签添加属性一样。

import React, { Component } from 'react';
import { BrowserRouter as Router , Route , Switch , Link , withRouter , Redirect } from 'react-router-dom';

const Home = () => <h1>home</h1>;
const About = (props) => {
    // 当导航到该页面的时候,我们可以打印看一下location对象下的属性
    console.log(props);
    return (
        <h1>about</h1>
    )
};
class App extends Component {
    render () {
        return (
            <Router>
                <div>
                    <Link to="/">home</Link>
                    <Link to="/about?name=andy#abc">About</Link>
                    <Route path="/" exact component={Home} />
                    <Route path="/about" component={About} />
                </div>
            </Router>
        )
    }
}
export default App;

结果为:

image

import React, { Component } from 'react';
import { BrowserRouter as Router , Route , Switch , Link , withRouter , Redirect } from 'react-router-dom';

const Home = () => <h1>home</h1>;
const About = (props) => {
    console.log(props);
    return (
        <h1>about</h1>
    )
};
class App extends Component {
    render () {
        return (
            <Router>
                <div>
                    <Link to="/">home</Link>
                    <Link to={{
                        pathname : '/about',
                        search : '?name=andy&age=22',
                        hash : '#abc',
                        state : {
                            name : 'andy',
                            job : 'doctor'
                        }
                    }}>About</Link>
                    <Route path="/" exact component={Home} />
                    <Route path="/about" component={About} />
                </div>
            </Router>
        )
    }
}
export default App;

结果为:

image

import React, { Component } from 'react';
import { BrowserRouter as Router , Route , Switch , Link , withRouter , Redirect } from 'react-router-dom';

const Home = () => <h1>home</h1>;
const About = (props) => {
    console.log(props);
    return (
        <h1>about</h1>
    )
};
const User = () => <h1>user</h1>;
const Login = () => <h1>login</h1>;

const AddressBtn = withRouter(class AddressBtn extends Component {
    constructor (props) {
        super(props);
    }
    prevPage = () => {
        let { history } = this.props;
        history.goBack();
    }
    nextPage = () => {
        let { history } = this.props;
        history.goForward();
    }
    render () {
        return (
            <div>
                <button onClick={this.prevPage}>上一页</button>
                <button onClick={this.nextPage}>下一页</button>
            </div>
        )
    }
})

// 当我们设置replace属性为true时,会替换当前历史访问记录中的地址,而不是添加一个新的地址到历史访问记录中
class App extends Component {
    render () {
        return (
            <Router>
                <div>
                    <AddressBtn />
                    <Link to="/">home</Link>
                    <Link to="/about" replace>about</Link>
                    <Link to="/user">user</Link>
                    <Link to="/login">login</Link>
                    <Route path="/" exact component={Home} />
                    <Route path="/about" component={About} />
                    <Route path="/user" component={User} />
                    <Route path="/login" component={Login} />
                </div>
            </Router>
        )
    }
}
export default App;

当我们在Link组件中设置replace属性为true时,点击该链接,会替换当前路由地址,而不是在历史访问记录里添加新的一个地址。当我们依次点击login,user,about按钮时,然后再点击上一页按钮,我们发现链接不会跳转到user,说明这里的user地址被about地址给替换了。

import React, { Component } from 'react';
import { BrowserRouter as Router , Route , Switch , Link , withRouter , Redirect } from 'react-router-dom';

const Home = () => <h1>home</h1>;

class About extends Component {
    constructor (props) {
        super(props);
        this.nodeRef = React.createRef();
    }
    render () {
        return (
            <h1 ref={this.nodeRef}>about</h1>
        )
    }
}
const User = () => <h1>user</h1>;
const Login = () => <h1>login</h1>;

class App extends Component {
    lookInnerRef = (node) => {
        console.log(node.innerHTML);
    }
    render () {
        return (
            <Router>
                <div>
                    <Link to="/">home</Link>
                    <Link to="/about" replace>about</Link>
                    <Link to="/user" innerRef={this.lookInnerRef}>user</Link>
                    <Link to="/login">login</Link>
                    <Route path="/" exact component={Home} />
                    <Route path="/about" component={About} />
                    <Route path="/user" component={User} />
                    <Route path="/login" component={Login} />
                </div>
            </Router>
        )
    }
}
export default App;

上面代码中,我们创建一个引用,然后当组件在加载的时候,会调用lookInnerRef函数,然后可以访问到底层的组件引用。

@andyChenAn andyChenAn added the react react相关 label Dec 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
react react相关
Projects
None yet
Development

No branches or pull requests

1 participant