资讯专栏INFORMATION COLUMN

react-native, react-navigation, redux 学习笔记

妤锋シ / 719人阅读

摘要:的使用用户发出函数算出新的重新渲染三大原则单一数据源,利用的形式向下传播数据流决定只读,通过修改通过纯函数来修改组件状态,是描述动作的纯函数连接和基于全局的,选择我们要注入的不同的组件分开把注入,读取方法三剑客先确定一下初始状

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和redux
import { 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 earn
store

不同的组件可以 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 configStore
more 中间件 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 configStore
react-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(
        
          先赚一个亿!
          my money$:{earn.money}
          my last job:{earn.lastJob}
          

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83870.html

相关文章

  • 分享一个用react-native写的app,适合新手学习react-native

    摘要:安卓系统的信息系统的信息项目部分截图项目源代码公共组件首页所有图片登录页我的页新闻页配置省市区文件进入轮播页项目入口文件项目依赖配置最新生成的文件信息上次打包的版本路由配置文件 github地址:https://github.com/cryingbat/... react-native-app use react-native。Pack of the generated apk ins...

    李涛 评论0 收藏0
  • 从 1 到完美,用 js 和 react-native 写一个 APP

    摘要:从到完美,用和写一个在年开源了后,紧接着在年就又开源了,就此打开了用和前端技术写原生之路。对应来看,程序只有两个部分,和,而部分则分为组件和。所以,在端的纯库无在中同样适用,如等。应用实例便是使用开发的一个日记。 从 1 到完美,用 js 和 react-native 写一个 APP facebook 在 2013 年开源了 react 后,紧接着在 2015 年就又开源了 react...

    CollinPeng 评论0 收藏0
  • 和我一起入坑-React-Native-加入Redux的TodoList

    摘要:之前写了一篇没有加入的的小博文。一拆分结构根据自己的习惯和固定套路,拆分目录结构和组件结构。把的导航组件集中放在纯粹是个人习惯。二代码实现入口文件是用来做的数据持久化。添加事项后要通知其他组件更新数据。 读前须知 这个项目是第一次使用Redux的实例,并不具有专业性的理论知识。纯粹分享一次开发过程与心得。之前写了一篇没有加入Redux的React Native ToDoList的小博文...

    LucasTwilight 评论0 收藏0
  • 如何使用ReactNative快速开发一个APP

    摘要:鉴于我平常使用的是系统,就决定我只开发安卓客户端,客户端我们又招了一个小伙伴。一般来讲,安卓系统是这一两年市面上常用机型配置的系统。 从去年的10月份开始,我的大部分工作重心从传统的前端开发转向了使用ReactNative开发APP,在这个过程当中,走过了不少弯路,也遇到了一些技术相关的问题,但总算没有辜负那些对我信任的人。经历过痛苦和无助,终于坚持了下来,一个月的时间把产品成功部署上...

    taowen 评论0 收藏0
  • React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台

    摘要:比如安卓平台在中不能触屏手动滚动。主要的功能界面模块大部分主要是展示的,网易云的页面和功能实在是太多了,由于时间关系,并没有把所有的功能都做完整,后续会陆续加上其他的功能。各部分模块首页展示音乐播放,包括动画,歌词同步等。 React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台。 GitHub 完整源码地址https://github.com/yezihaohao...

    妤锋シ 评论0 收藏0

发表评论

0条评论

妤锋シ

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<