react+dva+antd接口调用方式

一丶 安装

通过 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配置

五丶创建接口文件products.js

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

// 新闻轮播图显示
export function NewsCarousel(start, limit ){
    const body = JSON.stringify({ start: 0, limit: 1000 });
    return request("menu/query", { 
        method: "POST", body,
        headers: {'Content-Type': 'application/json'}
    });   
}

//新闻列表
export function NewsList(start, limit, type){
    const body = JSON.stringify({ start, limit, type});
    return request("new/query", {
        method: "POST", body, 
        headers: {'Content-Type': 'application/json'}
    }); 
}
  1. 然后在models中创建对应的products.js, 因为services下的products.js 和models下的products.js 两者是react 调入接口和接收接口参数 密不可分的文件。
import * as services from '../services/products';
export default {
    
    namespace: 'products',

    state: {
    newinfo: [],
    newdetail: []
    },

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

    effects: {
        * NewsInfo({ payload},{ call, put }){
            const list = yield call(services.NewsCarousel);
            let menu= [], arr = list.data.data;
            arr.forEach(items => {menu.push({ title: items.Text, id: items.Id }) });
            yield put({ type: "update", payload: { newinfo: menu }});
        },

    * NewsDetail({ payload:{start, limit, type}}, { call, put }){
            const detail = yield call(services.NewsList, start, limit, type);
      yield put({ type: "update", payload: { newdetail: detail.data.data}});
    }
    },

    subscriptions: {
        setup({ dispatch, history }) {
            return history.listen(({ pathname, query }) => {
            if(pathname === "/"){
                             dispatch({ type: 'NewsInfo'});
               dispatch({ type: 'NewsDetail', payload:{
                                start: 0, 
                                limit: 1000, 
                                type: "7ad2c8db-ff04-4736-81c9-1b7c6fb276b3"
                            }});
            }
          })
        },
      },
};

六丶在components文件下ListPage文件夹下

NewsCarousel.js

import React from 'react';
import { connect } from 'dva';
import styles from './styles.less';
import { Carousel } from 'antd-mobile';

const NewsCarousel = ({ dispatch, newdetail, ...rest }) =>{
    return(
        <Carousel
            autoplay={false}
            infinite
            selectedIndex={0}
            swipeSpeed={35}>
            {newdetail && newdetail.length!== 0?
                newdetail.map(val =>(
                    <a 
                        key={val.Id} 
                        href={val.Link} 
                        className={styles.banner}>
                        <img 
                        style={{ 
                            width: '100%', 
                            height: '180px'
                        }}
                        src={val.Img} 
                        alt=""/>
                        <p className={styles.title}>
                            {val.Title}
                        </p>
                    </a>
                )): ""}
        </Carousel>
    )
} 

export default connect(({ products }) => ({ ...products }))(NewsCarousel);

NewsCrad.js

import React from 'react';
import { connect } from 'dva';
import styles from './styles.less';
import { Tabs, WhiteSpace, Card, WingBlank } from 'antd-mobile';

const DTabBar = Tabs.DefaultTabBar;

const NewsCrad = ({ dispatch, newinfo, newdetail, ...rest }) =>{

    const changeKey = (key) =>{
        dispatch({
           type: 'products/NewsDetail',
           payload:{ type: key.id, start: 0, limit: 1000 }
        })
    }

    const renderContent = (tab, i) => {
        return(
            <div>
            {newdetail && newdetail.length!== 0? 
                newdetail.map((val, i) =>
                <WingBlank size="sm" key={i}>
                    <WhiteSpace/>
                    <a href={val.Link}>
                        <Card>
                            <Card.Body>
                                    <img src={val.Img} className={styles.cover} alt=""/>
                                    <div className={styles.adde}>{val.Title}</div>
                                    <p className={styles.pade}>{val.Memo}</p>
                            </Card.Body>
                        </Card>
                    </a>
                </WingBlank>
             ): ""}
            </div>
        )
    }
 
    return(
        <Tabs 
            tabs={newinfo} 
            onChange={changeKey}
            renderTabBar={props => <DTabBar { ...props } />}>
            {renderContent}
        </Tabs>
    )
} 

export default connect(({ products }) => ({ ...products }))(NewsCrad);

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

import React from 'react';
import { NewsCarousel, NewsCrad } from 'components';

export default function ListView(){
  return (
    <div>
        <NewsCarousel/>
        <NewsCrad/>
    </div>
  );
}

码云地址: newspush

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Rekit 2.0 出了好用的新特性!文章翻译来自:http://rekit.js.org/著作权归作者所有。商业...
    moofyu阅读 9,070评论 1 16
  • 在新公司实习,面试的java开发,结果让先搞一波react(群里有个ios开发让写js的,已经懵逼的无以复加了,哈...
    Sharember阅读 3,455评论 6 14
  • 雨帘在风中变成了一条条倾斜的平行线,一个没有雨具的女人,右手拿着个包顶在头上,左手前后摆动配合双腿快速的奔跑…… ...
    空格儿阅读 327评论 3 2
  • 抱着略微害怕和丝丝新奇开始的旅程,转眼也平平淡淡的结束了。感觉自己不再像以前那样把行程计划得满满当当,而是更倾向于...
    Qin_情阅读 6,419评论 0 1
  • 世间花如雪,寒山似盏茶。 冰落江千里,如灯染铅华。 来去皆不悟,无有亦任由。 独醉数花落,人间烟火情。 青梅煮绿酒...
    手握瓷杯阅读 183评论 0 12