今天来学习第二节课程,完成列表数据的展示

效果:

1. 新建ListData组件

import React , { Component }from 'react';
import { List, Avatar, Icon, Spin } from 'antd';
import PropTypes from 'prop-types';
import { connect } from 'dva';class ListData extends Component{render() {const IconText = ({ type, text }) => (<span><Icon type={type} style={{ marginRight: 8 }} />{text}</span>
);
console.log(this.props)return (<Spin spinning={this.props.loading.global} size='large'tip="数据正在加载中"><ListitemLayout="vertical"size="large"pagination={{onChange: (page) => {console.log(page);this.props.dispatch({ type: 'listdata/query', payload: { page:page,pageSize:this.props.pageSize,type:'all'} })},pageSize: this.props.pageSize,total:500}}dataSource={this.props.pageData}renderItem={item => (<List.Itemkey={item.title}actions={[<IconText type="star-o" text={item.visit_count} />, <IconText type="like-o" text={item.visit_count} />, <IconText type="message" text={item.reply_count} />]}><List.Item.Metaavatar={<Avatar src={item.author.avatar_url} />}title={<a>{item.author.loginname}</a>}description={item.create_at}/>{item.title}</List.Item>)}/></Spin>);}componentWillMount () {const { dispatch, type, pageSize,page} = this.propsdispatch({ type: 'listdata/query', payload: { page,pageSize,type} })}
};ListData.propTypes = {type: PropTypes.string.isRequired,pageSize: PropTypes.number.isRequired,
};function mapStateToProps(state) {const {pageSize,type,page,pageData} = state.listdata;return {pageSize,type,page,pageData,loading:state.loading};
}// export default ListData;
export default connect(mapStateToProps)(ListData);

用到了antd中的List, Avatar, Icon, Spin 四个ui组件。

  • List 列表
  • Avatar 头像
  • Icon 图标
  • Spin 数据加载
  • pagination 分页

componentWillMount 周期中获取列表数据,mapStateToProps 将model中的state数据和组件的props绑定,利用connect将两者连接。这样只要state中的数据发生变化,props就会发生变化,view视图就会重新渲染。

2. 创建组件的model listdata.js

