惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LangChain Blog
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
A
About on SuperTechFans
J
Java Code Geeks
量子位
博客园 - 三生石上(FineUI控件)
博客园 - Franky
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

Java不加糖的Blog

假设, AI 把我代替的那一刻真的到来 | szhshp 的第三边境研究所 小傻瓜都能懂的 AstrBot QQ 机器人集成 MCP 功能实战指南 | szhshp 的第三边境研究所 《智人之上: 从石器时代到 AI 时代的信息网络简史》阅读笔记 | szhshp 的第三边境研究所 iPadOS 26 无法设置空间场景图片壁纸的解决方法 | szhshp 的第三边境研究所 《一路云海》(终) | szhshp 的第三边境研究所 《一路云海》(四): 如何不按套路旅行 | szhshp 的第三边境研究所 《一路云海》(三): In Ya Mellow Tone | szhshp 的第三边境研究所 《一路云海》(二): 关西世博参观纪实 | szhshp 的第三边境研究所 《一路云海》(一): 新的征程 | szhshp 的第三边境研究所 2025 大阪世博会 [ 3 天前-先到先得 ] 阶段 场馆预约必中独家攻略 | szhshp 的第三边境研究所 Hackathon 随想 | szhshp 的第三边境研究所 一杯双皮奶 | szhshp 的第三边境研究所 Armbian + CasaOS + NAS 配置指南 | szhshp 的第三边境研究所 Docker 构建镜像报错: error getting credentials - err: exit status 1, out: `` | szhshp 的第三边境研究所 Disqus RIP! 论过高的维护成本如何治疗固执的坏习惯 | szhshp 的第三边境研究所 炸弹猫桌游变体规则 | szhshp 的第三边境研究所 《小岛经济学》阅读笔记 | szhshp 的第三边境研究所 《金钱心理学》阅读笔记 | szhshp 的第三边境研究所 为知笔记 RIP: 迁移剩余的笔记 | szhshp 的第三边境研究所 2025 博客第十年展望 - 再见我的过去 | szhshp 的第三边境研究所 我在独立游戏里面致敬的作品 | szhshp 的第三边境研究所 《How to make thing faster》阅读笔记 | szhshp 的第三边境研究所 《The Art of Clean Code》阅读笔记 | szhshp 的第三边境研究所 《Clean Architecture: A Craftsman Guide to Software Structure and Design》阅读笔记 | szhshp 的第三边境研究所 《How AI Works》阅读笔记 | szhshp 的第三边境研究所 游戏策划废案 - Project Uranus | szhshp 的第三边境研究所 游戏策划废案 - Project X | szhshp 的第三边境研究所 人生第一款独立游戏开发复盘 | szhshp 的第三边境研究所 Trap of Life | szhshp 的第三边境研究所 wireguard折腾记录
React-Navigation Integration with Redux | szhshp 的第三边...
2019-01-17 · via Java不加糖的Blog

Meta

目录

React-Navigation Integration with Redux

Dependencies

{
  "dependencies": {
    "@expo/samples": "2.1.1",
    "@shoutem/ui": "0.23.6",
    "expo-asset": "~1.1.0",
    "expo-constants": "~1.0.2",
    "expo-file-system": "~1.1.0",
    "expo-font": "~1.1.0",
    "na": "0.0.1-dev0",
    "prop-types": "15.6.2",
    "react-navigation": "^3.0.9",
    "react-navigation-redux-helpers": "2.0.9",
    "react-navigation/NavigationTestUtils": "3.0.9",
    "react-redux": "6.0.0",
    "react-test-renderer": "16.7.0",
    "redux": "4.0.1"
  }
}
import React from 'react';
import { Platform } from 'react-native';
import {
  createStackNavigator,
  createBottomTabNavigator,
} from 'react-navigation';
import { createStore, applyMiddleware, combineReducers } from 'redux';
import { Provider, connect } from 'react-redux';
import {
  reduxifyNavigator,
  createReactNavigationReduxMiddleware,
  createNavigationReducer,
} from 'react-navigation-redux-helpers';
 
import TabBarIcon from '../components/TabBarIcon';
import HomeScreen from '../screens/HomeScreen';
import ScoresScreen from '../screens/ScoresScreen';
import SearchScreen from '../screens/SearchScreen';
import SettingsScreen from '../screens/SettingsScreen';
import Colors from '../constants/Colors';
import Reducers from '../reducers';
 
/*
const HomeStack = ...
const SearchStack = ...
const ScoresStack = ...
const SettingsStack = ...
*/
 
/* Step 1: create a navigation object */
const AppNavigator = createBottomTabNavigator(
  {
    SearchStack,
    HomeStack,
    ScoresStack,
    SettingsStack,
  },
  {
    tabBarOptions: {
      style: {
        paddingBottom: 5,
      },
      activeTintColor: Colors.tintColor,
    },
  }
);
 
/* Step 2: prepare reducers */
const navReducer = createNavigationReducer(AppNavigator);
const appReducer = combineReducers({
  nav: navReducer, // required, handle actions from react-navigation
  reducers: Reducers, // optional, this is your reducers
});
const middleware = createReactNavigationReduxMiddleware(
  'root',
  state => state.nav
);
const App = reduxifyNavigator(AppNavigator, 'root');
const mapStateToProps = state => ({
  state: state.nav,
});
 
const AppWithNavigationState = connect(mapStateToProps)(App);
 
const store = createStore(appReducer, applyMiddleware(middleware));
 
/* step 3: create store and wrap with Provider */
class Root extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <AppWithNavigationState />
      </Provider>
    );
  }
}
 
export default () => <Root />;
 

Then everything for index are done.

Reducers Example

const defaultState = {
  xxx: 123,
};
 
const reducer = (state, actionData) => {
  let rv = !state ? defaultState : state;
 
  console.log(actionData);
 
  switch (actionData.type) {
    /* Action Item Panel */
    case 'PANEL_ACTIONITEM_DISPLAY': {
      return {
        xxx: state.xxx + 1,
      };
    }
    case 'PANEL_ACTIONITEM_FORM_CHANGE': {
      break;
    }
    case 'PANEL_ACTIONNOTE_FORM_CHANGE': {
      break;
    }
    case 'PANEL_ACTIONNOTE_REQUEST': {
      break;
    }
    default: {
      return rv;
    }
  }
};
 
export default reducer;
 

Actions Example

export const actionItem_ShowEditPanel = () => ({
  type: 'PANEL_ACTIONITEM_DISPLAY',
});   

Actual Usage in Container Components

import React from 'react';
import { ScrollView, StyleSheet, View, TouchableOpacity } from 'react-native';
import { connect } from 'react-redux'
 
import * as actions from '../actions'
 
const mapStateToProps = state => state;
 
const mapDispatchToProps = dispatch => ({
  showActionItemEditRow: (action, data) => dispatch(actions.actionItem_ShowEditPanel()),
})
 
class SearchScreen extends React.Component {
  // hide header from react-navigation
  static navigationOptions = {
    title: null,
    header: null,
  };
 
  render() {
    return (
      <Screen>
        <TouchableOpacity onPress={this.props.showActionItemEditRow}>
          <Row>
            <Text>123</Text>
          </Row>
        </TouchableOpacity>
      </Screen>
    );
  }
}
 
export default connect(
  mapStateToProps,
  mapDispatchToProps
)(SearchScreen);