摘要:的使用用戶發出函數算出新的重新渲染三大原則單一數據源,利用的形式向下傳播數據流決定只讀,通過修改通過純函數來修改組件狀態,是描述動作的純函數連接和基于全局的,選擇我們要注入的不同的組件分開把注入,讀取方法三劍客先確定一下初始狀
redux的使用
三大原則react-native, react, react-redux, react-navigaition, redux-thunk, redux-persist
用戶發出action, reducer函數算出新的state, view重新渲染
單一數據源,利用props的形式向下傳播(react數據流決定)
state只讀,通過action修改
通過純函數reducer來修改組件狀態,reducer是描述action動作的純函數
react-redux 連接react和reduximport { connect, Provider } from "react-redux"connet([mapStateToProps], [mapDispatchToProps], [mergeProps])(App)
mapStateToProps: 基于全局的state,選擇我們要注入的props
不同的組件分開connec
function select(state){ return{ // 把state.todos注入,讀取方法: this.props.visibleTodo visibleTodo: state.todos } } const todoApp connect(select)(App) // export default todoApp
// store = "balabala"redux三劍客
// 先確定一下初始狀態(狀態表示的格式) export default { money: 0, lastJob:"no job" }ACTION
定義動作,比如搶劫銀行、搬磚,但是怎么搶怎么搬還是reducer來定
/** * Created by liuyiman on 2017/7/3. */ // 定義一個menoy+的action function addmoney(money){ return { // 可以用一個文件管理type,之所以是type是因為我的reducer要根據這個來判斷 type: "ADD_MONEY", money } } function setLastJob(job){ return { type: "SET_JOB", job } } // 定義一個賺錢的方式1 ,搶劫銀行 export function robBank(){ return (dispatch, getState) => { // 賺一百萬 let { earn } = getState() dispatch(addmoney(earn.money + 1000000)) return dispatch(setLastJob("robber")) } } // 定義一個賺錢的方式2,建材轉移者 export function moveBrick(){ return (dispatch, getState) => { console.log("s",getState()) let { earn } = getState() // 賺一塊錢 dispatch(addmoney( earn.money + 1 )) dispatch(setLastJob("brick mover")) } } // 破產,數據清零 export function goBroke() { return { type: "BROKE", money: 0, job:"broke" } }reducers
描述action如何改變store(in fact state)
import { combineReducers } from "redux" import initializeState from "./initializeState" // 定義一個reducer function earn( state = initializeState, action ) { switch (action.type) { case "ADD_MONEY": return{ ...state, money:action.money } case "SET_JOB": return{ ...state, lastJob:action.job } case "BROKE": return{ ...state, money:action.money, lastJob:action.job } default: return state } } export default earnstore
不同的組件可以 connet 到不同的 store
import { createStore, applyMiddleware, compose, combineReducers } from "redux" import thunkMidlleware from "redux-thunk" import earn from "./reducers" import { persistStore, autoRehydrate} from "redux-persist" import { AsyncStorage } from "react-native" // base reducer let baseReducers = { earn: earn } /* * 考慮到后面要將react-navigation的reducer加進來,使用redux-persist,所以寫了這個helper * const store = configStore(reducers)() * */ const configStore = function (reducers = {}) { const rootReducer = combineReducers({ ...baseReducers, ...reducers }) return function (_options = {}) { const store = createStore( rootReducer, _options.initialState, compose( applyMiddleware(thunkMidlleware), autoRehydrate() ) ) const options = { storage: AsyncStorage, blacklist: _options.blacklist } persistStore(store, options) return store } } export default configStoremore 中間件 middleware
對store.dispatch的重新定義
在發出action和執行reducer之間,添加了其他功能
redux-thunk使dispatch可以接受函數說作為參數,使異步的action可以被觸發
// 無論killSomeOne是Action create還是普通的返回{}的action this.props.dispath(killSomeOne("vincent"))redux-persist
本地保存store狀態(react-native 本地緩存),可以設置白名單黑名單自動保存等等,特別好用
/* * 考慮到后面要將react-navigation的reducer加進來,使用redux-persist,所以寫了這個helper * const store = configStore(reducers)() * */ const configStore = function (reducers = {}) { const rootReducer = combineReducers({ ...baseReducers, ...reducers }) return function (_options = {}) { const store = createStore( rootReducer, _options.initialState, compose( applyMiddleware(thunkMidlleware), autoRehydrate() ) ) const options = { storage: AsyncStorage, blacklist: _options.blacklist } persistStore(store, options) return store } } export default configStorereact-navigation + redux
import React, { Component } from "react"; import { AppRegistry, StyleSheet, Text, View, Button } from "react-native"; // navigation import { TabNavigator, addNavigationHelpers, StackNavigator } from "react-navigation" // for connect redux and react import { Provider,connect } from "react-redux" import configStore from "./redux/store" // import actions import {moveBrick, robBank, goBroke} from "./redux/actions" // initialState import initialState from "./redux/store" // 賺錢頁面 class Earn extends Component { constructor(props) { super(props) } render(){ const { earn, dispatch } = this.props console.log( "saa",initialState,earn ) return() } } // 傳入 earn頁面的redux const earnSelect = function (state) { return{ earn: state.earn } } // 連接,吧earn上面的select傳入earn的props里面 const ConnnetedEarn = connect(earnSelect)(Earn) // tab navigation的另一個頁面 class Screen extends Component{ constructor(props){ super(props) } render() { const { navigate } = this.props.navigation return( 先賺一個億! my money$:{earn.money} my last job:{earn.lastJob} ) } } // 注冊一個tag navigator const AppNav = TabNavigator({ "earn":{ screen: ConnnetedEarn }, "screen": { screen: Screen } }) // stack navigation 的頁面 class Stack2 extends Component { constructor(props){ super(props) } render(){ const {navigate} = this.props.navigation return ( SCREEN! {navigate("Stack2")}}/> ) } } /* * 注冊stack * 一個是 上面的 tag navigation的頁面 * 另一個是 上面的 stack2 * */ const StackNav = StackNavigator({ App:{ screen: AppNav, title: "app" }, Stack2: { screen: Stack2, title: "stack2" } }) const navInitialState = StackNav.router.getStateForAction(AppNav.router.getActionForPathAndParams("screen")) const navReducer = (state = navInitialState, action) => { console.log("state:",state) let nextState = StackNav.router.getStateForAction(action, state); console.log("action", action) return nextState || state } /* * 加入navReducer,生成store * */ const store = configStore({ nav: navReducer })({ blacklist:["nav"] }) /* * stack app * 利用addNavigationHelper吧navigation傳進去 * */ class App extends Component{ render(){ return( Stack2 navigate("screen")}/> ) } } /* * 把nav傳進去 * */ function select(state) { console.log("state",state) return { nav: state.nav } } /* * connect connect! * */ const ConnectedApp = connect(select)(App) // 加上 provider和store class reduxLearn extends Component { render() { return ( ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "#F5FCFF", }, welcome: { fontSize: 20, textAlign: "center", margin: 10, }, instructions: { textAlign: "center", color: "#333333", marginBottom: 5, }, }); // 注冊 AppRegistry.registerComponent("reduxLearn", () => reduxLearn);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83870.html
摘要:安卓系統的信息系統的信息項目部分截圖項目源代碼公共組件首頁所有圖片登錄頁我的頁新聞頁配置省市區文件進入輪播頁項目入口文件項目依賴配置最新生成的文件信息上次打包的版本路由配置文件 github地址:https://github.com/cryingbat/... react-native-app use react-native。Pack of the generated apk ins...
摘要:從到完美,用和寫一個在年開源了后,緊接著在年就又開源了,就此打開了用和前端技術寫原生之路。對應來看,程序只有兩個部分,和,而部分則分為組件和。所以,在端的純庫無在中同樣適用,如等。應用實例便是使用開發的一個日記。 從 1 到完美,用 js 和 react-native 寫一個 APP facebook 在 2013 年開源了 react 后,緊接著在 2015 年就又開源了 react...
摘要:之前寫了一篇沒有加入的的小博文。一拆分結構根據自己的習慣和固定套路,拆分目錄結構和組件結構。把的導航組件集中放在純粹是個人習慣。二代碼實現入口文件是用來做的數據持久化。添加事項后要通知其他組件更新數據。 讀前須知 這個項目是第一次使用Redux的實例,并不具有專業性的理論知識。純粹分享一次開發過程與心得。之前寫了一篇沒有加入Redux的React Native ToDoList的小博文...
摘要:鑒于我平常使用的是系統,就決定我只開發安卓客戶端,客戶端我們又招了一個小伙伴。一般來講,安卓系統是這一兩年市面上常用機型配置的系統。 從去年的10月份開始,我的大部分工作重心從傳統的前端開發轉向了使用ReactNative開發APP,在這個過程當中,走過了不少彎路,也遇到了一些技術相關的問題,但總算沒有辜負那些對我信任的人。經歷過痛苦和無助,終于堅持了下來,一個月的時間把產品成功部署上...
摘要:比如安卓平臺在中不能觸屏手動滾動。主要的功能界面模塊大部分主要是展示的,網易云的頁面和功能實在是太多了,由于時間關系,并沒有把所有的功能都做完整,后續會陸續加上其他的功能。各部分模塊首頁展示音樂播放,包括動畫,歌詞同步等。 React Native 模仿網易云音樂手機客戶端,兼容安卓和IOS兩個平臺。 GitHub 完整源碼地址https://github.com/yezihaohao...
閱讀 3027·2023-04-25 18:06
閱讀 3272·2021-11-22 09:34
閱讀 2857·2021-08-12 13:30
閱讀 2045·2019-08-30 15:44
閱讀 1661·2019-08-30 13:09
閱讀 1630·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51