1>npm安裝redux:react
"react-redux": "^5.0.5", "redux": "^3.7.1", "redux-thunk": "^2.2.0"
2>大體結構目錄以下:npm
3>ActionTypes.js:redux
redux
過程當中,須要給每一個動做添加一個actionTypes
類型,能夠說是標示;// 接收數據 export const RECEIVE_BEAUTY_LIST = 'RECEIVE_BEAUTY_LIST'; export const BACKIMAGE_URL = 'BACKIMAGE_URL';
4>Store: 就是保存數據的地方,你能夠把它當作一個容器。整個應用只能有一個 Store。react-native
5>State:Store
對象包含全部數據。若是想獲得某個時點的數據,就要對 Store 生成快照。這種時點的數據集合,就叫作 State。app
當前時刻的 State,能夠經過store.getState()
拿到。ide
/** * 建立Store,整合Provider * @flow */ import thunk from 'redux-thunk'; import { createStore, applyMiddleware, compose } from 'redux'; import rootReducer from './../Reducers/RootReducers'; let store = createStore(rootReducer, {}, compose( applyMiddleware(thunk), window.devToolsExtension ? window.devToolsExtension() : f => f )) export default store;
6>Actions:函數
State 的變化,會致使 View 的變化。可是,用戶接觸不到 State,只能接觸到 View。因此,State 的變化必須是 View 致使的。Action 就是 View 發出的通知,表示 State 應該要發生變化了。學習
Action 是一個對象。其中的type
屬性是必須的,表示 Action 的名稱。fetch
import * as types from './../ActionTypes'; import { AsyncStorage, } from 'react-native'; let KEY = 'PSMeiTuan'; export function backImage() { return dispatch => { return AsyncStorage.getItem(KEY,(Error,result)=>{ if (result === null){ // 使用dispatch存儲值 dispatch(getBackImage('img')) } else { console.log('獲取圖片成功' + result); dispatch(getBackImage(result)); } }); } }; export function getBackImage(imageURL) { return { type: types.BACKIMAGE_URL, imageURL // 鍵值相等能夠直接這麼寫 } }
7>Reducers:this
Store 收到 Action 之後,必須給出一個新的 State,這樣 View 纔會發生變化。這種 State 的計算過程就叫作 Reducer。
Reducer 是一個函數,它接受 Action 和當前 State 做爲參數,返回一個新的 State。
import * as types from './../ActionTypes'; const initialState = { loading: false, beauty: [], imageURL: 'https://ws1.sinaimg.cn/large/610dc034ly1fgllsthvu1j20u011in1p.jpg' } export default function beautyReducers(state = initialState, action) { switch (action.type) { case types.RECEIVE_BEAUTY_LIST: console.log('收到消息'); return Object.assign({}, state, { loading: true, beauty: action.beauty }); case types.BACKIMAGE_URL: return Object.assign({}, state, { imageURL:action.imageURL }); default: return state; } }
8>connect
鏈接頁面和Reducer:<這裏只記錄一個頁面選擇圖片,使用redux保存圖片,另外一個頁面展現選擇的圖片>
BeautyPage.js選擇圖片頁面:
// 導入相關類
import { connect } from 'react-redux'; import {fetchBeautyGirlData} from './../../../Redux/Actions/BeautifulGirlAction'; import { backImage, getBackImage } from './../../../Redux/Actions/BackImageAction';;
// 鏈接reducer export default connect((state) => { const { beautyReducers } = state; // 這裏的beautyReducers注意和對應的reducer文件export的類相同 return { beautyReducers } }, { backImage,getBackImage, fetchBeautyGirlData })(BeautyPage) // 這裏是對應的存值的方法,BeautyPage是導出當前模塊
// 點擊圖片,保存圖片 onImageClick(item) { // alert(item.url); const {navigate,goBack,state} = this.props.navigation; // 方法一: 在第二個頁面,在goBack以前,將上個頁面的方法取到,並回傳參數,這樣回傳的參數會重走render方法 // state.params.callback(item.url); let KEY = 'PSMeiTuan'; AsyncStorage.setItem(KEY,item.url,(error)=>{ if (error){ console.log('存儲失敗' + error); } else { console.log('存儲成功'); // 方法二: 這裏能夠發送通知到首頁 // DeviceEventEmitter.emit('SHITUIMAGE',url); // 方法三: this.props.getBackImage(item.url); } }); // 返回當前頁 goBack(); }
ReduxDemo.js對圖片進行顯示:
import { backImage,getBackImage } from './../../../Redux/Actions/BackImageAction';
鏈接reducer:
export default connect((state) => { const { beautyReducers } = state; return { beautyReducers }; },{ backImage,getBackImage })(ReduxDemo)
/** * 此頁面調用順序: * 1>render; * 2>componentDidMount; * 3>componentWillReceiveProps; * 4>render; */ // 使用 componentDidMount(){ console.log('componentDidMount'); // 使用backImage方法。 this.props.backImage(); } componentWillReceiveProps(nextProps){ console.log('componentWillReceiveProps'); // 最開始的值 console.log(nextProps.beautyReducers); // 以前存儲的值 console.log(this.props.beautyReducers); const { navigate } = this.props.navigation; const { imageURL } = nextProps.beautyReducers; if (this.props.beautyReducers.imageURL !== imageURL){ if (imageURL) { imageUri = imageURL; } } }
暫時的理解就是Redux能夠用來數據請求的時候以state存儲數據,某個頁面值改變進行值的存儲,以實現不一樣頁面均可以很輕鬆的取得數據.
暫時只實現和掌握了簡單的使用,高級用法後面學習積累!!!😄