Byemess-基于React&redux的在線Todo應用

Byemess-基于React&redux的在線Todo應用

為什么又是Todo蝙昙,全世界的初學者都在做todo嗎疗琉?可能很多人要問這句話车遂,其實這句話可以等同于:

  • 為什么你做了個云音樂播放器?
  • 為什么你做了個新聞閱讀APP?
  • 為什么你做了個VUE/REACT版本的CNODE颗胡?

究其本質,這幾個應用都是data-map模式吩坝,哈哈哈哈這是我自己創(chuàng)的詞毒姨,意思就是說,本質都是拿到一組數據钉寝,然后就像遍歷數組一樣將這些數據遍歷渲染手素,這類project都可以算是pure-data-driven的。

至于我為什么做了Todo瘩蚪,答案很簡單,我初學react&redux時接觸的例子就是Todo稿黍,將這個app進行功能拓展疹瘦,將會使用到react和redux的各種特性。

這個App的UI直接參考了知乎@黃玄的Vue寫的TodoApp巡球,已經獲得他本人的許可言沐。設計活兒太磨人,本著熟練react&redux的項目實戰(zhàn)的目的酣栈,UI和交互就沒有想花太多時間去設計险胰,直接照著樣子寫了一個,他的代碼我可一個字都沒看過矿筝,別噴我山寨哈哈哈起便。

源代碼

Github
如果對你有有所啟發(fā)或者幫助,送我一個star吧 :)

