react+redux实战(三)----异步交互

上一篇文章:react+redux实战(二)----搭建express并将应用连接到数据库mongodb

中在文末提到了复杂的异步交互流程,那么我本文主要就来实现从前端到后台的交互。

插曲——Mongoose在创建MongoDB的Collection时的命名策略

这个问题我不得不说在最前面,因为作为初学者我们向后端扩展的过程中对数据库的一些细节可能并不会注意到,而mongoose在对collection创建时的命名策略竟然在大多的基础教程中都没有提到,我们业余时间本来就不多,然后一个小小的问题就够我喝一壶的了。。

说重点:
1、定义好schema后,将schema发布为model

var ArticlesModel=mongoose.model("Articles",ArticlesSchema);

这同时是在数据库中创建了一个表叫'article',即在model()方法中的第一个命名的参数,这个是不区分大小写的,不区分大小写

2、另外,如果对于文章详情页还需定义一个表,那就一定不要再取名叫做'article',
这是因为mongoose为我们创建collection的时候,会自动都转化为复数形式,毕竟这个更像是集合。所以我们对模型命名的时候,一定要考虑到单复数形式。即不要妄想建立单复数的同时存在的两个表。

假设BookSchema已经定义,如果我们发布model

var Book=mongoose.model("Book",BookSchema);

查找存入该表的数据可以这样:

db.books.find()
//或者这样
db.model('Book').find()

进入主题——异步交互

场景——点赞/取消赞

上文也提到过,每一条评论我分成了主回复Comment和回复列表ReplyList(越到后面越能感觉到最初整个文档的数据结构设计对组件的拆分和数据的操作影响之大,所以对一个复杂的应用,一定要慎重设计好state树),也就是组件Comment和ReplyList中都分别要有点赞和评论功能,既然功能相同,那么肯定是代码能复用才最好。代码的优化是个渐进的过程,我先实现在一个组件中实现点赞功能,最后再考虑抽成一个函数(成功不易复制,但是失败可以避免,所以我记录下的更多是自己的探索过程)。

点赞的逻辑并不复杂:如果当前尚未点赞(即状态praise:false),则点赞后,点赞数量(praise_count)+1,praise置为true,取消赞类似。

constructor(props){
        super(props);
        this.state={
            praise_count:props.comment.praise_count,
            praise:props.comment.praise
        }
    }
clickHeart(e) {
    const { comment } = this.props;
    let praiseCount = this.state.praise_count,
        isPraise;
    let self = this;
    if (this.state.praise) {
        praiseCount -= 1;
        isPraise = false;
    } else {
        praiseCount += 1;
        isPraise = true;
    }
    //fetch请求后边可以考虑抽离成一个action
    fetch('/post_praise', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                articleId: 1,
                 //articleId其实也是需要从父组件一层层传递下来的,现在为省事儿就没改
                id: comment.id,
                praise_count: praiseCount,
                praise: isPraise
            })
        })
        .then(response => {
            if (response.status == 200) {
                response.json().then(function(json) {
                    self.setState({
                        praise_count: json.praise_count,
                        praise: json.praise
                    })
                })
            }
        })
}

//render中相关代码:
let praiseClass=classNames({
                'iconfont icon-praise':true,
                'active':this.state.praise
            })
<span className={praiseClass} onClick={this.clickHeart.bind(this)}></span>
<span>{this.state.praise_count}</span>

post请求中,客户端请求接口时必须指名请求头类型 Content-Type=application/json,这样当我们post上来的数据为{praise:true}的时候req.body.praise就能取到值,如果没有正确声明请求头,会报undefined.

post 提交数据后,后端更新数据库中对应键值对,然后返回给前端修改后的数据,那么前端怎么更新视图呢?就是利用react提供的setState(),所以我们就需要配合后边的更新将点赞相关的这两个变量praise_count和praise设为了this.state中的变量。

后端的代码又是如何写的呢?

router.post('/post_praise',function(req,res){
    var data=req.body;
    //可以看出数据结构很直观的会影响到数据的查找,这儿的update就稍微复杂了些
    comments.update({'articleId':data.articleId,'comments.id':data.id},
        {'comments.$.praise_count':data.praise_count,
                'comments.$.praise':data.praise},
        function(err,results){
            if (err) {
                console.log('error message',err);
                return;
            }
            //将返回数据作为update()的回调函数
            res.send({
                praise_count:data.praise_count,
                praise:data.praise
            }); 
    })
})
comments的数据结构

另外需要注意一点:express需要依赖 bodyParser 包来解析请求体,在4.0版本之后(我使用的是最新的4.14.0版本)需要独立安装npm install body-parser,然后在启动文件中需要配置

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
//body-parser 解析json格式数据
app.use(bodyParser.json({limit: '1mb'}));
//此项必须在 bodyParser.json 下面,为参数编码
app.use(bodyParser.urlencoded({           
  extended: true
}));

功能的抽离后边慢慢写吧,在这儿我先抛砖引玉。完整大型应用的开源项目,大家也可以推荐下啊,实在感觉网上大多实例应用的工具不少但实现也都较为简单不太能满足日益增长的需求。像复杂应用中如何设计数据结构、更好的整合/规范代码、前后端的配合等等问题都还需要慢慢摸索。

【参考文章】
https://github.com/reactjs/redux/issues/291
express 解析post方式下的json参数
React 源码剖析系列 - 解密 setState

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,510评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,024评论 4 62
  • 麻绳般的心 缠绕打结了几回 入眠岂是易事 挣扎闭着眼张开眼 满满徜徉着你的身躯 未了未了 每个呼吸 动作 表情...
    TJYzzd阅读 249评论 2 1
  • 【转载分享】奇石赋 作者/王素 日精月华,天地造化。黄金有价,奇石无价。盘古鬼斧神工,女娲七彩光华;仙山蹦脱美猴王...
    補缺楼丨胡德棒阅读 1,590评论 0 1