react+dva+antd接口调用方式

简介: 一丶 安装通过 npm 安装 dva-cli 并确保版本是0.8.1或以上。$ npm install dva-cli -g$ dva -v0.8.1二丶创建新应用安装完dva-cli之后,就可以在命令行里访问到dva命令(不能访问?)。

一丶 安装

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

$ npm install dva-cli -g
$ dva -v
0.8.1

二丶创建新应用

安装完dva-cli之后,就可以在命令行里访问到dva命令(不能访问?)。现在,你可以通过dva new创建新应用。

$ dva new dva-quickstart
$ npm start

之后浏览器就会打开 http://localhost:8000,你会看到dva的欢迎界面。

三丶使用antd组件库

通过 npm 安装 antd 和 babel-plugin-import。babel-plugin-import 是用来按需加载 antd 的脚本和样式的

$  npm  install antd babel-plugin-import --save

编辑.roadhogrc,使 babel-plugin-import 插件生效。

"extraBabelPlugins": [

-    "transform-runtime"

+    "transform-runtime",

+    ["import", { "libraryName": "antd", "style": "css" }]

],

注:dva-cli 基于 roadhog 实现 build 和 server,更多.roadhogrc的配置详见 roadhog#配置

四丶准备工作以及文件之间的对应关系

首先在创建文件之前(一般安装的时候系统会自动生成一个默认的services文件下 Example.js 和 model文件下 example.js,两者都是一一对应)

react项目的推荐目录结构(如果使用dva脚手架创建,则自动生成如下)

|── /mock/             # 数据mock的接口文件  
|── /src/              # 项目源码目录(我们开发的主要工作区域)   
|   |── /components/   # 项目组件(用于路由组件内引用的可复用组件)   
|   |── /routes/       # 路由组件(页面维度) 
|   |  |── route1.js  
|   |  |── route2.js   # 根据router.js中的映射,在不同的url下,挂载不同的路由组件
|   |  └── route3.js    
|   |── /models/       # 数据模型(可以理解为store,用于存储数据与方法)  
|   |  |── model1.js  
|   |  |── model2.js   # 选择分离为多个model模型,是根据业务实体进行划分
|   |  └── model3.js  
|   |── /services/     # 数据接口(处理前台页面的ajax请求,转发到后台)   
|   |── /utils/        # 工具函数(工具库,存储通用函数与配置参数)     
|   |── router.js       # 路由配置(定义路由与对应的路由组件)  
|   |── index.js       # 入口文件  
|   |── index.less      
|   └── index.html     
|── package.json       # 项目信息  
└── proxy.config.js    # 数据mock配置

五丶创建接口文件New.js

  1. 在services文件下创建New.js, .yield call方法里面的usersService.fetch方法如下(PAGESIZE目前是常量) New.js代码如下:
import request from '../utils/request'; 

// data: [{Id, Text, CreateTime, UpdateTime, IsActive }]
export function queryScaleMenu(start, limit) {
    let body = {
        start,
        limit
    }
    body = JSON.stringify(body);
    return request('http://192.168.10.45/GYHL.News/api/news/menu/query', { 
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: body
     });
    
} 

export function queryScaleNews(start, limit, type) {
    let body = {
        start,
        limit,
        type
    }
    body = JSON.stringify(body);
    return request('http://192.168.10.45/GYHL.News/api/news/new/query', { 
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: body
     });
}
  1. 然后在models中创建对应的New.js, 因为services下的New.js 和models下的New.js 两者是react 调入接口和接收接口参数 密不可分的文件。
import * as services from './../services/News';

export default {
    namespace: 'News',

    state: {
        detail:[],
        data: [],
    },

    subscriptions: {
        steup({dispatch, history}) {
            return history.listen((location) => {
                // console.log(location);
                let start = 0;
                let limit = 1000;
                let type = "7ad2c8db-ff04-4736-81c9-1b7c6fb276b3";
                dispatch({type: "fetchMenu",payload:{start,limit}});
                dispatch({type: "fetchNews",payload:{start,limit,type}});           
            })
            
        }
    },

    effects: {
        * fetchMenu({ payload: { start, limit, ...rest } },{ call, put }){
            var nextMenu = yield call(services.queryScaleMenu, start, limit ); 
            // console.log(nextMenu);  
            var startNews = nextMenu.data.data;
            yield put({ type: "save", payload: { detail:startNews}});

        },
        * fetchNews({ payload: { start, limit, type, ...rest }}, { call, put }){
            var nextNews = yield call(services.queryScaleNews, start, limit, type);
            // console.log(nextNews);
            var lastNews  = nextNews.data.data;
            yield put({ type: "save", payload: { data:lastNews }});
        }
    },

    reducers: {
        save(state, action){
            return { ...state, ...action.payload}
        }
    },
};

六丶把components文件下Example.js组件修改一下

import React from 'react';
import styles from './style.css';
import { connect } from 'dva';
function Example({ dispatch, data}) {
    // console.log(data);
    let detail = [];
    if (data.length != 0) {
      detail = data;
    }
  return (
     <div>
        <div>
        {
          detail.length != 0?
          detail.map(item =>(
              <div className={styles.code}>
                  <div className={styles.one}>
                    <img src={item.Img} alt="" />
                  </div>
                  <p>{item.Memo}</p>
                  <p className={styles.pade}>{item.Title}</p>
                  <p className={styles.sade}></p>
                </div>
              )):""}
        </div>
     </div>
  );
};