已部署版本(2017.05.04更新

heroku國內太卡了窖维,還是直接用了Leancloud榆综。
點這里點這里:Byemess

預覽

Login

Logged

Main

Add Todo

Responsive

Drawer

哈哈哈用drawer來插入一下自我推廣的信息貌似是常用套路?主要的頁面導航使用bottomBar去切換铸史,這樣切換起來更加方便鼻疮。


目錄結構

標準目錄結構,有兩個地方提一下:

  1. styled 用來存儲所有經過styled-components進行裝飾后的組件琳轿,清一色presentational components判沟,所以移入components目錄下是沒有問題的,但考慮到它的feature崭篡,在項目存在潛在規(guī)模擴大可能時挪哄,通過Feature進行分類更好,所以就沒有進行合并琉闪。

  2. 對于components 和 container的分類市面上真是五花八門中燥,對我而言,我更傾向跟隨redux作者(真是帥疤临恕)的定義: It's up to whether the component is aware of Redux疗涉,通俗點說拿霉,不需要connect至store的組件都不是container. 這樣的確make sense, 不過在組件的分配上會顯得有點奇怪咱扣,這就比較考功力和經驗了绽淘。

Function

  • Single Page App
  • 在線注冊賬號,數據存儲于leanCloud闹伪。
  • todoItem增刪改沪铭,數據同步到云
  • 根據完成情況切換視圖
  • 添加日期標簽,所有item按日期分組

TechStack

  • React: 全套ES6及以上語法偏瓤,生命周期函數杀怠,ref操作,動態(tài)渲染厅克,應有盡有赔退。
  • Redux: 采用最佳實踐,針對不同的邏輯state管理進行拆分证舟,然后combine之. 采用Thunk處理Action硕旗,控制異步操作。
  • React-Routerv4:跟以前的版本有顯著變化女责,構建單頁APP利器漆枚。
  • Styled-Components: 強推,什么BEM抵知,什么CSS-Module墙基,通通靠邊,結合Helper: Styled-props刷喜,徹底解決css組件化方案碘橘。告別預處理器,避免創(chuàng)造更多學習成本吱肌。
  • Webpack: 自動化構建痘拆,采用chunkhash方式分類打包文件,優(yōu)化用戶緩存策略氮墨。
  • CSS3: 結合CSSTransitionGroup纺蛆,創(chuàng)建組件過場動畫,優(yōu)化體驗规揪。
  • underscore: 用它還是用lodash都行桥氏,我只是需要用一下里面的debounce,用來控制edit todoItem時API通信的頻率猛铅。其實自己手寫一個helper也行字支,在學習redux的練手項目里我就手寫= = 。

后續(xù)可能優(yōu)化使用的:

  • reselect: 再也不用手寫那么多重復的state selector了!
  • immutable: 感受函數式的威力堕伪。
  • redux saga: 2017年了揖庄,還不使用generator的異步action控制體系。

Problem

  1. state的設計主要針對數據的獲取與查找策略欠雌,模擬數據庫的方式蹄梢,建立LookupTable,存儲目標id富俄,遍歷id進行數據拉取禁炒。這樣的方式好處是在分狀態(tài)顯示todoItems時只需要操作id,而不需要操作數據實體霍比,提高性能幕袱。 但是同時也遇到一個問題: 針對查找策略對應確定的api層構造相對耦合,數據拉取方式無法本地模仿悠瞬,因此讓我放棄了使用LocalStorage的進行離線狀態(tài)的支持们豌。 黃玄的策略是優(yōu)先進行本地操作,用戶可以選擇上傳或者下載數據阁危,這個方式不錯,對我有所啟發(fā)汰瘫。 過度對數據模型進行裝飾的結果便是高耦合狂打,這跟我初衷是基于在線存儲數據有關。 算是一個教訓混弥。

  2. 之前想要給登錄成功頁面添加延時跳轉的功能趴乡,以便使用戶體驗更加完整,但是嘗試未果蝗拿,原因是login頁面和list頁面本質上是兩個route下的組件晾捏,進行切換時會進行拉取數據 => Re-render,一旦我登錄后再次進入login頁面哀托,無論我在login組件里如何嘗試記錄上一次的狀態(tài)進行比對(componentWillReceiveProps)惦辛,都是徒勞。 后來想到根目錄下App組件可以進行connect保存一個登錄的flag仓手,以此來確保第一次從未登錄狀態(tài)進入登錄狀態(tài)時時才會進行跳轉胖齐。但是我沒有這樣做,我實在不想污染APP這個root組件嗽冒,除非再包一層...

  3. 跳轉部分React-router并沒有提供更多API呀伙,其Redirect的時間上的可操控性不高,只能依賴注入BrowserHistory屬性來進行人工push地址添坊,略為丑陋剿另。鄙人才疏學淺,相信不久后能找到更優(yōu)雅的方式。

總結

我的不足

  • 耗費時長:從學習React&Redux開始雨女,花費了相對較多的時間在學習相關的綜合知識(組件設計谚攒,結構設計,reducer戚篙,action的結構最佳實踐等等)五鲫,使得我的項目遲遲未能開工,個人可能更習慣有所深度的學習后再進行實踐岔擂,也是貪了想少走彎路的念頭位喂。然后習慣性被炫酷的技術吸引,研究了兩天react-motion(膜拜@chengmo大神啊乱灵,咱們中國小伙有智慧)塑崖,因為當時想要實現drag Sortable List的效果,后來回過神來痛倚,先做出基本再說规婆!這個APP從做出原型到重構修改總工時粗略計算大概不到8天期間穿插各種亂七八糟的探索,如果擼起袖子直接干蝉稳,應該可以壓縮到6天抒蚜。當然了學習成本不可忽略,我給自己的時長計算時從0了解到輸出成品耘戚。

  • App效果: 給自己打7分嗡髓,可優(yōu)化拓展的東西太多。還記得我說的data-map模型嗎收津?我完全可以把這個App打造成一個工作臺饿这,把之前那些滿地飛的項目都囊括進來,可以加大練習技術的力度撞秋,這樣我就可以終結滿知乎鬧的什么“為何vue的demo比react多”之類的無聊話題长捧,純屬Vue好上手!文檔親切直白如私教吻贿!各大中文網示例重構demo多到不行好嗎串结!光是react這英文環(huán)境就夠國內60%程序猿吃一壺了。(扯遠了哈哈哈)

夸夸自己

  • 及時總結: 學習的時候容易懵逼容易記憶斷片怎么辦>肆小奉芦?這一度讓我很苦惱,為了加速學習進程剧蹂,唯有: 總結声功!梳理!寫博客宠叼!于是誕生了這倆貨:(新手朋友們看一看對概念原理理解一定會有幫助)

  • 自學上手效率: 曾經一度不是很自信先巴,當然了都是老大徒傷悲云云其爵,對自己的真實實力還是有一定自信,我相信我能夠短時間接受并運用甚至拓展所學知識伸蚯,我也的確做到了摩渺。由于一開始便對react有迷之好感(這輩子第一次對一個技術生態(tài)有這種感覺),加上自己英語無壓力剂邮,閱讀了許多關于react技術棧的文章摇幻,了解了刀耕火種到現在一片大繁榮的react體系下的技術變遷,對知識體系有了一個宏觀的把控挥萌,這個階段大概一周绰姻,期間還看著網上的教程寫了幾個小demo用來針對訓練一些技術點:比如父子雙向通信生命周期函數使用場景引瀑,異步action處理方案狂芋,模擬redux內部核心功能github(1)github(2)憨栽。 我個人的思維很發(fā)散帜矾,容易噼里啪啦想到很遠很歪,導致了以前學習過程中缺乏統一的節(jié)奏屑柔,一下搗鼓一下動畫隊列屡萤,一下看看源碼,沒有很持久的去做一件事掸宛,這次算是圓滿啦死陆。不過這次能上手這么快,也得益于以前javascript的基礎旁涤,細節(jié)不保證全部能回憶翔曲,但是思想和經驗都沉淀進了自己的腦子迫像,接下來要去找工作劈愚,還得把基礎好好過一遍,重中之重闻妓!

  • 解決實際問題的能力: 現在自己解決問題的感覺越來越好菌羽,可以快速定位問題的癥結,擅用搜索引擎(我真的好久好久沒有用過baidu了...)由缆,specific的問題會一股腦先用文字輸出的形式描述一遍注祖,這樣讓問題的結構在腦中有個印象,然后過一會兒回來自己就萌發(fā)idea均唉,然后嘗試 -> 解決是晨。 最后一句: 靠自己。

最后的最后舔箭,求star罩缴,求支持蚊逢,本人小碩應屆,求推薦深圳的工作 :)


