react+redux+generation-modation腳手架搭建一個todolist

  • TodoList
  • 1. 編寫actions.js
  • 2. 分析state
    • 試著拆分成多個reducer
  • 3. 了解store
  • 4. 了解redux數據流生命周期
  • 5. 分析容器組件和展示組件
    • 搞清楚,數據到底是如何流動的?
  • 6. 編寫展示組件的代碼
  • 7. 編寫容器組件
  • 8. 傳入store
  • 9. 總結
  • 10. 參考

TodoList

腳手架Github地址

1. 編寫actions.js

2. 分析state

試著拆分成多個reducer

3. 了解store

  1. store.getState()
  2. store.dispatch(action)
  3. store.subscribe(listener)注冊監聽器
  4. 調用store.subscribe(listener)返回的函數來注銷監聽器

4. 了解redux數據流生命周期

  1. store.dispatch(action);
  2. store調用傳入的reducer。
  3. 根reducer將多個子reducer輸出的state合成一個單一的state樹。
  4. store保存了根reducer返回的state樹。

5. 分析容器組件和展示組件

在這里,我遇到了很多問題。展示組件就沒有什么好說的了,主要是容器組件。

搞清楚,數據到底是如何流動的?

下面舉例:

  1. React組件上有一個點擊事件。
  2. 當點擊之后,點擊事件對應一個dispatch(actionCreator())。
  3. store會將actionCreator()返回的action以及當前的state傳遞給reducer。
  4. reducer收到action,然后根據action.type更新state,并且返回新的state。
  5. store保存新的state。
  6. state更新后,組件調用render()方法。

那么問題來了:

由于展示組件,沒有數據,那么數據該是如何來的?

回答:數據是從存放在state里的,如何將state里的數據,傳遞給展示組件呢?使用connect()函數,它接受兩個參數,兩個參數分別是函數。

function mapStateToProps(state) {return {todos: selectTodos(state.main.todos, state.main.visibilityFilter),visibilityFilter: state.main.visibilityFilter,};
}function mapDispatchToProps(dispatch) {return {onAddClick: text => dispatch(addTodo(text)),onFilterChange: nextFilter => dispatch(setVisibilityFilter(nextFilter)),};
}class Main extends Component { render() { return ( <AddTodo onAddClick={this.props.onAddClick} /> <VisibleTodoList /> <Footer onFilterChange={this.props.onFilterChange} visibilityFilter={this.props.visibilityFilter} /> ); } } Main.propTypes = { onAddClick: PropTypes.func.isRequired, onFilterChange: PropTypes.func.isRequired, visibilityFilter: PropTypes.oneOf([ 'SHOW_ALL', 'SHOW_ACTIVE', 'SHOW_COMPLETED', ]); }; export default connect(mapStateToProps, mapDispatchToProps)(Main);
  • 上面的demo,是將Main作為一個展示組件。
  • mapStateToPropsmapDispatchToProps注入到Main里。
  • 所以在Main組件里,就可以使用注入的方法和屬性了。
  • 值得注意的地方,在Main里使用的props都要進行檢測,也就是下面的Main.propTypes
  • 除了將注入和組件寫在一個js文件里,還可以將它們分開寫。
  • 就比如VisibleTodoList和TodoList分別寫。然后將2個函數注入到TodoList里去。
  • 對了,初始化的state是寫在reducer里的,因為無論如何都會去調reducer。

在做的過程中,我還遇到了一個問題,它在幾個地方三番五次的阻撓我。

// 代碼里,我是這么獲取state的數據的。
state.todos:
state.visibleFilter;// 但是事實上,使用的腳手架里,它對app包了一層路由,它在最外層的reducer里的代碼是這樣的。
import main from 'containers/Main/reducer'; export default function createReducer(asyncReducers) { return combineReducers( main, routing: routerReducer, ...asyncReducers, ); } // 所以我本身拿到的state是包含了main和routing這兩個對象的。因此我要拿我組件里的state的數據,應該下面這樣: state.main.todos; state.visibleFilter;

