前端路由(七)-编程式导航——通过js方法实现路由跳转 & 获取编程式导航传递的参数-props.location.state & 如果组件不是路由组件-必须使用withRouter包裹原始的组件

编程式导航——通过js方法实现路由跳转 & 获取编程式导航传递的参数-props.location.state & 如果组件不是路由组件-必须使用withRouter包裹原始的组件

  • 通过js动态控制路由跳转

    • 导入withRouter
    import { withRouter } from "react-router-dom";
    
    • 导出时使用withRouter包裹组件
    export default withRouter(Login);
    
    • 被包裹的组件中可以通过props获取history对象
    let { history } = this.props
    
    • 然后可以使用history对象调用push方法进行跳转
    history.push('/home', {uname: 'lisi'})
    
    • 登录组件
    class Login extends React.Component {
      constructor(props) {
        super(props);
      }
      handle = () => {
        const {history} = this.props;
        history.push('/home', {info: 'hello'});
      }
      render() {
        return (
          <div>
            <div>登录页面</div>
          <div>
              用户名:<input type="text"/>
              密码:<input type="text"/>
            </div>
            <div>
              <button onClick={this.handle}>登录</button>
            </div>
          </div>
        );
      }
    }
    

实例

第一步:安装依赖包

npm install react-router-dom -D

第二步:在APP.js同层级的component下新建router文件夹,其下新建文件06-编程式导航.js

第三步:在App.js中进行导入

import React from 'react';
import BaseRouter from './component/router/06-编程式导航'

function App () {
  return (
    <div>
      <BaseRouter/>
    </div>
  )
}

export default App;

component/router/06-编程式导航.js文件如下

/*
  编程式导航:通过js方法实现路由跳转
*/
import React from 'react'
import { BrowserRouter, Route, Link, withRouter } from 'react-router-dom'

class Login extends React.Component {
  handleLogin = () => {
    // 控制表单的登录
    console.log(this.props)
    console.log(this.props.history.push)
    // 可以使用props.history.push实现路由跳转
    this.props.history.push('/home', {
      info: 'nihao'
    })
    // console.log(this.props)
  }
  render () {
    return (
      <div>
        <div>登录页面</div>
        <div>
          用户名: 
          <input type="text" />
        </div>
        <div>
          密码: 
          <input type="text" />
        </div>
        <div>
          <button onClick={this.handleLogin}>提交</button>
        </div>
      </div>
    )
  }
}

function Home (props) {
  console.log(props)
  console.log(props.location.state)
  // 如何获取编程式导航传递的参数?
  // props.location.state
  let param = props.location.state
  return <div>Home:{param && param.info}</div>
}

// withRouter可以向Login组件中注入路由相关属性
// 如果组件不是路由组件,必须使用withRouter包裹原始的组件
const MyLogin = withRouter(Login)
class TestLogin extends React.Component {
  render () {
    return (
      <div>
        <MyLogin/>
      </div>
    )
  }
}

class TestRouter extends React.Component {
  render () {
    return (
      <BrowserRouter>
        <div>
          <div>测试编程式导航</div>
          <Link to='/login'>登录</Link>
          <br></br>
          <Link to='/testlogin'>TestLogin</Link>
          <br></br>
          <Link to='/home'>主页</Link>
          <hr></hr>
          <Route path='/login' component={Login}/>
          <Route path='/testlogin' component={TestLogin}/>
          <Route path='/home' component={Home}/>
        </div>
      </BrowserRouter>
    )
  }
}

export default TestRouter

npm run start启动项目,页面如下:

前端路由(七)-编程式导航——通过js方法实现路由跳转 & 获取编程式导航传递的参数-props.location.state & 如果组件不是路由组件-必须使用withRouter包裹原始的组件

上一篇:jQuery 事件绑定 和 JavaScript 原生事件绑定


下一篇:React 在非路由组件中实现编程式路由跳转