首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dva框架-快速了解

dva框架-快速了解

作者头像
用户9914333
发布于 2022-07-22 06:54:27
发布于 2022-07-22 06:54:27
2.3K00
代码可运行
举报
文章被收录于专栏:bug收集bug收集
运行总次数:0
代码可运行

0 1

dva的介绍

官方文档:

https://dvajs.com/guide/

背景:

使用redux-saga需要在action , reducers,saga三个文件中切换,而可以使用dva框架来简化这一个过程.

dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。

0 2

dva的安装

通过 npm 安装 dva-cli 并确保版本是 0.9.1 或以上。

安装dva

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install dva-cli -g
dva -v
dva-cli version 0.9.1

创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dva new dva-quick
cd dva-quickstart
npm start

0 3

dva的目录结构

0 4

models文件介绍

model模块的写法:

namespace: 命名空间,后续我们取得数据的时候要注意加上命名空间

state: 状态,即数据

subscriptions:这里的方法,直接就会执行,一般用于数据的初始化

reducers: 纯函数,如果有异步,必须借助effect

effects:副作用(业务逻辑,包含同步和异步)

这里的键名,就是action中type的字段

payload: action传参数,都放在这里

call() : 表示调用异步函数

如果yield call的是一个Promise对象,那只有在Promise返回的是resolve方法的情况下,下面跟着的yield put及后面的代码才会执行,若返回了rejector则后面的代码则全部停止执行

put 表示 dispatch action,其他的还有 select, take, fork, cancel 等

注:yield put直接调用reducer,是堵塞的,同步,

调用非reducer函数,是非堵塞的,异步

使用put.resolve ,堵塞的,同步

model模块的写法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { getTodolistDataApi } from '../services/todolist'
export default{
    namespace:"todolist",//命名空间,后续我们取得数据的时候要注意加上命名空间 , 把它和combineReducer 接受参数的键名关联起来
    // 数据
    state:{
        tasks:[]
    },
          // subscriptions里的方法,直接就会执行,一般用于数据的初始化
    subscriptions:{ 
  
      setup({dispatch,history}){ //可以是任何键名
        // 另外,参数会自动注入进来,有dispatch,history
          console.log('init');
           dispatch({type:'common/setToken',payload:'123'})
      }
    },
    // 副作用(一些业务逻辑,包含同步和异步,你可以把它和vuex里面的mutations 和actions关联起来)
    effects:{
        /*这里的键名,就是action中type的字段*/
        *getData({payload},{call,put}){
           const res =  yield call(getTodolistDataApi);
           console.log(res.data.data);
           yield put({type:'setTasks',payload:res.data.data})
        }
    },
    reducers:{
        setTasks(state,action){
             return {...state,tasks:action.payload}
        }
    }
}

0 5

services 请求数据

将请求后台数据的方法,全部提取到services文件夹中

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import request from "../utils/request";
// 获取购物车数据 
export const getShopcartDataApi = ()=> request('/shopcart/getShopcartData')
export const changeNumApi =
 (params)=> request('/shopcart/changeNum',{
     method:"post",
     body:params
})

0 6

util 公共文件

将提取的一些公共方法放在此文件夹中

如:封装的请求方法request.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import fetch from 'dva/fetch';

const baseUrl = 'http://172.16.102.181';
function parseJSON(response) {
  return response.json();
}

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }
  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}
