dva.js 用法详解:列表展示
本教程案例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 用法详解:列表展示的更多相关文章
- Vue.js用法详解(一)更新中~
前 言 前段时间为了一个数据查询的项目自学了Vue,感觉这款框架还是很不错的,今天就整理整理这个框架如何使用,希望对正在学这个框架的小伙伴有所帮助~ 首先,我们先来了解一下Vue: Vue.js ...
- 模板引擎doT.js用法详解
作为一名前端攻城师,经常会遇到从后台ajax拉取数据再显示在页面的情境,一开始我们都是从后台拉取再用字符串拼接的方式去更达到数据显示在页面! <!-- 显示区域 --> <div i ...
- 图片延时加载jquery.inview.js用法详解
我们在网站上总能见到这样的效果,若是有图片,图片都是先用loading加载一小段时间,然后紧接着出来要显示的图片,即效果如下: v2_loading.gif,几秒钟时间过渡到v2_pic_01_s.j ...
- jquery.cookie.js用法详解
创建一个会话cookie: $.cookie(‘cookieName’,'cookieValue’); 注:当没有指明cookie时间时,所创建的cookie有效期默认到用户浏览器关闭止,故被称为会话 ...
- js replace 与replaceall实例用法详解
这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...
- js数组中foEach和map的用法详解 jq中的$.each和$.map
数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...
- Python 字符串、列表和元组用法详解
1.通用函数 len() #列表的元素个数.字符串的长度 2.''' '''与'\ '用法详解 s='''this is a text ''' -->输出s ---> 'this\nis\ ...
- JS逗号运算符的用法详解
逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...
- js原生之scrollTop、offsetHeight和offsetTop等属性用法详解
scrollTop.offsetHeight和offsetTop等属性用法详解:标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容 ...
随机推荐
- haproxy下X-Frame-Options修复方法
X-Frame-Options是网页常见漏洞之一,在其他的frame下加载你网页的内容,达到劫持的目的. 修复方法很简单,在http 请求投中添加X-Frame-Options参数.网上可以查一下Ap ...
- C++ 如何获取三个相同数值中的最大值或最小值?
C++ 如何获取三个相同数值中的最大值或最小值? template<typename T> T Max(T x, T y, T z) { return x > y ? (x > ...
- 记录 serverSocket socket 输入,输出流,关闭顺序,阻塞,PrintWriter的一些问题.
关于socket.getOutputStream() 的一些问题, OutputStream的flush是一个空方法,所以需要另一个实现了Flush的流来包装一下 这里为什么使用PrintWriter ...
- php基本函数的学习(2)
chgrp chgrp — 改变文件所属的组 说明: bool chgrp ( string $filename , mixed $group ) 尝试将文件 filename 所属的组改成 grou ...
- R实战 第三篇:数据处理
在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量.数据处理通常包括增加新的变量.处理缺失值.类型转换.数据排序.数据集的合并和获取子集等. 一,增加新的变量 通常需要 ...
- Windows驱动开发工具 WDK 学习笔记(1)
目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1 ...
- dm642的视频口输出
void VP1_EDMA(int displayMode,unsigned int w,unsigned int h) { unsigned int i=0,k=0; EDMA_Hand ...
- PHP学习笔记--Php预定义超全局变量$_GET
Php中的许多预定义变量都是超全局的,无需使用global声明 超全局变量 不需要声明就可以直接使用 提供超全局变量(数组)为了让程序员更快捷的编程 $GLOBALS— 引用全局作用域中可用的全部变量 ...
- 嵌入式linux------ffmpeg移植 编码H264(am335x编码H264)
[cpp] view plaincopy <pre name="code" class="cpp"><pre name="code& ...
- AM335X的USB otg网卡(RNDIS /Ethernet Gadget)调试
重新编译内核(2.6.29) 2.6.29内核 Device Drivers ---> USB support ---> USB Gadget Support ...