什么是 redux

redux 是一个用于管理 js 应用状态(state)的容器。比如组件 A 发生了变化,组件 B 要同时做出响应。常见的应用场景就是用户的登录退出操作:未登录状态,个人中心显示登录按钮,在登录页面进行了登录后,需要在个人中心页面做出相应,显示个人信息。类似的产品有: vuex、flux、dva、mobx。

redux 常见为三个部分:

  • Action:存放改变 Store 内容的方法,想要改变 Store 里面的数据,只能触发 Action 里面的相关方法;
  • Reducer:根据 Action 操作做出不同的响应,返回一个新的 Store;
  • Store:储存数据。

在本应用里使用 redux 主要用于保存用户状态、保存首页数据。

在 React Native 里面使用 redux

安装相关依赖

yarn add redux redux-persist react-redux
  • redux 、react-redux:用于存储应用状态;
  • redux-persist:用于离线存储状态,退出应用后再次进入应用,状态任然存在。

编辑 Action

在 src 目录下创建 action 目录,目录中创建 index.js。

这里创建 2 个应用中要用到的方法,login(登录)、logout(退出);2 个测试 redux 是否生效的方法,add(加大数字)、cut(减少数字)。

export function add(num) { // 每个函数的返回值里面必须得有一个type值,Reducer就是根据type值改变做出相应
return {
type: 'add',
value: ++num
}
} export function cut(num) {
return {
type: 'cut',
value: --num
}
} export function login(data) {
return {
type: 'login',
data
}
} export function logout(data) {
return {
type: 'logout',
data
}
}

编辑 Reducer

在 src 目录下创建 reducer 目录,目录中创建 index.js/num.js/user.js。

index.js

import { combineReducers } from 'redux';
import num from './num';
import user from './user'; //这里返回的combineReducers()就是 Store 的内容,后面想要获得的话,就是使用 store.user、store.num来获得对应store的数据
export default combineReducers({
num: num,
user: user
})

num.js

const initState = {//初始化state内容
value: 0
} const setNumState = (state = initState, action) => {
switch (action.type) {//根据type的不同做出不同的响应
case 'add':
return {
...state,
value: action.value,
status: 'add'
}
case 'cut':
return {
...state,
value: action.value,
status: 'cut'
}
default://必须得有default,用于返回非期望的状态
return state;
}
} export default setNumState;

user.js

const initState = {
isLogin: false,
userData: {}
} const setUserState = (state = initState, action) => {
switch (action.type) {
case 'login':
return {
...state,
isLogin: true,
userData: action.data
}
case 'logout':
return initState;
default:
return state;
}
} export default setUserState;

编辑 Store

在 src 目录下创建 store 目录,目录中创建 index.js。

import { AsyncStorage } from 'react-native';
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import hardSet from 'redux-persist/lib/stateReconciler/hardSet';
import reducer from '../reducer'; //配置redux-persist,但下次进入应用,就会从root里面获得数据
let persistConfig = {
key: 'root',
storage: AsyncStorage,
stateReconciler: hardSet
}
const persistedReducer = persistReducer(persistConfig, reducer);
export default function configureStore() {
const store = createStore(persistedReducer);
let persistor = persistStore(store);
return { store, persistor };
}

修改 App.js

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import configureStore from './store';
import Router from './router'; const store = configureStore(); export default class App extends Component {
render() {
return (
<Provider store={store.store} style={{ flex: 1 }}>
<PersistGate loading={null} persistor={store.persistor}>
<Router />
</PersistGate>
</Provider>
);
}
};

修改 pages 里面的 index.js detail.js 以测试 redux 是否生效

import React from "react";
import { View, Text } from "react-native";
import { connect } from 'react-redux';
import { add, cut } from '../action'; class Home extends React.Component {
render() {
const { dispatch, value, navigation } = this.props;
return (
<View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
<Text onPress={() => navigation.push('Detail')}>Home Click Me</Text>
<View style={{ flexDirection: 'row', width: 300, justifyContent: 'space-around' }}>
<Text onPress={() => dispatch(add(value))} style={{ backgroundColor: 'blue', color: '#fff', fontSize: 18 }}>减少数字</Text>
<Text style={{ fontSize: 20 }}>{value}</Text>
<Text onPress={() => dispatch(cut(value))} style={{ backgroundColor: 'blue', color: '#fff', fontSize: 18 }}>加大数字</Text>
</View>
</View>
);
}
} const select = (store) => {
return {
value: store.num.value,
}
} export default connect(select)(Home);

效果图:

这里是一个集成了 router、redux、icons的基本工程,clone下来就能使用 https://github.com/hulinNeil/react-native-base;