/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options={method:'get'}) {
  if(options.method.toLowerCase()=='post'){
    options.body = JSON.stringify(options.body || {});
    options.headers={
      'Content-Type':'application/json;charset=utf-8'
    }
  }
  return fetch(baseUrl+url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then(data => ({ data }))
    .catch(err => ({ err }));
}

0 7

router.js 路由设置文件

与react-router-dom v5 语法相似,只是已经将其它封装到dva中,所以要从dva中去引用router.

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import IndexPage from './routes/IndexPage';
import Home from './routes/home';
import Login from './routes/login';
import Reg from './routes/reg';


function RouterConfig({ history }) {
  return (
    <React.Suspense fallback={<div>加载中...</div>}>
    <Router history={history}>
      <Switch>
       <Route path="/" exact component={IndexPage} />
       <Route path="/home" component={React.lazy(()=>import('./routes/home'))} />
       <Route path="/login" component={React.lazy(()=>import('./routes/login'))} />
       <Route path="/reg" component={React.lazy(()=>import('./routes/reg'))} />
      </Switch>
    </Router>
    </React.Suspense>
  );
}
export default RouterConfig;

0 8

组件中的路由跳转

NavLink, Route,Redirect等,与react中的react-router-dom v5 语法一致

注: 最新的react-router-dom v6的语法与v5还是有很大的不同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
import { Switch,Route,Redirect,NavLink } from 'dva/router'
import styles from  './index.less'
import {app} from '../../index';
import dynamic from 'dva/dynamic';
const shopcartComponent = dynamic({
  app,
  models: () => [
    import('../../models/shopcart'),
  ],
  component: () => import('../shopcart'),
});
const todolistComponent = dynamic({
    app,
    models: () => [
      import('../../models/todolist'),
    ],
    component: () => import('../todolist'),
  });
export default function Index(){
    return (
    <div className={styles.home}>
        <div className={styles.left}>
           <div>
           <NavLink to='/home/person' activeStyle={{color:'red'}}>人员管理</NavLink>
           </div> 
           <div>
           <NavLink to='/home/goods' activeStyle={{color:'red'}}> 商品管理</NavLink>
           </div> 
           <div>
           <NavLink to='/home/shopcart' activeStyle={{color:'red'}}> 购物车</NavLink>
           </div> 
           <div>
           <NavLink to='/home/todolist' activeStyle={{color:'red'}}> 任务列表</NavLink>
           </div>
        </div>
        <div className={styles.right}>
           <Switch>
               <Redirect from='/home' to='/home/person' exact />
               <Route path='/home/person' component={React.lazy(()=>import('../person'))}/>
               <Route path='/home/goods' component={React.lazy(()=>import('../goods'))}/>
               <Route path='/home/shopcart' component={shopcartComponent}/>
               <Route path='/home/todolist' component={todolistComponent}/>
           </Switch>
        </div>
    </div>)
}

0 9

index.js 入口文件

model():注入数据,需要哪一个models中的数据 ,就必须在入口中对其进行注入,可以与之的Provider关联起来

router(): 引用设置路由的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dva from 'dva';
import createLogger from 'redux-logger'
import './index.css';
// 1. Initialize
export const app = dva({
    onAction:createLogger
});

// 2. Plugins
// app.use({});
// 3. Model 数据注入 你可以把它和以前的Provider 组件的功能关联起来
//app.model(require('./models/shopcart').default);
//app.model(require('./models/todolist').default);
app.model(require('./models/common').default);
// 4. Router
app.router(require('./router').default);
// 5. Start
app.start('#root');

0 9

routes文件夹,类似pages

和react 组件的写法一样,对于model中的状态使用,也使用connect方法,与redux的使用方法相似

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React , {Component} from 'react'
import styles from './index.less';
import {connect} from  'dva';
class Todolist extends Component{
    componentDidMount(){
          this.props.dispatch({type:'todolist/getData'});
         // todolist是Models文件中设置的namespace的值
    }
    render(){
        const {tasks} = this.props; 
        return (
            <>
            <div>
                <input placeholder='请输入任务' /> <button>添加任务</button>
            </div>
            <ul>
                {
                    tasks.map((item)=>{
                       return (<li key={item._id} className={styles[item.status]}>{item.task}</li>)
                    })
                }
              
                <li className={styles.undone}>学习react</li>
            </ul>
            <div>
                <button className={styles.active}>全部</button>
                <button>已完成</button>
                <button>末完成</button>
            </div>
            </>
        )
    }
}
const mapStateToProps = (state)=>{
    return {
        tasks : state.todolist.tasks
    }
}
export default connect(mapStateToProps)(Todolist)

总结

dva框架介绍完成,希望通过本文能让大家对dva框架有个基本了解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React应用性能优化:组件懒加载的实践与思考
在前端开发中,随着React应用日益复杂,打包体积增大导致的加载性能问题逐渐凸显。本文将分享我在实际项目中使用React懒加载技术的实践经验,包括具体操作步骤、核心思路和遇到的挑战。
大王叫我来巡山、
2025/09/01
1000
DvaJS入门解析
最近找了个RN+TS仿喜马拉雅的项目,看到dva那几节蚌埠住了,然后就去找了个网课看看,写篇博客总结一下
henu_Newxc03
2021/12/28
8840
DvaJS入门解析
使用React、Electron、Dva、Webpack、Node.js、Websocket快速构建跨平台应用
目前Electron在github上面的star量已经快要跟React-native一样多了 这里吐槽下,webpack感觉每周都在偷偷更新,很糟心啊,还有Angular更新到了8,Vue马上又要出正
Peter谭金杰
2019/08/02
3.3K0
使用React、Electron、Dva、Webpack、Node.js、Websocket快速构建跨平台应用
『Dva』管理数据
通过上一篇文章的学习,我们已经知道了『Dva』是什么,以及『Dva』的使用方式,如何使用『Dva』来渲染我们的组件,其实 dva 的主用作用并不是用来渲染组件的,它的主要作用是对 redux、redux-saga 进行封装,它的作用就是用来管理数据的,那么我们就来看一下『Dva』是如何管理数据的。
程序员NEO
2024/01/23
3602
『Dva』管理数据
React的魅力: React-Router-集中式管理和Redux-核心概念
现在虽然我们能通过路由实现组件切换, 但是现在我们的路由都比较分散, 不利于我们管理和维护,所以 React 也考虑到了这个问题, 也给我们提供了统一管理路由的方案。
杨不易呀
2023/09/24
4460
React的魅力: React-Router-集中式管理和Redux-核心概念
React-Router-手动路由跳转
手动路由跳转是React Router中一个重要的概念,它允许您在React应用程序中通过编程方式控制路由导航,而不是依赖于用户的交互操作。这种能力对于实现复杂的导航逻辑、处理表单提交、或基于某些条件进行路由跳转非常有用。
杨不易呀
2023/10/01
7560
React-Router-URL参数
React Router 是 React 应用中常用的路由管理库,而 URL 参数则是它的一个关键概念。URL 参数允许您在路由之间传递数据,从而使您的应用程序更灵活和交互性更强。
杨不易呀
2023/10/01
4590
ES6 + React 开发极小知识集教程(附:dva 创建项目过程讲解)Kotlin 开发者社区
不要用 var,而是用 const 和 let,分别表示常量和变量。不同于 var 的函数作用域,const 和 let 都是块级作用域。
一个会写诗的程序员
2018/12/12
2.5K0
React第三方组件5(状态管理之Redux的使用②TodoList上)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件5(状态管理之Redux的使用①简单使用)---2018.03.20 2、React第三方组件5(状态管理之Redux的使用②TodoList上)---2018.03.21 3、React第三方组件5(状态管理之Redux的使用③TodoList中)---2018.03.22 4、React第三方组件5(状态管理之Redux的使用④TodoList下)---2018.03.23 5、
前端人人
2018/04/11
1.4K0
React第三方组件5(状态管理之Redux的使用②TodoList上)
react-react-dom v6 知识整合
1. BrowserRouter / HashRouter 相当于容器(类似router-view),用于指定路由的模式
用户9914333
2022/12/14
6.7K0
react-react-dom v6 知识整合
React第三方组件5(状态管理之Redux的使用①简单使用)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件5(状态管理之Redux的使用①简单使用)---2018.03.20 2、React第三方组件5(状态管理之Redux的使用②TodoList上)---2018.03.21 3、React第三方组件5(状态管理之Redux的使用③TodoList中)---2018.03.22 4、React第三方组件5(状态管理之Redux的使用④TodoList下)---2018.03.23 5、
前端人人
2018/04/11
1.5K0
React第三方组件5(状态管理之Redux的使用①简单使用)
React第三方组件2(状态管理之Refast的使用①简单使用)
本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件2(状态管理之Refast的使用①简单使用)---2018.01.29 2、React第三方组件2(状态管理之Refast的使用②异步修改state)---2018.01.30 3、React第三方组件2(状态管理之Refast的使用③扩展ctx)---2018.02.31 4、React第三方组件2(状态管理之Refast的使用④中间件middleware使用)---2018.02
前端人人
2018/04/11
1.9K0
React第三方组件2(状态管理之Refast的使用①简单使用)
React-Router-集中式管理
React Router 是 React 应用程序中常用的路由管理库,用于处理页面导航和路由控制。集中式管理是一种在大型应用程序中更好地组织和管理路由的方法,它有助于维护应用的可扩展性和可维护性。
杨不易呀
2023/10/01
4010
『Dva』路由
经上一篇『Dva』订阅,文章介绍,了解了下 Model 当中的 Subscription 也就是所谓的订阅,到此我们也掌握了如何通过 Dva 来管理数据。
程序员NEO
2024/11/26
2040
『Dva』路由
一篇文章读懂 React and redux 前端开发 -DvaJS, a lightweight and elm-style framework.快速上手Dva 概念 #例子和脚手架Dva 图解K
DvaJS: React and redux based, lightweight and elm-style framework.
一个会写诗的程序员
2018/12/12
1.5K0
react全家桶包括哪些_react 自定义组件
对于现在比较流行的三大框架都有属于自己的脚手架(目前这些脚手架都是使用node编写的,并且都是基于webpack的):
全栈程序员站长
2022/11/18
6.5K0
react全家桶包括哪些_react 自定义组件
面试官:说说React-SSR的原理
所谓同构,简而言之就是,第一次访问后台服务时,后台直接把前端要显示的界面全部返回,而不是像 SPA 项目只渲染一个 <div id="root"></div> 剩下的都是靠 JavaScript 脚本去加载。这样一来可以大大减少首屏等待时间。
beifeng1996
2022/10/10
2.5K0
Dva + Ant Design 前后端分离之 React 应用实践
继 Rails 从入门到完全放弃 拥抱 Elixir + Phoenix + React + Redux 这篇文章被喷之后,笔者很长一段时候没有上社区逛了。现在 tkvern 又回归了,给大家带来React实践的一些经验,一些踩坑的经验。
零式的天空
2022/03/23
2.9K0
写给前端新人:从 0到1 搭建一个前端项目,都需要做什么?
本案例使用脚手架 create-react-app 初始化了项目。此脚手架有利有弊吧,项目目录结构简洁,不需要太关心 webpack 令人头疼的配置;弊端在于,脚手架确实有些庞大,构建时间在 4mins 左右。各位看官择优选择吧,也可以完全自己搭建一个项目。
zz_jesse
2021/06/01
5.6K0
react实战:umi问卷发布系统
技术团队中,保持技术分享和持续的学习是完全必要的。企业主会说:"公司不是培训机构。"这固然正确。但一个公司,总会遇到这种或那种需要攻关的难题。当你不愿意分享解决方案,或者身边的同事既不愿意学习,也不接受新的东西,反而一而再再而三糊弄。那团队怎么配合?
一粒小麦
2019/07/31
5.9K0
react实战:umi问卷发布系统
推荐阅读
相关推荐
React应用性能优化:组件懒加载的实践与思考
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档