Example.propTypes = {
};

export default connect(({News}) => ({...News}))(Example);

七丶在 routes文件下 IndexPage.js进行数据渲染

import React from 'react';
import Example from '../components/Example';
import { connect } from 'dva';
import styles from './IndexPage.css';
import Button from 'antd/lib/button';
import 'antd/lib/button/style';
import Carousel from 'antd/lib/carousel';
import 'antd/lib/carousel/style';
import Tabs from 'antd/lib/tabs';
import 'antd/lib/tabs/style';
const TabPane = Tabs.TabPane;

function IndexPage({ dispatch, detail, data}) {
    let T1,T2,T3,T4, I1,I2,I3,I4 = "";
     if (detail.length != 0) {
      T1 = detail[0].Text;
      T2 = detail[1].Text;
      T3 = detail[2].Text;
      T4 = detail[3].Text;
      I1 = detail[0].Id;
      I2 = detail[1].Id;
      I3 = detail[2].Id;
      I4 = detail[3].Id;
    };
// 建议小伙伴不要这样去渲染,最好是把它写成循环的方式去写,因为我的方法是最笨订的方法(数据多了还是循环实用些)
    function callback(key){
        // console.log("--------------s")
        // console.log(key);
        let type = key; 
        let start = 0;
        let limit = 1000;
        dispatch({type: "News/fetchNews",payload:{start,limit,type}});
    };
    return (
      <div className={styles.box}>
          <div className={styles.slickslide}>
             <Carousel autoplay className={styles.slickslide}>
              <div>222</div>
              <div>333</div>
              <div>444</div>
              <div>555</div>
            </Carousel>
          </div>
          <Tabs defaultActiveKey="1" size="small" onChange={callback}>
            <TabPane tab={T1} key={I1}>
              <Example ></Example>
            </TabPane>
            <TabPane tab={T2} key={I2}>
              <Example></Example>
            </TabPane>
            <TabPane tab={T3} key={I3}>
              <Example></Example>
            </TabPane>
            <TabPane tab={T4} key={I4}>
              <Example></Example>
            </TabPane>
          </Tabs>
          
      </div> 
    );
};

IndexPage.propTypes = {
};

export default connect(({News}) => ({...News}))(IndexPage);

总结:

整体看看我的方法和数据渲染方式不是太好,毕竟是目前还在学习状态,所以react学习开发之路还很漫长,所以我觉得在这个前端发展迅速的年代中要不停地去汲取精华,去取糟粕。扩充自己前端主流框架的学习及运用。祝愿前端的小伙伴们在未来有个好的发展方向,

目录
相关文章
|
7月前
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
195 0
|
7月前
|
前端开发 JavaScript 数据安全/隐私保护
详解React antd中setFieldsValu的简便使用
详解React antd中setFieldsValu的简便使用
270 0
|
3月前
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
114 2
react对antd中Select组件二次封装
|
3月前
|
前端开发
React给antd中TreeSelect组件左侧加自定义图标icon
本文介绍了如何在React中为Ant Design的TreeSelect组件的每个树节点添加自定义图标,并解决了因缺少key属性而导致的警告问题,展示了如何通过递归函数处理treeData数据并为每个节点添加图标。
155 2
React给antd中TreeSelect组件左侧加自定义图标icon
|
3月前
|
前端开发
react使用antd中的Checkbox实现多选
在React项目中,通过Ant Design的Checkbox组件实现多选。引入Checkbox,使用Checkbox.Group来管理Checkbox,设置`value`属性绑定选中项数组,通过`onChange`更新数组。维护一个全选状态,根据选中项数量与总数决定全选按钮状态。全选按钮的`onChange`事件用于控制所有Checkbox的选中状态。
146 1
react使用antd中的Checkbox实现多选
|
3月前
|
前端开发
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
本文介绍了在React项目中如何添加路径别名alias以简化模块引入路径,设置组件props的默认值,以及如何二次封装Ant Design的Modal组件。文章还提供了具体的代码示例,包括配置Webpack的alias、设置defaultProps以及封装Modal组件的步骤和方法。
85 1
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
|
3月前
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
56 2
|
3月前
|
前端开发 数据安全/隐私保护
react antd 实现修改密码(原密码,新密码,再次输入新密码,新密码增加正则复杂度校验)
文章介绍了如何在React项目中使用Ant Design实现一个修改密码的组件,包括原密码、新密码和再次输入新密码的表单项,并为新密码增加了正则表达式复杂度校验。
86 0
react antd 实现修改密码(原密码,新密码,再次输入新密码,新密码增加正则复杂度校验)
|
3月前
|
前端开发 计算机视觉
React使用antd实现可编辑单元格
React结合Ant Design实现可编辑单元格的表格组件,通过EditableRow和EditableCell封装实现单元格编辑功能,并提供saveFun回调保存编辑内容。
141 1
|
3月前
|
前端开发
React按需加载antd步骤以及出现的问题
在使用`babel-plugin-import`插件时,可以在项目的根目录创建`.babelrc`文件或在`package.json`中添加babel配置。这两个文件中不应该存在重复的配置。如果出现"Multiple configuration files found"错误,需要选择其中一个文件进行配置,并删除另一个文件中的babel配置。使用该插件后,可以直接从`antd`引入组件,无需手动引入样式文件。
75 1