博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dva开发一个cnode网站(3)
阅读量:7023 次
发布时间:2019-06-28

本文共 4151 字,大约阅读时间需要 13 分钟。

完成详情页渲染,用到了react-markdown来渲染 先看效果:

1 在components下新建Detail.js

import React , { Component }from 'react';import { Card, Avatar, Spin, Icon,Comment, Tooltip, List} from 'antd';import PropTypes from 'prop-types';import { connect } from 'dva';import  ReactMarkdown from 'react-markdown';import './my.css';class Detail extends Component{    render() {       const { Meta } = Card;      return (        
{typeof(this.props.data.author)=='object' ? (
   
{this.props.data.title} } extra={
发布于{this.props.data.create_at} *作者{this.props.data.author.loginname}* {this.props.data.visit_count}次浏览 *来自 分享
} >
(
} datetime={item.create_at} /> )} />
) : ''}
) } componentWillMount () { const { par } = this.props this.props.dispatch({ type: 'detail/find', payload: { id:par} }) }}Detail.propTypes = { id: PropTypes.string.isRequired,};function mapStateToProps(state) { const {id,data} = state.detail; return { id, data, loading:state.loading };}// export default ListData;export default connect(mapStateToProps)(Detail);复制代码

用到了antd中的一些组件,可以自己去官网参考下怎么用。 my.css里面定义了一些样式,主要解决markdown渲染后里面的图片太宽,重新设置宽度。

a{    text-decoration:none;    color:#333;}img{  max-width: 1300px;}复制代码

2 在models下创建对应的model detail.js

import * as listService from '../services/list';export default {  namespace: 'detail',  state:{      id:'',      data:{}  },    effects: {        *find({ payload: { id } }, { call, put }) {            const result = yield call(listService.find, { id })                yield put({                type: 'updateData',                payload: {                    result,                    id                }            })        }    },  reducers: {    'updateData'(state, { payload: data }) {            let r = data.result.data            const {id} = data        return {...state,id,data:r}    }  },    subscriptions : {        setup({ dispatch, history }) {    }},};复制代码

3 在service中添加获取详情的api list.js

import request from '../utils/request';export function query({ page,pageSize,type }) {  return request(`/api/v1/topics?page=${page}&limit=${pageSize}&tab=${type}`);}export function find({ id }) {  return request(`/v1/topic/${id}?mdrender=false`);}复制代码

mdrender参数设置为false来获取markdown数据,truehtml数据

4 创建详情页routes/DetailPage.js

import React from 'react';import { connect } from 'dva';import Header from '../components/Header';import Detail from '../components/Detail';function DetailPage(props) { const {params} = props.match  return (    
);}DetailPage.propTypes = {};export default connect()(DetailPage);复制代码

使用了自己定义的HeaderDetail组件。在router.js中邦定路由到页面:

import React from 'react';import { Router, Route, Switch } from 'dva/router';import IndexPage from './routes/IndexPage';import DetailPage from './routes/DetailPage';function RouterConfig({ history }) {  return (    
);}export default RouterConfig;复制代码

使用了参数路由,在DetailPage.js中,从props.match.params中就可以取到id值传给Detail组件

5 别忘了在index.js中注册model以及插件

import dva from 'dva';import './index.css';import createLoading from 'dva-loading';// 1. Initializeconst app = dva();// 2. Plugins app.use(createLoading());// 3. Modelapp.model(require('./models/listdata').default);app.model(require('./models/detail').default);// 4. Routerapp.router(require('./router').default);// 5. Startapp.start('#root');复制代码

前面两节课忘说dva-loading了,需要在这里使用,才能在组件中获取loading属性

6 在ListData组件中加入路由跳转详情页

import {Link} from 'dva/router';
{item.title}复制代码

使用了Link来做跳转,顺带把我们的Header组件的跳转也给改了

首页
新手入门
API
关于
注册
登陆
复制代码

大功告成看看效果

欢迎关注我的公众号mike啥都想搞,学习更多内容。

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

你可能感兴趣的文章
LeetCode - 617. Merge Two Binary Trees
查看>>
splay 1296 营业额统计
查看>>
C#利用System.Net发送邮件(带 抄送、密送、附件、html格式的邮件)
查看>>
.net平台下C#socket通信(中)
查看>>
js实现事件委托
查看>>
大数据开发实战:Stream SQL实时开发三
查看>>
利用POPAnimatableProperty属性来实现动画倒计时
查看>>
hdu Inverting Cups
查看>>
【python】处理xml文件——dom
查看>>
MongoDB启动文件配置参数详解
查看>>
【原创】Windows服务管家婆之Service Control Manager
查看>>
【工作随笔】如何组织开发一个产品
查看>>
学习笔记
查看>>
物理地址扩展(PAE)分页机制
查看>>
装饰模式(Decorator)
查看>>
Spring整合JMS(四)——事务管理
查看>>
Thinkphp5.0中input函数用法
查看>>
php表单发送到邮箱V1.0
查看>>
jquery实现可展开收缩的首页大图广告展示方式 泰山压顶代码 V2.0
查看>>
nginx-fastdfs搭建分布式云存储系统
查看>>