背景: 在react中使用redux

重点:不要滥用redux,如果你的页面非常简单,没有 那么多的互动,那么就不要使用redux,反而会增加项目的复杂性。

如果你有以下情况,则可以考虑使用redux:

  • 某个组件的状态,需要共享
  • 某个状态需要在任何地方都可以拿到
  • 一个组件需要改变全局状态
  • 一个组件需要改变另一个组件的状态

store 一个保存数据的容器,只能有一个store。

redux提供 createStore 可以生成store。

// store/index.js

import { createStore, applyMiddleware, compose } from 'redux'
import logger from 'redux-logger'
import reducers from '../reducers/index' const middlewares = []
middlewares.push(logger) const store = createStore( // 将reducer传入,就可以自动调用reducer了
reducers,
compose(
applyMiddleware(...middlewares)
)
) export default store

action 是一个对象{type: string, data: someData}。

发布一个action,只有store.dispatch()一个方法,联合起来就是这样:

import store from '../store/index'

store.dispatch({
type: 'ADD_TODO',
payload: 'Learn Redux'
});

实际使用例子:

// 把上面创建的store引进了,需要使用store.dispatch
import store from '../store/index' export const CHANGE_DATABASE = 'CHANGE_DATABASE'
export const DATA_BASE = 'DATA_BASE' /**
* 如果有需要异步请求数据的,也可以放在这里, 比如第三个fetchfavoritesTable方法
*/ export const changeDataBase = (data) => {
const dispatch = store.dispatch
dispatch({ type: CHANGE_DATABASE, data: data })
} export const saveDataBase = (data) => {
store.dispatch({ type: DATA_BASE, data: data })
}
export const fetchFavoritesTable = (pageSize, current) => {
const dispatch = store.dispatch
return get(adhocFetchUrl.favorites_get, {
page: current,
pageSize
})
.then((res) => {
if (res.status === 200) {
const result = res.data
const data = []
for (let i = 0, length = result.length; i < length; i++) {
data.push({
key: i,
id: result[i].id,
content: result[i].content,
createTime: result[i].createTime,
name: result[i].name
})
}
const finialData = {
data: data,
total: res.pageCount
}
dispatch({ type: FAVORITES_DATA, data: finialData })
} else {
console.warn('请求搜索历史error:', res)
}
})
}

reducer   store收到一个action后,必须给出一个新的state,这样view才会变化,这个计算过程,叫做reducer

reducer是一个函数,接受action和当前state为参数:

const reducer = function (state, action) {
// ...
return new_state;
};

dispatch一个action之后,会自动触发reducer,那么这个前提就是需要在creatStore时候,讲reducer作为参数传入。

拆分reducer:

// 这是其中一个reducer文件: a.js
export default (state = init, actions) => {
const {
type,
data
} = actions
switch (type) {
case CHANGE_DATABASE:
return { ...state, database: data }
case CHANGE_TABLE_ID:
return { ...state, tableId: data }default:
return state
}
}

合并reducer 使用redux提供的combineReducers

import { combineReducers } from 'redux'
import home from './a'
import other from './b' export default combineReducers({
home,
other
})

这样就可以做到,一个模块对应一个reducer 和一个action文件

目录如下图:

redux 入门的更多相关文章

  1. Redux 入门到高级教程

    Redux 是 JavaScript 状态容器,提供可预测化的状态管理. (如果你需要一个 WordPress 框架,请查看 Redux Framework.) Redux 除了和 React 一起用 ...

  2. Redux 入门教程

    Redux 入门教程(三):React-Redux 的用法(53@2016.09.21) Redux 入门教程(二):中间件与异步操作(32@2016.09.20) Redux 入门教程(一):基本用 ...

  3. Redux入门

    Redux入门 本文转载自:众成翻译 译者:miaoYu 链接:http://www.zcfy.cc/article/4728 原文:https://bumbu.github.io/simple-re ...

  4. redux入门指南

    前言:大概一个月没有写博客了,这两天正好是周末,就写点东西来梳理下之前几个月的所写与所得; 大概两个月前,学习了一下 redux ,还是一点难度的,花了我一天的时间来搞明白他, 但是都没怎么记录,今天 ...

  5. [转] Redux入门教程(快速上手)

    学习前提 在我们开始以前,确保你熟悉以下知识: 函数式JavaScript 面向对象JavaScript JavaScript ES6 语法 同时,确保你的设备已经安装: NodeJS Yarn(或者 ...

  6. Redux 入门教程(三):React-Redux 的用法

    为了方便使用,Redux 的作者封装了一个 React 专用的库 React-Redux,本文主要介绍它. 这个库是可以选用的.实际项目中,你应该权衡一下,是直接使用 Redux,还是使用 React ...

  7. Redux 入门教程(二):中间件与异步操作

    上一篇文章,介绍了 Redux 的基本做法:用户发出 Action,Reducer 函数算出新的 State,View 重新渲染. 但是,一个关键问题没有解决:异步操作怎么办?Action 发出以后, ...

  8. Redux入门学习

    一.Redux三大原则 1. 单一数据源 应用中所有的state都以一个对象树的形式储存在一个单一的store中. 2. state只读 唯一改变state的办法是触发action.action是一个 ...

  9. Redux 入门教程(一):基本用法

    转自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html(仅供个人学习使用) 首先明确一点, ...

随机推荐

  1. 【洛谷3865】 【模板】ST表(猫树)

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里

  2. ECDSA数字签名算法

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  3. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  4. 开源网盘云存储 Seafile

    摘要: Seafile 是一款安全.高性能的开源网盘(云存储)软件.Seafile 提供了主流网盘(云盘)产品所具有的功能,包括文件同步.文件共享等.在此基础上,Seafile 还提供了高级的安全保护 ...

  5. Go语言map

    map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典.这是一种快速寻找值的理想结构:给定 k ...

  6. Kali学习笔记24:Nikto、Skipfish

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 实验环境: Kali机器IP:192.168.163. ...

  7. Hashtable 为什么不叫 HashTable?

    前几天在写<HashMap 和 Hashtable 的 6 个区别>这篇文章的时候,差点把 Hashtable 写成了 HashTable,后来看源码证实了是:Hashtable,小写的 ...

  8. 史上最全阿里 Java 面试题总结

    以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么 ...

  9. java开发面试问题

    Java面试题:java的垮平台原理 为什么要跨平台使用????? 其实说白了就是个操作系统支持的指令集是不一样的.我们的程序需要再不同的操作系统上运行这些代码. 但是不要说jvm是跨平台的,而真正跨 ...

  10. 聊聊JVM(二)说说GC的一些常见概念

    转自CSDN 上一篇总结GC的基础算法,各种GC收集器的基本原理,还是比较粗粒度的概念.这篇会整理一些GC的常见概念,理解了这些概念,相信对GC有更加深入的理解 1. 什么时候会触发Minor GC? ...