import * as listService from '../services/list';
export default {namespace: 'listdata',state:{pageSize:20,page:1,pageData: [],type: 'all'},effects: {*query({ payload: { page,pageSize,type } }, { call, put }) {const result = yield call(listService.query, { page,pageSize,type })yield put({type: 'updateData',payload: {result,page,pageSize,type}})}},reducers: {'updateData'(state, { payload: data }) {let r = data.result.data.datalet {pageSize,page,type} = datareturn {...state,pageSize,page,pageData:r,type}}},subscriptions : {setup({ dispatch, history }) {
//       return history.listen(({ pathname, query }) => {
//         if (pathname === '/') {
//           dispatch({ type: 'query', payload: { page:1,pageSize:10,type:'all' } });
//         }
//       });}
},
}; 

注意申明了listdata的命名空间,在组件中绑定时要注明

3. 创建组件的service list.js

这里面主要写获取数据的方法,就是请求api。有点像java里的dao层,route像java里的controller层

import request from '../utils/request';export function query({ page,pageSize,type }) {return request(`/api/v1/topics?page=${page}&limit=${pageSize}&tab=${type}`);
}

service会在model中的effects 中调用,effects中处理异步请求,之后action去reducers中更新state。

4. 开启代理

我们在本地访问cnode的api接口会有跨域,所以要进行代理。修改.webpackrc:

{"extraBabelPlugins": [["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]],"proxy": {"/api": {"target": "https://cnodejs.org/","changeOrigin": true,"pathRewrite": { "^/api": "/api" }}}
}

cnode api说明:https://cnodejs.org/api

5. 在首页使用组件

import React from 'react';
import { connect } from 'dva';
import MyHeader from '../components/MyHeader';
import ListData from '../components/ListData';function IndexPage() {return (<div><MyHeader keys={['index']}/><div style={{paddingTop:20,paddingLeft:100,paddingRight:100,paddingBottom:50}}><ListData type='all' pageSize='10'/></div></div>);
}IndexPage.propTypes = {
};export default connect()(IndexPage);

好了现在你就可以看到效果了。
没解决的坑:
分页组件的使用,因为他是按总的数据记录以及每页数据量来自动分页的,而cnode的api是按页码和每页数据量来直接返回数据,所以没法知道total。因此我默认写了total=“500”.
欢迎关注我的公众号mike啥都想搞,学习更多内容。

下期预告:

详情功能组件完成

dva开发一个cnode网站(2) 1相关推荐

  1. 从零开始开发一个大型网站

    从零开始开发一个大型网站 更新:前端代码已全部由TypeScript进行重写 这是本人第一个从零开始开发一个大型网站(前后端+部署代码),是一个内容分享社区,详细信息见github.目前还是开发中后期 ...

  2. flask学习:开发一个微电影网站一:项目介绍

    最近在学习flask,完成了入门学习,现在想找一个项目进行实战学习,看看系统的开发是怎么样的,然后看到了慕课网上有一个视频,使用flask开发一个微电影网站,因此决定花时间学习一下. 一:首先介绍一下 ...

  3. 如何使用MyEclipse开发一个JavaWeb网站

    如何使用MyEclipse开发一个JavaWeb网站 本文所述的内容仅用于参考或学习,主要针对毕业设计等网站设计,请勿实际用于生产开发用途,否则后果自负: 如何使用MyEclipse开发一个JavaW ...

  4. 【教你如何开发一个OnlineJudge网站】第一章 如何实现OnlineJudge判题

    [教你如何开发一个OnlineJudge网站]系列文章目录 第一章 如何实现OnlineJudge判题 第二章 实现OnlineJudge的后端 第三章 实现OnlineJudge的前端 文章目录 [ ...

  5. 模块化开发一个电子商务网站

    通过查看网上的教学视频,跟着做下来这样一个电子商务网站整站开发的项目.整个页面写下来还是很耗时的,页面的细节太多,得仔仔细细核对原设计图,1px也要在那里死抠,不能放过,不然怕影响整体布局.关于浏览器 ...

  6. 基于Appian低代码平台开发一个SpaceX网站

    文章目录 Appian 背景摘要 Appian Designer SpaceX网站开发 新建Application 配置应用权限 创建Record Type Appian 背景摘要 国内几乎没有App ...

  7. 用python开发一个影视网站_搜片大师,一个不需要编程就能拥有百万影视站点的搜片神器,Python编写,Windows版界面 - 卖知了的......

    这个世界太疯狂了,来北京好几个月了,都还没找到工作.俗话说,一天不编程,连hello world都写不出来.在这个"焦虑"的最后一个月,差不多每天吃馒头加山泉水,差点流落街头.可以 ...

  8. 用python开发一个影视网站_GitHub - lyzhanghai/movie_project: 一个使用Python+Flask开发的微电影网站...

    微电影网站搭建手册 简介 这是一个使用Python语言和Flask框架搭建的微电影网站.网站分前台和后台,前台面向用户,主要功能有注册会员.搜索电影.观看电影.收藏及评论电影:后台面向网站管理人员,主 ...

  9. 老弟,来了?VUE+Nuxt.js+Koa+Vuex入门教程(一)仿写一个cnode网站

    if(有工作){if(工作地址 == "深圳" || 工作地址 == "广州" ){do(请联系作者,qq:1172081598)} } 何为Nuxt.js N ...

  10. 开发一个简单网站--第三章:相知

    第三章:相知 <12>.搜索用户search.php <13>.搜索用户后台getsearchdata.php <14>.搜索论坛(投票)fourum.php &l ...

最新文章

  1. ecm工作原理 usb_(转)USB中CDC-ECM的了解和配置
  2. 通过打印学习Linux内核之sysfs(0)
  3. Vue 兼容 ie9 的全面解决方案
  4. SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
  5. load average
  6. 探索7.x, 全面解析Activity启动框架 (1)
  7. 数据库三大范式(1NF,2NF,3NF)及ER图
  8. JAVA.IO字节流
  9. java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
  10. FLASK上传时有中文文件名的解决方案
  11. 万圣节头像小程序源码
  12. 简述关系型数据库和非关系型数据库
  13. oracle concat和,concat和||之間是否存在性能差異?在oracle
  14. 面试问题记录1:IP子网规划
  15. 「leetcode」860.柠檬水找零【贪心算法】详细!
  16. 【毕业设计】基于单片机的超声波雷达系统
  17. [深度学习] ImageAI库使用笔记
  18. VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (3) High Band Encode 模块
  19. 无线路由器打印机服务器设置,路由器 打印机服务器设置方法
  20. pageHelper.startPage(m,n)的用法

热门文章

  1. 如何编写高质量的程序
  2. movingpandas时空数据分析——旧金山出租车轨迹数据集处理
  3. 怎么删除fiddler注册表_Fiddler|Fiddler安装与配置
  4. MySQL 数据库性能优化
  5. 彻底解决Android GPS没法定位这一顽固问题
  6. 佳能G3800黄灯绿灯交替闪烁7次,错误代码5B00
  7. Python简明教程--String
  8. 常见的一些SQL注入漏洞类型
  9. MFC学习笔记(一)MFC基本知识介绍、建立MFC应用程序
  10. 阿里云keepalived的虚拟ip怎么让外网访问_Keepalived双机热备