React Native使用Redux总结

1>npm安装redux:

"react-redux": "^5.0.5",
"redux": "^3.7.1",
"redux-thunk": "^2.2.0"

2>大致结构目录如下:

3>ActionTypes.js:

在使用redux过程中,需要给每个动作添加一个actionTypes类型,可以说是标示;
// 接收数据
export const RECEIVE_BEAUTY_LIST = ‘RECEIVE_BEAUTY_LIST‘;
export const BACKIMAGE_URL = ‘BACKIMAGE_URL‘;

4>Store: 就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。

5>State:Store对象包含所有数据。如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。

当前时刻的 State,可以通过store.getState()拿到。

/**
 * 创建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 的名称。

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:

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存储数据,某个页面值改变进行值的存储,以实现不同页面都可以很轻松的取得数据.

暂时只实现和掌握了简单的使用,高级用法后面学习积累!!!??

时间: 2024-10-29 03:40:15

React Native使用Redux总结的相关文章

从零开始的Android新项目10 - React Native &amp; Redux

本篇来讲讲 React Native 和 Redux,和其他一上来就啪啪啪丢上来一堆翻译的东西不同,本文会从简单的例子入手,让大家能快速地明白 React Native 是什么,Redux 和常见的 MVC.MVP 等有什么区别,怎么去组织一个 Redux 架构的 React Native 项目. 为避免大家还没入门就放弃,预计下一篇才会从我们项目中的实践出发,讲讲更复杂的应用场景. 什么是React Native React Native 使你能够基于 JavaScript 和 React 在

学习React Native必看的几个开源项目

http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe100577336b2 本文来自:江清清的技术专栏(http://www.lcode.org) 1.前言 读项目源码是一种非常好的学习方式,现阶段React Native还在高速的发展,版本迭代速度很快,同时入门学习的教程也比较少.因此查看阅读别人写的好的开源项目就非常重要,吸取精华.那本期就来给我大家推荐几

在 React Native 中使用 Redux 架构

前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也只有一个 Store,而且只用一个 state 树来管理组件的状态.随着应用逐渐变得复杂,React 将组件看成状态机的优势仿佛变成了自身的绊脚石.因为要管理的状态将会越来越多,直到你搞不清楚某个状态在不知道什么时候,由于什么原因,发生了什么变化.Redux 试图让状态的变化变得可预测.Redux

新版React Native+Redux打造高质量上线App教程百度云

原文配套资源获取链接:点击获取 本课程将带你解锁React Native开发应用新姿势,一网打尽React Native新版本热门技术:课程中老师会手把手带你开发并打包上线一款完整的跨平台App:让你拥有一次真正参与上线项目开发的历程,同时全面掌握React Native核心技术,让你的技术能力和项目经验都得到前所未有的提升![技术储备要求:1.具备JavaScript.ES5,ES6,React 前端基础:2.具备ReactNative技术基础(语法,环境搭建):3.了解XCode.Andro

菜鸟窝React Native 视频系列教程

菜鸟窝React Native 视频系列教程 交流QQ群:576089067 Hi,我是RichardCao,现任新美大酒店旅游事业群的Android Developer.15年加入饿了么即时配送BU,后负责蜂鸟众包Android端,期间引入react-native技术,作为国内react-native 与 Android混合开发的早期商业项目,具有一定经验,同时也是react-native开源项目reading(https://github.com/attentiveness/reading)

React Native专题-江清清

本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 关于React Native各种疑难杂症,问题深坑总结方案请点击查看: Mac和Windows安装搭建React Native环境教程如下: Mac OS X版本:Mac OS X安装R

浅谈移动应用的跨平台开发工具(Xamarin和React Native)

谈移动应用的跨平台开发不能不提HTML5,PhoneGap和Sencha等平台一直致力于使用HTML5技术来开发跨平台的移动应用,现在看来这个方向基本算是失败的,基于HTML5的移动应用在用户体验上与原生应用仍然存在着明显的差距. 与上述HTML5平台不同,Xamarin和React Native通过各自的方式来实现跨平台.Xamarin基于Mono框架将C#代码编译为原生平台代码,React Native则是在UI主线程之外运行一个JavaScript线程,两者呈现给用户的都是原生体验. 笔者

React Native在特赞的应用与实践

基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课程介绍: 课程摘要: APP开发技术的选型 React Native开发过程中的主要问题 异常监控.热更新与RN性能优化 距离过年还有一个月不到,产品突然提出一个需求说,咱们要不做一个IOS应用吧,快过年了,给设计师一个新礼物吧.当时我的内心其它是拒绝的,于是我面带微笑着说:“好啊,我们尽量吧...

React Native资料

React Native 环境搭建 React Native 配置和起步 Sublime Text 3 搭建 React.js 开发环境 集成 ReactNative集成到已有工程中-IOS React Native集成到现有项目(非cocoa pods) 语法 ES 6入门 ES6新特性概览 React入门教程 React中文网 React Native中文网 布局 Flex布局 Flex 布局教程:语法篇 Flex 布局教程:实例篇 混编 React Native构建本地视图组件 React