dva中组件的懒加载

Dva 2.0 按需加载实践
本文详细介绍了在Dva 2.0框架中如何利用dynamic函数进行组件的按需加载,以优化首屏性能。对比了Dva 2.0前后按需加载的不同实现方式,包括使用webpack的require.ensure和react-router@4.0的组件式路由。

组件的按需加载是提升首屏性能的重要手段。

dva@2.0使用了react-router@4.0,相关的使用方式有变化,网上的讨论基本上都是旧的,不清楚的话会比较乱,这里做一下记录。

dva@2.0以前

dva@2.0以前的懒加载相关讨论有不少,可以参考dva-example-user-dashboard中的写法,徐飞大佬的文章使用 Dva 开发复杂 SPA,本质上借助的是webpack的require.ensure实现代码分割,参考代码分割 - 使用 require.ensure
具体实现形如:

function RouterConfig({ history, app }) {
  const routes = [
    {
      path: '/',
      name: 'IndexPage',
      getComponent(nextState, cb) {
        require.ensure([], (require) => {
          registerModel(app, require('./models/dashboard'));
          cb(null, require('./routes/IndexPage'));
        });
      },
    },
    {
      path: '/users',
      name: 'UsersPage',
      getComponent(nextState, cb) {
        require.ensure([], (require) => {
          registerModel(app, require('./models/users'));
          cb(null, require('./routes/Users'));
        });
      },
    },
  ];

  return <Router history={history} routes={routes} />;
}

dva@2.0以后

dva@2.0使用了react-router@4.0,其中的路由是组件式的,原来的方式就不太好搞。因此dva提供了一个dynamic函数来处理。
dva@2.0发布日志dva api文档中有介绍。
具体实现形如:

import dynamic from 'dva/dynamic';

function RouterConfig({ history,app }) {
  const UserPageComponent = dynamic({
    app,
    models: () => [
      import('./models/users'),
    ],
    component: () => import('./routes/UserPage'),
  });
  return (
    <Router history={history}>
      <Switch>
        <Route path="/user" component={UserPageComponent} />
        <Route component={IndexPageComponent} />
      </Switch>
    </Router>
  );
}
export default RouterConfig;
在函数组件中使用dva,可参考以下步骤和方法: ### 1. 连接组件dva的state 使用`connect`函数将函数组件dva的state连接起来,使组件可以获取到state中的数据。示例如下: ```jsx import { connect } from 'umi'; const dva: React.FC = (props: any) => { const { dispatch, data: { data } } = props; // 其他逻辑 return ( <div> {/* 组件内容 */} </div> ); }; // 当使用 connect() 导出时umi默认会把dispatch和state(state为data)放入函数的props中 // 第一个参数的函数的第一个参数为一个对象,想获取某个model可通过data.model的命名空间获取该model的state,这个函数的返回值会传个connect第二个括号的组件的props中 export default connect((data: any) => data)(dva); ``` 在这个例子中,通过`connect`函数将`dva`组件dva的state连接,`(data: any) => data` 是固定写法,将state传给props中的`data` [^2]。 ### 2. 发起dispatch请求 在函数组件中,可以使用`dispatch`来触发model中的effects或reducers。示例如下: ```jsx const getData = () => { dispatch({ type: "data/getData", // model的命名空间/方法(effects中*后面的为方法名) payload: null, // 传的参数 在对应models中的effects可以拿到 callback(res: any) { // res为传给callback的值 console.log("callback", res); } }); }; ``` 这里通过`dispatch`发起了一个请求,调用`data` model中的`getData`方法,并传递了参数和回调函数 [^2]。 ### 3. 懒加载组件dva@2.0中,使用`dynamic`函数来实现组件懒加载。示例如下: ```jsx import dynamic from 'dva/dynamic'; function RouterConfig({ history, app }) { const UserPageComponent = dynamic({ app, models: () => [ import('./models/users'), ], component: () => import('./routes/UserPage'), }); return ( <Router history={history}> <Switch> <Route path="/user" component={UserPageComponent} /> <Route component={IndexPageComponent} /> </Switch> </Router> ); } export default RouterConfig; ``` 在这个例子中,使用`dynamic`函数对`UserPageComponent`进行了懒加载,同时加载了对应的model [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值