改造create-react-app 引入dva和antd

改造create-react-app 引入dva和antd

脚手架搭建项目

  1. 先用脚手架把项目搭建

    npx create-react-app my-react-a

  2. 项目结构
    在这里插入图片描述

  3. 试一下跑起来项目

    yarn start

  4. 暴露webpack 配置

    npm run eject

​ 这边脚手架中的配置就完毕了

将项目改造为dva

  1. 引入dva库

    1. npm install dva -D
  2. 改造项目

    1. src目录下新建models,routes,services,utils文件夹
    2. 在routes中写三个组件
      在这里插入图片描述

    组件代码如下

    import React, { Component } from 'react';
     
    class AAA extends Component {
      render() {
        debugger
        return (
          <div>
            <p>
              AAA</p>
          </div>
        );
      }
    }
     
    export default AAA;
    

    另外两个组件类似

  3. 在model下新建四个文件:aaa.js bbb.js ccc.js 和app.js(app作为全局model使用,将来存放全局变量,如国际化参数,登录用户信息等)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4fKDllJ-1629276441688)(C:\Users\YC01351\AppData\Roaming\Typora\typora-user-images\image-20210818134045922.png)]

    代码如下:

    const aaa = {
     
        namespace: 'aaa',
      
        state: {
          name:'这是aaa的model'
        },
      
        subscriptions: {
          
        },
      
        effects: {
          
        },
      
        reducers: {
          
        },
      
      };
      export default aaa;
    

    其他model类似

  4. 在src下面创建route.js,用来进行路由控制,

import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import dynamic from 'dva/dynamic'
 
const menuGlobal=[
  {
      id:'aaa',
      pid:'0',
      name:'aaa页',
      icon:'user',
      path: '/', //默认页
      models: () => [import('./models/aaa')], //models可多个
      component: () => import('./routes/AAA'),
  }, 
  {
      id:'bbb',
      pid:'0',
      name:'bbb页',
      icon:'user',
      path: '/aaa/bbb',
      models: () => [import('./models/bbb')], //models可多个
      component: () => import('./routes/BBB'),
  }, 
  {
      id:'ccc',
      pid:'0',
      name:'ccc页',
      icon:'user',
      path: '/ccc',
      models: () => [import('./models/ccc')], //models可多个
      component: () => import('./routes/CCC'),
  }, 
];
 
function RouterConfig({ history, app }) {
 
  return (
    <Router history={history}>
      <Switch>
        {
          menuGlobal.map(({path,...dynamics},index)=>(
            <Route
              key={index} 
              path={path} 
              exact 
              component={dynamic({
                app,
                ...dynamics
              })} 
            />
          ))
        }
      </Switch>
    </Router>
  );
}
 
export default RouterConfig;
  1. 改造src目录下的index.js入口文件

    import dva from 'dva';
    import './index.css';
    import createHistory from 'history/createBrowserHistory'
     
    // 1. Initialize
    const app = dva({
        history:createHistory()
    });
     
    // 2. Plugins
    // app.use({});
     
    // 3. Model
    app.model(require('./models/app').default);
     
    // 4. Router
    app.router(require('./router').default);
     
    // 5. Start
    app.start('#root');
    

至此,dva改造完毕

直接 yarn start 就可以把项目跑起来

在这里插入图片描述

项目跑起来之后可以改造一下组件,使得各个组件可以通过路由跳转

import React, { Component } from 'react';
import { Link } from 'dva/router';

class AAA extends Component {
  render() {
    return (
      <div>
        <p>
          AAA</p>
        <Link to={'/aaa/bbb'}>BBB</Link>
      </div>
    );
  }
}
 
export default AAA;

其他组件类似改造

优化一下资源依赖结构

  1. 在utils下新建config.js和index.js两个文件

  2. 将路由数组拿到config,js下,注意修改下引入路径,否则会报错

    1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bjDxYcZM-1629276441692)(C:\Users\YC01351\AppData\Roaming\Typora\typora-user-images\image-20210818141133337.png)]

    2. const menuGlobal=[
          {
              id:'aaa',
              pid:'0',
              name:'aaa页',
              icon:'user',
              path: '/',
              models: () => [import('../models/aaa')], //models可多个
              component: () => import('../routes/AAA'),
          }, 
          {
              id:'bbb',
              pid:'0',
              name:'bbb页',
              icon:'user',
              path: '/aaa/bbb',
              models: () => [import('../models/bbb')], //models可多个
              component: () => import('../routes/BBB'),
          }, 
          {
              id:'ccc',
              pid:'0',
              name:'ccc页',
              icon:'user',
              path: '/ccc',
              models: () => [import('../models/ccc')], //models可多个
              component: () => import('../routes/CCC'),
          }, 
        ];
      
        export default {
            menuGlobal
        }
      
  3. index.js里面引入config.js

    1. import config from './config'
      
      export {
          config
      }
      
  4. route.js重新引入依赖

    1. import React from 'react';
      import { Router, Route, Switch } from 'dva/router';
      import dynamic from 'dva/dynamic'
      
      import { config } from './utils/index'
      const { menuGlobal } = config
      
      function RouterConfig({ history, app }) {
      
          return (
              <Router history={history}>
                  <Switch>
                      {
                          menuGlobal.map(({ path, ...dynamics }, index) => (
                              <Route
                                  key={index}
                                  path={path}
                                  exact
                                  component={dynamic({
                                      app,
                                      ...dynamics
                                  })}
                              />
                          ))
                      }
                  </Switch>
              </Router>
          );
      }
      
      export default RouterConfig;
      

引入antd组件库

  1. 安装antd
    1. cnpm i antd --save
  2. 引入antd组件的样式
    1. 方式一:全局一次性引入样式
    2. 按需加载样式
  3. 全局引入的方式
    1. 在src下的index.css目录中直接@import ‘~antd/dist/antd.css’; 引入即可

引入less样式

  • 引入less包

    • cnpm install less-loader@7.3.0 --save-dev
    • 引入版本过高可能会报错
  • 然后改造webpack

    • ...//添加less,可以仿照项目中对sass的支持
      const lessRegex = /\.less$/;
      const lessModuleRegex = /\.module\.less$/;
      ...
      //在rules数组中添加如下代码
      {              
      	test: lessRegex,              
      	exclude: lessModuleRegex,             
       	use: getStyleLoaders({ 
       	importLoaders: 2,
       	sourceMap: isEnvProduction                       
       	? shouldUseSourceMap                     
       	 : isEnvDevelopment, },                  
       	 'less-loader'              
       	 ),              
       	 	sideEffects: true,         
       	  },         
       	   {             
       	   	 	test: lessModuleRegex,             
       	     	use: getStyleLoaders({                     
       	     	importLoaders: 2,                     
       	       	sourceMap: isEnvProduction                      
       	       	? shouldUseSourceMap                     
       	        : isEnvDevelopment,                    
       	        modules: { getLocalIdent: getCSSModuleLocalIdent,  }, 
       	        },   
       	        'less-loader' 
       	    )},   
       	       ...
      
  • 修改src下面的index.css为index.less

  • 在index中引入index.less

  • 重启项目刷新页面
    在这里插入图片描述

至此,基本项目改造完毕,可以开发项目了

参考: https://blog.csdn.net/xw505501936/article/details/80621740

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值