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等属性用法详解:标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容 ...
随机推荐
- Navi.Soft31.任务管理器(定时同步+数据采集)
1系统简介 1.1功能简述 在众多的软件分类中,有几类的软件不是很重要,但也很重要.它们有的是每隔一段时间需要执行一些任务的软件,我们叫它定时类软件:还有一种软件是采集网页中的数据,我们叫它采集类软件 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- java10 - 泛型与枚举
java10泛型与枚举 泛型和枚举都是JDK1.5版本之后加入的新特性,泛型将程序代码的类型检查提前到了编译期间进行,枚举类型增强了程序代码的健壮性. 1.泛型类 class VariableType ...
- crontab定时任务(centos)
cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...
- 通过Yii来理解MVC
模型:是表现业务数据.规则和逻辑的对象. 可以通过集成yii\base\Model或者它的子类定义模型类. 基类yii\base\Model支持许多实用的特性: A 属性:表现业务数据,可以像普通类属 ...
- 构造N位格雷码(递归,面向对象)
问题:递归打印出N位格雷码(相邻两个编码只有一位数字不同): 问题化归为:现有前N位的格雷码,如何构造N+1位的格雷码? 解决方法:采用递归构造格雷码集和. 递归出口:n = 1; 此时格雷码{0,1 ...
- uva1347 经典dp
详细的思路书上面有,有一点要强调的是题意容易理解错:必须严格向右或则向左移动,不能到了第3个点又回到第2个点.否则这个状态方程是不成立的,变成了NP难问题 状态方程: dp[i][j]=min(dp[ ...
- nodejs爬虫初试---superagent和cheerio
前言 早就听过爬虫,这几天开始学习nodejs,写了个爬虫 demo ,爬取 博客园首页的文章标题.用户名.阅读数.推荐数和用户头像,现做个小总结. 使用到这几个点: 1.node的核心模块-- 文件 ...
- ios开发之自定义textView
自定义textView,从理论上讲很简单,根据需求自定义,比如我在开发中的需求就是现实一个字数的限制以及根据输入的文字改变提示剩余字数,那么开始我的基本思路就是自定义一个View,而里面包含一个子控件 ...
- SSH2三大框架SQL查询
/** * 查询省份名称 * @author YHD * @return * @see */ @SuppressWarnings("unchecked") @Override pu ...