6. 編寫展示組件的代碼

  1. class類
  2. 每個組件都要對propTypes進行驗證
  3. 要export

7. 編寫容器組件

  1. 定義mapStateToProps()將當前的state映射到組件的props, 讀取state操作。
  2. 定義mapDispatcherToProps(), 分發action操作。
  • 傳入dispatch方法。
  • 返回期望注入到展示組件的props中的回調方法。
  • 回調方法里,可以分發action。
  1. 使用connect()方法。

    export default const VisibleTodoList = connect(mapStateToProps,mapDispatcherToProps, )(TodoList); // TodoList為要被注入的展示組件

8. 傳入store

使用React Redux里的Provider組件,將store注入到Provider組件,它可以讓所有容器組件都可以訪問到store。

9. 總結

當我遇到問題:

  1. 要沉著冷靜。
  2. 要管理好時間。
  3. 別被bug或error搞的不高興,要高興,又有煅煉思維的機會了。
  4. 要思考這是為什么?
  5. 要搞清楚問題的本質。
  6. 要探究問題,探究數據的流動。

10. 參考

React中文文檔
Github地址

轉載于:https://www.cnblogs.com/libin-1/p/6778443.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254745.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++11 原子類型與原子操作

1、原子類型和原子操作&#xff08;1&#xff09;類型&#xff08;2&#xff09;操作&#xff08;3&#xff09;詳述● 原子類型只能從其模板參數類型中進行構造&#xff0c;標準不允許原子類型進行拷貝構造、移動構造&#xff0c;以及使用operator等● atomic_flag 是一個原子…

get_metrology_object_measures獲取測量區域和計量模型的計量對象的邊緣位置結果

目錄get_metrology_object_measures&#xff08;算子&#xff09;描述參數get_metrology_object_measures&#xff08;算子&#xff09; get_metrology_object_measures - 獲取測量區域和計量模型的計量對象的邊緣位置結果。 get_metrology_object_measures&#xff08;&…

依弗科(上海)機電設備有限公司

機器人噴涂倒計時&#xff0c;上帝幫我實現愿望吧 阿門 &#xfeff;&#xfeff;&#xfeff;&#xfeff;

外部變量和外部函數

C程序由一組對象組成&#xff0c;這些對象包括程序中所使用的變量和實現特定功能的函數。變量可以分為函數內部定義、使用的變量和函數外部定義的變量&#xff0c;通常情況下&#xff0c;把函數內部定義、使用的變量稱為內部變量或局部變量&#xff0c;而將在函數外部定義的、供…

gulp中使用babel-polyfill編譯es6拓展語法

今天想在新項目中使用es6的generators&#xff0c;發現雖然gulp已經有了babel編譯&#xff0c;但仍會報錯&#xff0c;網上查找后發現解決辦法是加載polyfill&#xff0c;但是找到的辦法都不試用我的項目。 解決辦法&#xff1a;在index.html中加載node_modules的babel-polyfil…

CoDeSys

&#xfeff;&#xfeff;CoDeSys是全球最著名的PLC內核軟件研發廠家德國的3S&#xff08;SMART&#xff0c;SOFTWARE&#xff0c;SOLUTIONS&#xff09;公司出的一款與制造商無關的IEC 61131-1編程軟件。CoDeSys 支持完整版本的IEC61131標準的編程環境&#xff0c;支持標準的六…

使用halcon結合機械XY軸對相機進行9點標定

小哥哥小姐姐覺得有用點個贊唄&#xff01; 先在halcon中計算仿射變換矩陣并驗證 //在圖像中找到的模板中心位置 PicX:[1680.721,2065.147,911.499,526.798,1290.920,1285.731,1300.953] PicY:[968.321,964.366,976.283,980.035, 587.055,394.727,1355.487] //與圖像中查找…

