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

效果:

#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说明: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啥都想搞,学习更多内容。

###下期预告: 详情功能组件完成

转载于:https://juejin.im/post/5c18f70c51882520f2785118

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

  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. 1载波把32个信道按_「防疫」截至8月27日,单日确诊新增32例,张文宏带来1个坏消息...
  2. 如何修改maven默认jdk配置
  3. Flex Basis与Width的区别
  4. 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
  5. linux redis 主从配置,redis集群(主从配置)
  6. 多线程启动定时器 会等待上一次执行完成?_Java多线程
  7. 多媒体技术开发迎来新常态
  8. 集成mysql+tomcat+apache+Eclipse的绿色版开发环境
  9. 拒绝:请求的对资源的访问被拒绝:泊坞窗
  10. ES6 数组高频使用方法
  11. 一个不到300行的C语言打飞机游戏
  12. 学会2种方法,小白也能快速产出标准的Axure原型
  13. IE恶意修改防护大法(转)
  14. cad计算机画图标准,CAD高级绘图员鉴定标准
  15. linux 查看内网IP和外网IP
  16. win10电脑插耳机没反应(win10插上耳机还外放)
  17. 能给客户带来什么价值_您给公司带来什么价值?
  18. HHUOJ 1887 班级聚会上的游戏
  19. 如何制作视频画面水平镜像播放特效
  20. 最近大火的chatGPT是什么?它是怎样聊天的?

热门文章

  1. Spark Runtime概述
  2. CPU acceleration status:HAXM must be updated(version 1.1.16.0.1)
  3. 关于《啊哈!算法》相关资源
  4. WinForm中窗体重画成圆角矩形
  5. 【Flutter】微信项目实战【02】我的界面搭建(上)
  6. DELPHI 获取本月 的第一天 和 最后一天
  7. Emgu-WPF学习使用-Rectangle识别
  8. Linux命令:修改文件权限命令chmod、chgrp、chown详解
  9. JAVA 常见的类集之CollectionListQueue
  10. 会员充值-》解决方案之一