本教程案例github:https://github.com/axel10/dva_demo-Counter-and-list/tree/master

这次主要通过在线获取用户数据并且渲染成列表这个案例来演示dva.js。

整个开发流程概括下来应该是:

编写用户列表model(数据模型)->  编写修改model的方法 -> 编写服务接口 ->  编写组件 ->  将组件与dva.js连接 -> 将dva.js提供的接口(dispatch)和数据模型通过props传入组件 -> 渲染。

我们先从第一步开始。

编写用户列表model及修改方法:(src/models/users.js)

import * as userService from '../services/userService'

export default {
namespace: "users",
state: {
list:[]
},
reducers: { //用来修改数据模型的state。
save(state, {payload:{data}}) { //涉及到es6的拆包写法。
state.list = data;
return {...state}
},
removeItem(state, {item}) {
state.list = state.list.filter(function (lItem) {
return item.id !== lItem.id
});
return{...state}
}
}, effects: { //effects指的是涉及到异步请求的方法。通常用来调用服务获取数据。这里要注意如果effects的方法名与reducers中存在重复的话容易造成死循环。
* fetch(payload,{put, call}) {
const data = yield call(userService.fatchData);
yield put({type: "save", payload: data})
}, * fetchRemoveItem({item},{put,call}){
const result = yield call(userService.fetchRemoveItem,item.id);
if (result){
console.log(true);
yield put({type:"removeItem",item})
}else{
console.log(false);
}
} }, subscriptions: { //触发器。setup表示初始化即调用。其他用法见官方文档。https://github.com/sorrycc/blog/issues/62
setup({dispatch}) {
dispatch({type: 'fetch'})
}
} }

编写完毕后不要忘了在src/index.js中注册数据模型:

app.model(require('./models/users').default);

编写服务接口:(src/services/userService.js)

import request from "../utils/request";

export function fatchData() {
return request("/api/users")
} export function fetchRemoveItem(query) {
console.log(query);
return true
}

这里涉及到mock数据。方法为修改根目录下的.webpackrc文件:

{
"proxy": {
"/api": {
"target": "http://jsonplaceholder.typicode.com/",
"changeOrigin": true,
"pathRewrite": {
"^/api": ""
}
}
}
}

接下来编写组件:

先从路由组件开始:

import {connect} from 'dva'
import ListBody from "../components/ListBody"
import React from "react"; class List extends React.Component {
render() {
return (
<ListBody {...this.props} /> //将自身的props传给子组件。连接之后的组件可以拥有dispatch、索引后的数据模型。
)
}
} function mapStateToProps(state) { //将数据模型索引到props。
return {users:state.users}
} export default connect(mapStateToProps)(List) //将组件与数据模型相连接。

这里要重点说明:dispatch就是在connect的时候传入的,用来做组件与数据模型之间的交互。

之后是ListBody组件:

import React from 'react';
import {Link} from 'dva/router' class ListBody extends React.Component{ removeUserItem(item){
this.props.dispatch({type:"users/fetchRemoveItem",item}) //通过props获取dispatch方法,users表示数据模型(namespace),fetchRemoveItem表示reducers或者effects。
} render(){
const that = this;
let userList = [];
let userData = this.props.users.list; //users:数据模型,list:数据模型中的state   if (userData.length>=1){
userData.forEach(function (item, index) {
userList.push(<li key={index} onClick={that.removeUserItem.bind(that,item)}>{item.name}</li>)
})
}return(
<div>
<h2>请尝试点击条目。</h2>
{userList}
</div>
)
}
} export default ListBody;

完毕后添加路由。

import React from 'react';
import { Router, Route, Switch,Redirect } from 'dva/router';
import list from './routes/list' function RouterConfig({ history }) {
return (
<Router history={history}>
<Switch>
<Route path="/list" exact component={list} />
<Redirect to="/list"/>
</Switch>
</Router>
);
} export default RouterConfig;

dva.js 用法详解:列表展示的更多相关文章

  1. Vue.js用法详解(一)更新中~

      前  言 前段时间为了一个数据查询的项目自学了Vue,感觉这款框架还是很不错的,今天就整理整理这个框架如何使用,希望对正在学这个框架的小伙伴有所帮助~ 首先,我们先来了解一下Vue: Vue.js ...

  2. 模板引擎doT.js用法详解

    作为一名前端攻城师,经常会遇到从后台ajax拉取数据再显示在页面的情境,一开始我们都是从后台拉取再用字符串拼接的方式去更达到数据显示在页面! <!-- 显示区域 --> <div i ...

  3. 图片延时加载jquery.inview.js用法详解

    我们在网站上总能见到这样的效果,若是有图片,图片都是先用loading加载一小段时间,然后紧接着出来要显示的图片,即效果如下: v2_loading.gif,几秒钟时间过渡到v2_pic_01_s.j ...

  4. jquery.cookie.js用法详解

    创建一个会话cookie: $.cookie(‘cookieName’,'cookieValue’); 注:当没有指明cookie时间时,所创建的cookie有效期默认到用户浏览器关闭止,故被称为会话 ...

  5. js replace 与replaceall实例用法详解

    这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...

  6. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  7. Python 字符串、列表和元组用法详解

    1.通用函数 len() #列表的元素个数.字符串的长度 2.''' '''与'\ '用法详解 s='''this is a text ''' -->输出s ---> 'this\nis\ ...

  8. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...

  9. js原生之scrollTop、offsetHeight和offsetTop等属性用法详解

    scrollTop.offsetHeight和offsetTop等属性用法详解:标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容 ...

随机推荐

  1. Ehcache入门基础

    1.ehcache的简介  EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 2.ehcache入门实例 1.首先先导入 ...

  2. git命令 高级

    Git 分支 - 分支的删除 git删除本地分支 git branch -D br git删除远程分支 git push origin :br  (origin 后面有空格) clone服务器上的资源 ...

  3. 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库

    第一步:创建模拟数据表. CREATE TABLE `test_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NUL ...

  4. 远程控制你的智能电视,按键|输入|安装App等都已实现,已开源!

    一.序 Hi,大家好,我是承香墨影! 智能电视或者智能盒子,不知道大家了解多少? 这两年各大厂商生产的电视设备,基本上都是搭载的 Android 系统.既然电视本身就是 Android 系统的,我们也 ...

  5. 【前端】Angular2 Ionic2 学习记录

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/angular2_ionic2.html 一.建立项目 ionic start ProductName super ...

  6. 沉淀,再出发——手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群

    手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群 一.准备,再出发 在项目启动之前,让我们看一下前面所做的工作.首先我们掌握了一些Linux的基本命令和重要的文件,其次我们学会 ...

  7. caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization

    一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...

  8. java常用字节流

    常用的字节流有FileInputStream和FileOutputStream.BufferedInputStream和BufferedOutputStream.DataInputStream和Dat ...

  9. linux命令之 ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  10. 通过grub-install命令把grub安装到u盘-总结

    通过grub-install命令把grub安装到u盘 ①准备一个u盘,容量不限,能有1MB都足够了. ②把u盘格式化(我把u盘格式化成FAT.fat32格式了,最后证明也是成功的).③开启linux系 ...