摘要:的使用用户发出函数算出新的重新渲染三大原则单一数据源,利用的形式向下传播数据流决定只读,通过修改通过纯函数来修改组件状态,是描述动作的纯函数连接和基于全局的,选择我们要注入的不同的组件分开把注入,读取方法三剑客先确定一下初始状
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);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 2997·2023-04-25 18:06
阅读 3230·2021-11-22 09:34
阅读 2841·2021-08-12 13:30
阅读 2022·2019-08-30 15:44
阅读 1634·2019-08-30 13:09
阅读 1616·2019-08-30 12:45
阅读 1680·2019-08-29 11:13
阅读 3594·2019-08-28 17:51