Ubuntu Linux 提出新的發布模式——測試周

2019獨角獸企業重金招聘Python工程師標準>>> 導讀開源技術項目最大的優勢之一就是社區的每個人都可以自由地提出想法&#xff0c;如果獲得社區支持&#xff0c;它可以變成現實。著名的 Ubuntu 開發人員 Simon Quigley 就提出了一個可能改變 Ubuntu Linux 開發過程的…

264 I和IDR

I和IDR幀都是使用幀內預測的。它們都是同一個東西而已,在編碼和解碼中為了方便&#xff0c;要首個I幀和其他I幀區別開&#xff0c;所以才把第一個首個I幀叫IDR&#xff0c;這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列…

gen_caltab生成標定文件

目錄gen_caltab&#xff08;算子&#xff09;描述參數gen_caltab&#xff08;算子&#xff09; gen_caltab - 為具有矩形排列標記的校準板生成校準板描述文件和相應的PostScript文件。 gen_caltab&#xff08;:: XNum&#xff0c;YNum&#xff0c;MarkDist&#xff0c;Diamet…

主席樹,喵~

稍微總結一下主席樹吧 Too Difficult&#xff01;搞了一天搞出一大堆怎么令人悲傷的辣雞代碼。總之先總結一下吧&#xff0c;以后碰到這種問題直接拿去毒害隊友好了。 UPD 5/24 茍狗是沙比 一個節點記錄三個信息&#xff1a;lson,rson,sum 用pid表示節點個數。 build void buil…

【轉】小白級的CocoaPods安裝和使用教程

原文網址&#xff1a;http://www.jianshu.com/p/e2f65848dddc 百度有很多CocoaPods的安裝教程.第一次看的時候,確實有點摸不透的感覺.經過思考,一步一步來實踐,前后花了三十幾分鐘,才順利使用..所以想了想,我還是寫一個小白級的教程吧.細到每一個細節都說明. 讓你不用10分鐘解決…

常見錯誤總結

少打頭文件 少打using namespace std; 命名沖突&#xff0c;全局變量與局部變量命名一致&#xff0c;導致使用的值不是期望值 邊讀邊寫&#xff0c;導致改后讀&#xff0c;覆蓋寫入的值 長整數移位溢出&#xff0c;1<<63是錯誤的&#xff0c;應該寫成1ll<<63 循環變…

x264_sps_init

x264_sps_init此函數為序列量化集的初始化。主要對結構體x264_sps_t中參數的初始化。 void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param ) { sps->i_id i_id;首先設置序列參數集的ID b_qpprime_y_zero_transform_bypass判斷碼率控制方法是否是恒定質量…

HALCON相機標定相機內參相機外參

目錄相機標定1.相機標定是什么2.怎么使用halcon進行相機內外參標定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相機連好電腦&#xff0c;用相機廠家軟件打開相機&#xff0c;檢查一下相機是否正常。**2.**接下來使用halcon連接相機**&#xff08;2&#xff09;開始標定…

ionic更改端口號

ionic serve -p 8888 —— 重新指定端口號為8888 serve [options] ............................... 啟動本地服務器進行開發測試 dev/testing   [--consolelogs|-c] ..................... 輸入app的控制臺到ionic的控制臺顯示   [--serverlogs|-s] .....................…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);會改變url中 &#xff1f; 后面的 搜索參數&#xff0c;但是controller不會重新實例化。angular 官方文檔…

Ubuntu apt-get 更新/查看軟件

ubuntu 升級軟件&#xff1a; sudo apt-get update 更新源  sudo apt-get upgrade 更新已安裝的包  sudo apt-get dist-upgrade 升級系統 ubuntu升級特定軟件&#xff1a; 可以用 sudo apt-get install pkgname 看軟件安裝位置:dpkg -L xxxx 查看軟件是否安裝&#xff1…