背景: 在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. Android WebView 加载超长 JS 数据

    在之前的文章里面,我总结过WebView如何与网页交互,也就是Java如何和JS交互 —— Android WebView 总结 —— Java和JavaScript交互. 基于这篇文章,我们基本上能 ...

  2. Java定时任务解决方案

    很多项目中都会遇到需要定时任务的情况,本篇文章就结合了Spring中以及SpringBoot.SpringCloud中定时任务的解决方案. 在Spring中使用定时器 用SpringBoot比较多的同 ...

  3. ScrollView嵌套子View的getDrawingCache为空的解决方法

    ScrollView嵌套子View的getDrawingCache为空的解决方法 问题 将组件的显示布局改为可以滚动的,然后用ScrollView作为了View的父类,发现View的getDrawin ...

  4. [Swift]扩展String类:Base64的编码和解码

    扩展方式1: extension String { //Base64编码 func encodBase64() -> String? { if let data = self.data(usin ...

  5. Dockerfile常用指令

    FROM 构建的新镜像基于那个镜像 , FROM ubuntu:14 MAINTAINER 镜像维护者姓名或邮箱地址 RUN CMD EXPOSE  声明容器运行服务的端口 ENV ADD  拷贝文件 ...

  6. 【MySQL】percona-toolkit工具包

    [说明] percona-toolkit工具包同percona-xtrabackup一样都是用Perl写的工具包,percona-toolkit工具包是一组高级的管理mysql的工具包集,可以用来执行 ...

  7. 【Spark调优】大表join大表,少数key导致数据倾斜解决方案

    [使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一 ...

  8. ubuntu中环境变量文件/etc/profile、.profile、.bashrc、/etc/bash.bashrc之间的区别和联系

    一 /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.所以如果你有对/etc/pr ...

  9. ASP.NET Core微服务+Tabler前端框架搭建个人博客2--系统架构

    功能分析 在整个微服务架构的搭建过程中,我们需要做的第一步就是对服务进行拆分,将一个完整的系统模块化,通过对各个模块互联,共同完成一个系统的工作.既然要做到模块化,那么必须明白你的系统的需求到底是什么 ...

  10. 使用freemarker生成xml模板

    今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...