react-native 學習筆記
環境搭建:詳情見官網
node、react-native-cli、python2、JDK1.8、AndroidStudio
一、準備工作 選擇性安裝組件
- redux:統一狀態管理
- react-redux:提供provide、connect API,綁定react組件獲取store
- redux-devtools:redux開發者工具,支持熱加載、action重放、自定義UI等
- redux-thunk:實現action異步獲取數據的middleware
- redux-persist:支持store本地持久化
- redux-observable:實現可取消的action
二、redux 介紹
Redux的概念:把整個應用看成一個component,共享一個store,所有頁面都可以拿到store中的內容。當this.store中的state改變的時候,所有關聯的頁面就會刷新。這樣,不用寫global,不用寫通知。就可以跨頁面共享一個狀態。所有redux中的狀態都是可以全局拿到的。
如:
<SubComponent someProps={this.state.someState} />
改變state來改變子控件UI的做法。所有用到rudux的頁面都是他的子控件。改變state,子頁面就都會跟著變。
- subscribe:訂閱事件
- state:狀態值
- action:view改變store的唯一方式,store.dispatch(action)
- reducer:純函數,接受參數state, action 返回newState
三、react-redux 介紹
-
provider:包裹根組件,使所有子孫組件能通過connect高階函數綁定store
class Index extends Component { render() { return { <Provider store={store}> <RootComponent/> </Provider> } } }
-
connect:高階函數,接受參數(mapStateToProps,mapDispatchToProps)(component,通過mapstatetoprops,mapdispacter參數獲取newState,并返回一個接受組件的高階函數,
最終返回一個綁定store的Connect組件
四、使用redux
Redux的流程:
store.dispatch(action) -> reducer處理action,返回一個新的state ->Store更新state ->相關UI更新
-
創建action
/** * action 類型 */ const ADD_TODO = 'ADD_TODO' /** * action 創建函數 */ export function addTodo(text) { return { type: ADD_TODO, result: text } }
-
創建reducer
export function reducerAdd (state, aciton) { switch(aciton.type) { // 返回即將改變的state,由store自己替換state的值 case 'ADD_TODO' : return {...state, result: action.result}; default: return state } }
-
使用combineReducers
-
reducers/todos.js
export default function todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return state.concat([action.text]) default: return state } }
-
reducers/counter.js
export default function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default: return state } }
-
reducers/index.js
import { combineReducers } from 'redux' import todos from './todos' import counter from './counter' export default combineReducers({ todos, counter })
-
App.js
import { createStore } from 'redux' import reducer from './reducers/index' let store = createStore(reducer) console.log(store.getState()) // { // counter: 0, // todos: [] // } store.dispatch({ type: 'ADD_TODO', text: 'Use Redux' }) console.log(store.getState()) // { // counter: 0, // todos: [ 'Use Redux' ] // }
-
-
使用action
// 例子 class Page extends React.Component { login = ()=>{ //分發Action this.props.dispatch({type: 'INCREMENT'}) } render( <View> <Text>{this.props.counter}</Text> </View> ) } const mapStateToProps = state => { return { counter: state.counter, }; }; //關聯頁面和用到的模塊,store就會把子模塊的State通過props傳遞給此頁面 export default connect(mapStateToProps)(Page);
-
redux-thunk
允許action創建函數返回一個異步函數
- 使用thunk
import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import rootReducer from './reducers'; // 創建store的時候,第二個參數是中間件,redux-thunk提供了一個thunk中間件,用于處理異步的action export default createStore( rootReducer, applyMiddleware(thunk) );
- 使用場景
//同步action export const initAction = (data) => ({ type: 'INIT_DATA', data }) //異步action export const getDataAction = () => { //這個方法有一個dispatch的參數,這個dispatch就是store里的dispatch. return (dispatch) => { axios.get('path').then((res) => { let data = res.data dispatch(initAction(data)) }) } } //組件中 componentDidMount () { const action = getDataAction(); store.dispatch(action); }
-
redux-saga
-
redux-actions
-
redux-promise
智能推薦
一步一步學習 ReactNative + Redux(6)
寫在開始 到這里,我們對 ReactNative 、Redux ,以及中間件、異步Action 都相當了解。 這篇,我們會把 TODO 添加也改為異步Action。http://www.jianshu.com/p/0bab91ba74dd 源碼:https://github.com/eylu/web-lib/tree/master/ReactReduxDemo/app_step6 調用遠程接口,添...
一步一步學習 ReactNative + Redux(3)
寫在開始 前篇中,我們介紹了 Redux ,對 Store 、 Action 、Reducer 有了初步的了解。并配合 react-redux ,梳理了其工作流程,結合使用了 Provider 、 connect() 。 接下來,我們完成開篇任務中的最后一項,過濾顯示 TODO 。http://www.jianshu.com/p/611fdc455e37 源碼:https://githu...
一步一步學習 ReactNative + Redux(2)
寫在開始 上篇中,我們搭建了 ReactNative + Redux 的結構、顯示了初始數據。http://www.jianshu.com/p/adf8886f5408 這篇,我們需要做狀態更改了,即 dispatch(action) 。 源碼:https://github.com/eylu/web-lib/tree/master/ReactReduxDemo/app_step...
一步一步學習 ReactNative + Redux(1)
寫在開始 上篇中,完成了 TODO 列表展示, TODO 項狀態更改,添加新 TODO。http://www.jianshu.com/p/4ceff3bbb414 只是使用的 React Native 方式控制 state,這里,我們開始使用 Redux 控制 state,也就是 React Native + Redux 開發。 源碼:https://github.com/ey...
一步一步學習 ReactNative + Redux(0)
寫在開始 研究 ReactNative 有一小段時間了,之前就聽過狀態管理 Redux 的大名,由于種種原因,沒深入了解。 這兩天有些許的時間,本想看看Redux,然鵝,一臉懵B ... 然后,經過三天三夜的大戰,漸入佳境。固,將一些心法心得記錄下來。 這是開篇,會慢慢演化如何使用 ReactNative + Redux 。 注意: 這里并沒有使用 Redux 這里并沒有使用 Redux 這里并沒...
猜你喜歡
ReactNative學習筆記之調用原生模塊(進階)之Callback、Promise使用
前言 前文ReactNative學習筆記——調用原生模塊(Android)簡單說了下ReactNative調用Android原生模塊的基本用法,下面講解下調用原生模塊經常會用到的Callback和Promise。 很多時候我們可能不僅僅是調用Native的方法,還要通過原生方法獲取它的返回值,但是,前面說過,要導出一個方法給JavaScript使用,Java方法的返回類型必...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...