React-路由

React路由

根据不同的路径显示不同的组件内容,使用react-router-dom库
安装:npm install react-router-dom

下面例子中,通过export暴露App类,返回index.js中使用渲染,下面代码中,需要注意的是,Router的div内容是正常显示的,其中使用的exact为精确匹配

import React from 'react'

import { BrowserRouter as Router, Link, Route } from 'react-router-dom'

function Home() {
    return (
        <div>
            <h1>首页</h1>
        </div>
    )
}

function Me() {
    return (
        <div>
            <h1>个人中心</h1>
        </div>
    )
}

function Product() {
    return (
        <div>
            <h1>产品中心</h1>
        </div>
    )
}

export default class App extends React.Component {
    render () {
        return (
            <div>
                <p>这是普通内容</p>
                <Router>
                    <div>
                        <Link to='/'>Home</Link>
                        <br />
                        <Link to='/product'>Product</Link>
                        <br />
                        <Link to='/me'>个人中心</Link>
                    </div>
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/product" component={Product}></Route>
                    <Route path="/me" component={Me}></Route>
                </Router>
            </div>
        )
    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以添加在Router中添加bansename属性,意思是给每一个路由添加一个前缀路由

import React from 'react'

import { BrowserRouter as Router, Link, Route } from 'react-router-dom'

function Home() {
    return (
        <div>
            <h1>首页</h1>
        </div>
    )
}

function Me() {
    return (
        <div>
            <h1>个人中心</h1>
        </div>
    )
}

function Product() {
    return (
        <div>
            <h1>产品中心</h1>
        </div>
    )
}

export default class App extends React.Component {
    render () {
        return (
            <div>
                <p>这是普通内容</p>
                <Router basename="admin">
                    <div>
                        <Link to='/'>Home</Link>
                        <br />
                        <Link to='/product'>Product</Link>
                        <br />
                        <Link to='/me'>个人中心</Link>
                    </div>
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/product" component={Product}></Route>
                    <Route path="/me" component={Me}></Route>
                </Router>
            </div>
        )
    }
}

在这里插入图片描述
Link标签中的to属性可以传递的不仅仅是字符串,还可以是变量,下面例子,修改个人中心的路由

import React from 'react'

import { BrowserRouter as Router, Link, Route } from 'react-router-dom'

function Home() {
    return (
        <div>
            <h1>首页</h1>
        </div>
    )
}

function Me(props) {
    console.log(props);
    return (
        <div>
            <h1>个人中心</h1>
        </div>
    )
}

function Product() {
    return (
        <div>
            <h1>产品中心</h1>
        </div>
    )
}

export default class App extends React.Component {
    render () {
        const meObj = {
            pathname: 'me',
            search: '?username=admin',
            hash: '#abc',
            state: {
                msg: 'hello'
            }
        }
        return (
            <div>
                <p>这是普通内容</p>
                <Router basename="admin">
                    <div>
                        <Link to='/'>Home</Link>
                        <br />
                        <Link to='/product'>Product</Link>
                        <br />
                        <Link to={meObj}>个人中心</Link>
                    </div>
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/product" component={Product}></Route>
                    <Route path="/me" component={Me}></Route>
                </Router>
            </div>
        )
    }
}

在这里插入图片描述

在Link标签中使用replace,作用是替换当前的路由,也就是如果点击返回上一步,返回的是被替换掉的路由的上一个路由

import React from 'react'

import { BrowserRouter as Router, Link, Route } from 'react-router-dom'

function Home() {
    return (
        <div>
            <h1>首页</h1>
        </div>
    )
}

function Me(props) {
    console.log(props);
    return (
        <div>
            <h1>个人中心</h1>
        </div>
    )
}

function Product() {
    return (
        <div>
            <h1>产品中心</h1>
        </div>
    )
}

export default class App extends React.Component {
    render () {
        const meObj = {
            pathname: 'me',
            search: '?username=admin',
            hash: '#abc',
            state: {
                msg: 'hello'
            }
        }
        return (
            <div>
                <p>这是普通内容</p>
                <Router basename="admin">
                    <div>
                        <Link to='/'>Home</Link>
                        <br />
                        <Link to='/product'>Product</Link>
                        <br />
                        <Link replace to={meObj}>个人中心</Link>
                    </div>
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/product" component={Product}></Route>
                    <Route path="/me" component={Me}></Route>
                </Router>
            </div>
        )
    }
}

动态路由,通过props.match.params.xxx获取参数

import React from 'react'

import { BrowserRouter as Router, Link, Route } from 'react-router-dom'

function Home() {
    return (
        <div>
            <h1>首页</h1>
        </div>
    )
}

function Me(props) {
    console.log(props);
    return (
        <div>
            <h1>个人中心</h1>
        </div>
    )
}

function Product() {
    return (
        <div>
            <h1>产品中心</h1>
        </div>
    )
}

function News(props) {
    console.log(props);
    return (
        <div>
            <h1>新闻中心,url中的id={props.match.params.id}</h1>
        </div>
    )
}

export default class App extends React.Component {
    render () {
        const meObj = {
            pathname: 'me',
            search: '?username=admin',
            hash: '#abc',
            state: {
                msg: 'hello'
            }
        }
        return (
            <div>
                <p>这是普通内容</p>
                <Router basename="admin">
                    <div>
                        <Link to='/'>Home</Link>
                        <br />
                        <Link to='/product'>Product</Link>
                        <br />
                        <Link replace to={meObj}>个人中心</Link>
                        <br />
                        <Link to="/news123">新闻</Link>
                    </div>
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/product" component={Product}></Route>
                    <Route path="/me" component={Me}></Route>
                    <Route path="/news:id" component={News}></Route>
                </Router>
            </div>
        )
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native 中,可以使用第三方库来实现路由拦截。一个常用的库是 React Navigation,它提供了强大的导航和路由管理功能。 要实现路由拦截,可以使用 React Navigation 提供的导航守卫功能。导航守卫可以在路由变化前或后执行自定义的逻辑。 以下是一个简单的示例,演示如何在 React Native 中使用 React Navigation 实现路由拦截: 1. 首先,确保已经安装了 React Navigation: ``` npm install @react-navigation/native ``` 2. 安装所需的导航器(例如 Stack Navigator): ``` npm install @react-navigation/stack ``` 3. 创建一个名为 `NavigationService.js` 的新文件,用于导航拦截逻辑: ```javascript import { NavigationActions } from '@react-navigation/compat'; let navigator; function setTopLevelNavigator(navigatorRef) { navigator = navigatorRef; } function navigate(routeName, params) { navigator.dispatch( NavigationActions.navigate({ routeName, params, }) ); } // 添其他需要的导航方法 export default { navigate, setTopLevelNavigator, }; ``` 4. 在根组件中设置导航器并引用 `NavigationService.js`: ```javascript import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import NavigationService from './NavigationService'; const Stack = createStackNavigator(); function App() { return ( <NavigationContainer ref={navigatorRef => { NavigationService.setTopLevelNavigator(navigatorRef); }}> <Stack.Navigator> {/* 添其他屏幕 */} </Stack.Navigator> </NavigationContainer> ); } export default App; ``` 5. 在需要拦截的组件中使用 `NavigationService.js`: ```javascript import NavigationService from './NavigationService'; // 在需要拦截的地方调用 `NavigationService.navigate` 方法 NavigationService.navigate('ScreenName'); ``` 通过这种方式,你可以在路由变化前后执行自定义的逻辑,例如验证用户权限、处理特定的跳转逻辑等。需要注意的是,这只是一个简单的示例,你可以根据具体的需求进行定制和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值