摘要:之前寫了一篇沒有加入的的小博文。一拆分結(jié)構(gòu)根據(jù)自己的習(xí)慣和固定套路,拆分目錄結(jié)構(gòu)和組件結(jié)構(gòu)。把的導(dǎo)航組件集中放在純粹是個人習(xí)慣。二代碼實(shí)現(xiàn)入口文件是用來做的數(shù)據(jù)持久化。添加事項(xiàng)后要通知其他組件更新數(shù)據(jù)。
讀前須知
這個項(xiàng)目是第一次使用Redux的實(shí)例,并不具有專業(yè)性的理論知識。純粹分享一次開發(fā)過程與心得。之前寫了一篇沒有加入Redux的React Native ToDoList的小博文。這個項(xiàng)目也是在原來的基礎(chǔ)上進(jìn)行裝修完成的。目的是為了體驗(yàn)一下高深莫測的Redux。
總之,在各位網(wǎng)友的友情支持下,我依然沒有看懂redux數(shù)據(jù)流的走向,勉勉強(qiáng)強(qiáng)通了一點(diǎn)。
根據(jù)自己的習(xí)慣和固定套路,拆分目錄結(jié)構(gòu)和組件結(jié)構(gòu)。
├── public ├── todos-redux │?? ├── actions │?? │?? └── index.js │?? ├── components │?? │?? ├── todoItem.js │?? │?? └── todoList.js │?? ├── containers │?? │?? ├── add.js │?? │?? ├── all.js │?? │?? ├── completed.js │?? │?? └── incomplete.js │?? ├── reducers │?? │?? ├── index.js │?? │?? └── todos.js │?? ├── store │?? │?? └── configureStore.js │?? ├── utils │?? │?? └── utils.js │?? ├── index.js │?? ├── router.js
把react-navigation的導(dǎo)航組件集中放在router.js純粹是個人習(xí)慣。
components中的組件是展示組件,不直接使用Redux。而containers中的是直接使用 Redux的組件。在這里可以看成components是containers的子組件。
redux-persist是用來做redux的數(shù)據(jù)持久化。使用方法直接參考在GitHub上的基本示例。這里的代碼基本上都是固定套路。
// index.js import React, {Component} from "react" import { Provider } from "react-redux" import { TodosReduxStack } from "./router" import { PersistGate } from "redux-persist/integration/react" import configureStore from "./store/configureStore" const { persistor, store } = configureStore() export default class TodolistRedux extends Component { render(){ return (創(chuàng)建Action) } }
// action/index.js import Utils from "../utils/utils" export const addTodo = (text) => { return { type: "ADD_TODO", id: Utils.uniqueId(), content: text } } export const toggleTodo = (id) => { return{ type:"TOGGLE_TODO", id } }Reducers
// reducers/todos.js var initState = []; const todos = (state = initState, action)=>{ switch(action.type){ case "ADD_TODO": return[ ...state, { id: action.id, content: action.content, completed: false } ] case "TOGGLE_TODO": return state.map((t) => { if (t.id !== action.id) { return t } return Object.assign({},t,{completed:!t.completed}) }) default: return state } } export default todos容器組件
connect()() 這個寫法叫函數(shù)的柯里化,漲知識啦。
// containers/all.js const mapStateToprops = (state) => { return { todos: state.todos } } const mapDispatchToProps = (dispatch) =>{ return { onTodoClick: (id) => { dispatch(toggleTodo(id)) } } } export default connect(mapStateToprops, mapDispatchToProps)(AllScreen)
使用filter函數(shù)過濾數(shù)組,返回指定的值,這個地方有點(diǎn)雞肋哈,但是我不會其他的寫法了。
// containers/completed.js const mapStateToprops = (state) => { return { todos: state.todos.filter(t => t.completed) } }(三)使用Redux前后對比
沒有使用Redux之前,項(xiàng)目使用了React Native內(nèi)置的DeviceEventEmitter方法。添加事項(xiàng)后要通知其他組件更新數(shù)據(jù)。還大量使用了AsyncStorage做數(shù)據(jù)的持久化,每一次的數(shù)據(jù)更新都需要用到它。如果是在稍復(fù)雜的項(xiàng)目中這樣寫,會死翹翹的!使用Redux 和 redux-persist 可以輕松實(shí)現(xiàn)這個功能,效果是明顯的。在已完成頁面將事項(xiàng)切換為未完成,該事項(xiàng)會直接消失,跑到未完成頁面中,這個地方并不需要做額外的處理。
說在后面的話這種連個圖都沒有也沒有深入講解redux的文字都敢發(fā)出來,真的是表臉 (手動滑稽)。
完整的項(xiàng)目在這里GitHub Todos Redux。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97908.html
摘要:而函數(shù)式編程就不一樣了,這是模仿我們?nèi)祟惖乃季S方式發(fā)明出來的。數(shù)據(jù)流在中,數(shù)據(jù)的流動是單向的,即從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)。數(shù)據(jù)流嚴(yán)格的單向數(shù)據(jù)流是架構(gòu)的設(shè)計核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實(shí)現(xiàn)一個簡易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實(shí)現(xiàn)一個完整應(yīng)用的過程。 代碼地址:Re...
摘要:框架的使用詳解及教程在前段時間,我們也學(xué)習(xí)講解過框架的基本使用,但是有很多同學(xué)在交流群里給我的反饋信息說,框架理解上有難度,看了之后還是一臉懵逼不知道如何下手,很多同學(xué)就轉(zhuǎn)向選擇使用框架。 dva框架的使用詳解及Demo教程 在前段時間,我們也學(xué)習(xí)講解過Redux框架的基本使用,但是有很多同學(xué)在交流群里給我的反饋信息說,redux框架理解上有難度,看了之后還是一臉懵逼不知道如何下手,很...
摘要:用來進(jìn)行組件間通訊地址疑惑之前在做項(xiàng)目的時候,一直會遇到一個困擾我的問題,兩個互相獨(dú)立的子組件如何通訊假設(shè)現(xiàn)在結(jié)構(gòu)如下是一個組件,里面有一個刪除操作,點(diǎn)擊添加備注時會彈出模態(tài)框,讓用戶進(jìn)行填寫。 用Redux來進(jìn)行組件間通訊 demo地址 疑惑 之前在做項(xiàng)目的時候,一直會遇到一個困擾我的問題,兩個互相獨(dú)立的子組件如何通訊? 假設(shè)現(xiàn)在結(jié)構(gòu)如下 showImg(https://segmen...
閱讀 4095·2021-10-08 10:04
閱讀 3076·2021-08-11 11:20
閱讀 2749·2021-07-25 21:37
閱讀 2699·2019-08-30 12:44
閱讀 2326·2019-08-30 11:12
閱讀 1327·2019-08-26 13:45
閱讀 2375·2019-08-26 11:53
閱讀 3071·2019-08-26 11:32