React Native 开发豆瓣评分(三)集成 Redux的更多相关文章

  1. React Native 开发豆瓣评分(八)首页开发

    首页完成效果展示: 一.开发占位图组件 在没有数据的时候使用占位图替代 items 的位置. 在 components 目录里创建 moviesItemPlaceholder.js import Re ...

  2. React Native 开发豆瓣评分(五)屏幕适配方案

    前言 React Native 是以实际像素 dp 为单位的,这导致在不同分辨率的屏幕会有不一样的显示情况. 在原生 Android 中,可以根据不同的分辨率添加不同的样式目录,以解决不同分辨率的问题 ...

  3. React Native 开发豆瓣评分(一)环境搭建&配置模拟器

    详细可参考 官方文档,这里进记录一些重要过程. 安装环境 下载 Android Studio 选择 Custom 进行安装: Android SDK Android SDK Platform Perf ...

  4. React Native 开发豆瓣评分(四)集中管理 fetch 数据请求

    豆瓣评分的API接口 接口是从网上查找的,看样子应该是微信小程序里面扣出来的(ua 里面有 wechatdevtools) 接口都需要设置apiKey(054022eaeae0b00e0fc068c0 ...

  5. React Native 开发豆瓣评分(七)首页组件开发

    首页内容拆分 看效果图,首页由热门影院.豆瓣热门.热门影视等列表组成,每个列表又由头加横向滑动的 电影海报列表构成. 所以可以先把页面的电影海报.评分.列表头做成组件,然后在使用 ScrollView ...

  6. React Native 开发豆瓣评分(二)路由配置

    路由管理使用官方推荐的 React Navigation; 配置环境 安装相关依赖 yarn add react-navigation react-native-gesture-handler Lin ...

  7. React Native 开发豆瓣评分(六)添加字体图标

    添加依赖 yarn add react-native-vector-icons Link 依赖 react-native link react-native-vector-icons 使用默认字体图标 ...

  8. React Native开发技术周报2

    (1).资讯 1.React Native 0.22_rc版本发布 添加了热自动重载功能 (2).技术文章 1.用 React Native 设计的第一个 iOS 应用 我们想为用户设计一款移动端的应 ...

  9. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

随机推荐

  1. Xamarin图表开发基础教程(4)OxyPlot框架

    Xamarin图表开发基础教程(4)OxyPlot框架 XamaminAndroid中绘制线图OxyPlotAndroidDemo [示例1-1:OxyPlotAndroidDemo]下面实现线图的绘 ...

  2. [转]vscode 插件推荐 - 献给所有前端工程师(2019.8.7更新)

    原文地址:https://segmentfault.com/a/1190000006697219 VScode现在已经越来越完善.性能远超Atom和webstorm,你有什么理由不用它?在这里,我会给 ...

  3. Android 多用户

    下面几篇介绍的不错,推荐看看 https://www.jianshu.com/p/3ad2163f7d34   Android 9.x 多用户机制 1 #Profile user创建过程 https: ...

  4. 同时购入两台同款thinkpad笔记本电脑,分别使用同一账户激活office失败--------------解决方法(账户下有多个Office激活信息,重装后提示“许可证不正确或者最大激活次数”)

    如题所述,该问题曾多次与京东商城售后,京东thinkpad品牌售后,thinkpad售后等进行沟通,最后通过微软的电话激活才成功,不过在之后发现了这么一个帖子,应该是官方给出的,应该合理,没有实际验证 ...

  5. node.js使用markdown-it批量转md内容为html

    代码如下: var fs = require('fs'); var MarkdownIt = require('markdown-it'), md = new MarkdownIt(); /* pag ...

  6. python:连接Oracle数据库后控制台打印中文为??

    打印查询结果,中文显示为了??? [('72H FCR', '2.0'), ('?????', '8.0')] E:\Python35\Lib\site-packages中新增文件: sitecust ...

  7. 最新 奥买家java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.奥买家等10家互联网公司的校招Offer,因为某些自身原因最终选择了奥买家.6.7月主要是做系统复习.项目复盘.LeetCo ...

  8. Android MVP框架实现登录案例

    一.Model package com.czhappy.mvpdemo.model; /** * author: chenzheng * created on: 2019/5/16 11:06 * d ...

  9. C++全排列 next_permutation

    全排列函数  next_permutation 这是C++的STL中专门用来排列的函数(可以自动处理存在重复数据集的排列问题) 使用时要加上头文件 #include <algorithm> ...

  10. python中使用multipart/form-data请求上传文件

    最近测试的接口是上传文件的接口,上传单个文件,我主要使用了2种方法~ 接口例如: URL: http://www.baidu.com/*** method:post 参数: { "salar ...