zoukankan      html  css  js  c++  java
  • React-Router

    路由

    • 下载插件
    cnpm install react-router-dom --save-dev
    
    • 创建几个jsx页面,然后创建一个router文件夹/index.js文件
    import React, { Component } from 'react';
    import { Route,browserHistory,HashRouter,Switch,Redirect } from 'react-router-dom';
    import asyncComponent from '@/utils/asyncComponent';
    
    import home from "@/pages/home/home";
    const record = asyncComponent(() => import("@/pages/record/record"));
    const recordId = asyncComponent(() => import("@/pages/recordId/recordId "));
    const user = asyncComponent(() => import("@/pages/user/user"));
    
    // 关于Route的exact,加上exact代表当前路由path的路径采用精确匹配
    // 比如说Home的path如果不加上exact,那么path="/about"将会匹配他自己与path="/" 这两个,所以一般path="/" 一般会加上exact
    // 另外需要注意一点的是嵌套路由不要加exact属性,如果父级路由加上,他下面的子路由将不会生效,因为外层强制匹配了
    export default class RouteConfig extends Component{
      render(){
        return(
          // 标签可以是 browserHistory 或者 HashRouter
          // browserHistory不带#,HashRouter带#
          <browserHistory>
            <Switch>
              <Route path="/" exact component={home} />
              <Route path="/record" component={record} />
              // 二级参数路由
              <Route path="/record/:id" component={recordId} />
              <Route path="/user" component={user}/>
              <Redirect to="/" />
            </Switch>
          </browserHistory>
        )
      }
    }
    
    • 上面的异步加载组件的方法
    // utils/asynvComponent.js
    
    import React, { Component } from "react";
    
    export default function asyncComponent(importComponent) {
      class AsyncComponent extends Component {
        state = {
            component: null
        }
        async componentDidMount() {
          const { default: component } = await importComponent();
    
          this.setState({ component });
        }
        render() {
          const C = this.state.component;
          return C ? <C {...this.props} /> : null;
        }
      }
      return AsyncComponent;
    }
    
    • 入口文件的修改
    import React from 'react';
    import ReactDOM from 'react-dom';
    import Route from './router/';
    
    const render = Component => {
      ReactDOM.render(<Component />,document.getElementById('root'))
    }
    render(Route);
    
    • 挂载路由后this的变化
    // 增加了两个对象的属性
    this.props.match
    this.props.location
    
    • 子路由
    // user.js
    
    import { Link, Switch, Route, Redirect } from 'react-router-dom';
    
    ...
    render() {
      return (
        // 子路由建议写在父组件里,当路由满足子路由的条件,子组件就会显示出来
        // 比如访问 /user 是看不到下面的组件的
        // 访问/user/123 就可以看到了
        <Switch>
          <Route path={ this.props.match.path+"/:id" } component={ userDetail } />
        </Switch>
      );
    }
    ...
    
    • 标签路由和参数
    // home.js
    import { Link, Switch, Route, Redirect } from 'react-router-dom';
    
    ...
    state = {
      id : "abc123"
    }
    render() {
      return (
         <div>
              <Link to="/home">home</Link>
              <Link to={ this.state.id } >user</Link>
              <Link to={ "/xxx/"+this.state.id } >xxx</Link>
              <Link to={{ path:'/xxx', state: {k:v}, query: {k:v} }}>参数</Link>
         </div>
      );
    }
    ...
    
    • 方法路由和参数
    this.props.history.push("/xxx")
    this.props.history.replace("/xxx")
    this.props.history.push({ 
         pathname: "/xxx/" + this.state.id, state: {k:v}, query: {k:v}
    });
    
    // 冒号的传参
    this.props.match.params.xx
    // query的传参,可见
    this.props.location.query.xx
    // state的传参,不可见
    this.props.location.state.xx
    

    监听全局的路由变化,进行权限的判断等

    • 没找到对应的方法

    路由热更新

    • 网上的教程需要改造webpack的配置,但是发现没这个文件,因为react-scripts把所有的配置都藏起来了
    • 首先把脚手架的.git.gitignore文件删了
    • 执行命令
    npm run eject
    选 y
    
    • 安装
    npm install --save-dev react-hot-loader
    
    • config/webpack.config.js
    entry: [
      'react-hot-loader/patch', // 添加本行
      require.resolve('./polyfills'),
      require.resolve('react-dev-utils/webpackHotDevClient'),
      paths.appIndexJs
    ]
    
    • 入口文件index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import Route from './router/';
    import { AppContainer } from 'react-hot-loader';
    
    const render = Component => {
      ReactDOM.render(
          <AppContainer>
            <Component />
          </AppContainer>,
        document.getElementById('root'),
      )
    }
    
    render(Route);
    
    // Webpack Hot Module Replacement API
    if (module.hot) {
      module.hot.accept('./router/', () => {
        render(Route);
      })
    }
    
    • 启动之后修改子组件内的数据,就不会刷新页面了
  • 相关阅读:
    C/S 随思录
    3dTiles 最后一块拼图:几何误差与屏幕空间误差
    aps.net cannot connect to runtime process
    asp.net web api swagger使用总结
    asp.net webaip 跨域
    LightGBM算法实践
    Zabbix 机器 CPU 飙高 和 时区相差8个小时
    【vue踩坑记录】3、“Error in render: "TypeError: Cannot read property '0' of undefined"”渲染错误问题
    1-关于补码的理解
    vscode快捷键
  • 原文地址:https://www.cnblogs.com/pengdt/p/13070758.html
Copyright © 2011-2022 走看看