博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Dva.js的Blog SPA实践
阅读量:7110 次
发布时间:2019-06-28

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

项目地址

项目预览

图片描述

图片描述
图片描述

登录流

图片描述

models/app负责全局的登录状态管理。

在路由控制中,使用react-routeronEnter钩子保证在进入需要授权的页面中登录状态是保持的。

function requireAuth(nextState, replace, callback) {    app._store.dispatch({        type: 'app/enterAuth',        payload: {},        onComplete: callback // enter the component    });}function* enterAuth({payload, onComplete}, {put, take}) {    yield [put({type: 'checkToken'}), put({type: 'queryUser'})];    yield [take('app/hasToken'), take('app/queryUserSuccess')]; // promise the logged state    onComplete();}

总体思想

所有的组件都尽量是stateless, 所有的状态connect组件一般都是路由组件。所有的分发dispatch都交给了路由组件来完成。

这样我可以保证我可以复用一些Dumb组件,比如PostsListBody这个组件,既可以在文章列表页面使用,也可以在用户页面查看自己的文章列表使用。

数据的获取

有两种方式。

一种是dva.js官方推荐的, 使用在models/posts

"订阅"数据源。这封装了增强的history

这样可以监听路由的变化,比如说下面在进入/posts时,会发起一个获取文章列表的action.

app.model({    subscriptions: {        setup: function ({history, dispatch}) {            history.listen(location => {                if (pathToRegExp('/posts').exec(location.pathname)) {                    dispatch({                        type: 'fetchPostsList',                        payload: {pageInfo: {limit: 5, page: 1}}                    });                }            });        }    }});

还有一种是进入一些页面时,要保证一些数据已经在state中了。这时我还是使用了react-routeronEnter钩子。

比如说在进入文章详细页面时,需要知道文章的基本元信息,标题作者等等。等到元信息加载完,再进入页面。

语法层面上上,多亏了有saga的各种effects创建器。可以很爽地写出各种异步代码

function requirePostPrepared(nextState, replace, callback) {    app._store.dispatch({        type: 'post_detail/initializePostDetail',        payload: {post_id: nextState.params.post_id},        onComplete: callback    });}function* initializePostDetail({payload, onComplete}, {put, call}) {    yield put({type: 'clear'});    const {post_id} = payload;    const {data} = yield call(fetchPostInfo, {post_id});    if (data) {        yield put({            type: 'saveInitialPostDetailInfo',            payload: {postInfo: data}        });        onComplete(); // enter the component                // then fetch the data        yield [            put({type: 'fetchPostContent'}),            put({type: 'fetchPostComments'})        ];    }}

文章列表

使用normalizr将获取到的文章数组扁平化,方便后续修改visible可见状态等。

原理如图:

图片描述

这样在获取数据源展示数据时,即可使用一条语句

const dataSource = postsList.map(post_id => postsById[post_id]).filter(post => post);

转载地址:http://dqvhl.baihongyu.com/

你可能感兴趣的文章
Runtime Method Swizzling开发实例汇总
查看>>
4.22 磁盘限额
查看>>
录音文件转文字,有了这个工具,再也不用担心记不上笔记了
查看>>
ubuntu下helloworld
查看>>
什么是区块链
查看>>
MyEclipse 2014 加速启动设置
查看>>
UI设计师都关注的字体设计技巧
查看>>
Gdtool为您解答微信公众号手机无法直接下载APK文件是怎么回事
查看>>
apache下mod_jk模块学习随笔
查看>>
Android学习--03-活动
查看>>
VMware-workstation-full-9.0.0-812388附注册机
查看>>
重新安装.net framework 4.5
查看>>
常用开发资源收集
查看>>
年近30,朋友聚会都聊什么?
查看>>
发布jar包至maven本地库及私服
查看>>
Xshell 创建RSA登录Linux 主机
查看>>
非常酷的国外网站导航设计案例欣赏
查看>>
ASP.NET身份验证的探讨
查看>>
Java反射与注解
查看>>
判断一个数是否为回文数,字符串是否为回文字符串
查看>>