Blog
Github

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末箫章,一起剝皮案震驚了整個濱河市烙荷,隨后出現的幾起案子,更是在濱河造成了極大的恐慌檬寂,老刑警劉巖终抽,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異桶至,居然都是意外死亡昼伴,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門塞茅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亩码,“玉大人,你說我怎么就攤上這事野瘦∶韫担” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵鞭光,是天一觀的道長吏廉。 經常有香客問我,道長惰许,這世上最難降的妖魔是什么席覆? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮汹买,結果婚禮上佩伤,老公的妹妹穿的比我還像新娘。我一直安慰自己晦毙,他們只是感情好生巡,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著见妒,像睡著了一般孤荣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上须揣,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天盐股,我揣著相機與錄音,去河邊找鬼耻卡。 笑死疯汁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的卵酪。 我是一名探鬼主播幌蚊,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼秸谢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霹肝?” 一聲冷哼從身側響起估蹄,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沫换,沒想到半個月后臭蚁,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讯赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年垮兑,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱挎。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡系枪,死狀恐怖,靈堂內的尸體忽然破棺而出磕谅,到底是詐尸還是另有隱情私爷,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布膊夹,位于F島的核電站衬浑,受9級特大地震影響,放射性物質發(fā)生泄漏放刨。R本人自食惡果不足惜工秩,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进统。 院中可真熱鬧助币,春花似錦、人聲如沸螟碎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抚芦。三九已至倍谜,卻和暖如春迈螟,著一層夾襖步出監(jiān)牢的瞬間叉抡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工答毫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褥民,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓洗搂,卻偏偏與公主長得像消返,于是被迫代替她去往敵國和親载弄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容