react-redux的基本用法
注意:读懂本文需要具备redux基础知识,
注明:本文旨在说明如何在实际项目中快速使用react-redux,限于篇幅,本文对具体的原理并未做分析,请参考redux官网
我一直以为我写了一篇关于react-redux的文章,昨天在翻我的博客时才发现没有。
前几天写了vue的状态管理 vuex,Vue中的状态管理器 - Vuex,讲了vue中状态管理的用法,整体感觉是很简单的,
状态和路由都是官方自己整合的,不管是文档还是用来都比较顺滑,而redux的门槛要比vuex高不少。
题外话:为什么vue这么好用你还要搞react呢,我的感觉是,vue就像qq,react就像facebook,虽然都可以社交,但是味道不一样,各有所好,
另外react-native可以做app目前vue不能,如果外包我选择vue(快),要做一个长期的网站我会用react。
说了一大堆,开始正文:
前面我写了一篇文章:快速搭建一个vue开发环境,用到了vue官方的脚手架,同样,react官方也有一个,类似功能的:create-react-app。
补充一点额外常识:vue中路由和状态管理都是官方整合的,属于官方库,而在react中,只有react! 路由和状态管理由第三方库提供。
全局安装 create-react-app
npm install -g create-react-app
创建一个 test的项目
create-react-app test
通过这句话搭建的环境已经可以正常跑起来了,集成了webpack,和热加载,更之前vue搭建那个环境一样,不过没有路由和状态管理,
这一篇我只讲react+状态管理,路由以后单独写,或者可能不用写了,路由是很简单的,看一下就知道怎么用。
在项目目录下执行 npm run start 项目就跑起来了,尝试修改一下 src/App.js,页面辉自动重新加载。
安装redux
#说明:redux是一个通用状态管理库,可以用于任何现代化框架,比如vue,react,angular等,不局限于react,都可以直接使用redux。
在react中, 你除了可以直接使用redux外,redux针对react推出了react-redux绑定,使用起来更规范和顺滑。
本文要讲解的是 react-redux的用法,并假设你已经有了redux的基础概念。
npm install redux react-redux redux-thunk --save
// redux是核心,react-redux是react的绑定,redux-thunk是异步中间件
现在假设我们网页上有三个数据需要让redux来管理,分别是 用户的信息name,sex和系统的背景颜色bgcolor。
在src下新建actions目录,在目录下面新建userAction.js文件,
在src下新建reducers目录,userReducer.js,rootReducer.js两个文件,
在src下新建store.js 文件
整个流程是这样的, view层获取store中的数据渲染页面,当在view中需要变更store中的数据的时候,就发送一个action过去,接收这个action的不是
store,而是reducer,reducer更改数据后更新state,在这个更新过程中会触发view层的渲染逻辑,然后view层重新渲染。
在一个页面中会有很多操作要更改store中的数据,每一个操作就对应一个action。
userAction.js 代码:
export const nameAction = (name) =>{
return {
type: 'name',
payload: name
}
} export const sexAction = () =>(dispatch)=>{
setTimeout(()=>{
dispatch({
type: 'sex',
payload: '男'
})
},2000)
}
第一个action是用来更改名字的,第二个action是用来更改性别的,这两个action看起来有差异,第一个action返回一个对象,而第二个action
是一个高阶函数,返回了一个函数。
第一个action是普通的操作,发送这个action后store中的数据立马就会更新,而第二个action是用来处理异步数据的,可以把这个地方的setTimeout替换成一个
网络请求,比如我发送了一个更新资料的action,但是这个更新要从服务器动态获取,那么就只能用第二种方式,用第二种方式的前提是加载了thunk中间件,否则第二种方式会报错。
userReducer.js 代码:
let init = {
'name': '张三',
'sex': '女'
}
export default (state=init,action)=>{
switch(action.type) {
case 'name':
state.name = action.payload
return {...state}
case 'sex':
state.sex= action.payload
return {...state}
// 在没有匹配的情况下一定要返回旧的state
default:
return state
}
}
reducer是纯函数,第一个参数是当前state,第二个参数是接收的action,reducer通过action的type来判断要处理的逻辑,
注意,reducer一定要返回新的state才能触发view重新渲染,所以这里返回的 {...state} 就是一个新对象,最后如果没有匹配到
对应action,就返回旧的state。
rootReducer 代码:
import {combineReducers} from 'redux'
// import systemReducer from './systemReducer'
import userReducer from './userReducer' // 包含所有的计算函数
export default combineReducers({
// system: systemReducer,
user: userReducer
})
前面一个reducer是处理用户板块action的,一个网站有很多板块,比如系统设置,如果把所有的处理都放到一个reducer中,那么这个函数会非常庞大,
所以在文件组织上我们把 reducer按照类型拆分成多个reducer,最后用redux提供的combineReducer函数进行合并,rootReducer就是干这事的
store.js 代码:
import {createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers/rootReducer' export default function configureStore() {
return createStore(
rootReducer,
applyMiddleware(thunk)
)
}
这段代码是配置store的,通过createStore函数来创建一个store,第一个参数是 reducer,第二个参数是加载中间件,这个地方加载了thunk中间件,是redux官方提供的,
专门用来处理异步action,上面的userAction中设置sex时旧采用了异步的方式。
index.js 代码:
import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux';
import configureStore from './store';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker'; ReactDOM.render(
<Provider store={configureStore()}>
<App />
</Provider>,
document.getElementById('root')); serviceWorker.unregister();
前面已经搞定了action,reducer,store,这个文件就是应用redux道项目中,主要关注 Provider和 store两个地方,Provider时redux提供给react的包装器,
store属性用来注入状态管理。这个地方就不解释内部原理了,只要知道这么用就行。
App.js 代码:
import React, { Component } from 'react';
import {connect} from 'react-redux';
import {nameAction,sexAction} from './actions/userAction';
// import {bgcolorAction} from './actions/systemAction';
// import logo from './logo.svg';
import './App.css'; class App extends Component { componentDidMount() {}
render() {
return (
<div className="App" >
<header className="App-header" >
{/* <p style={{color:this.props.system.backgroundColor}}> */}
<p>
name:{this.props.user.name} <br/>
sex:{this.props.user.sex} <br/>
</p>
<button onClick={()=>this.props.name('利萨')}>更改名字</button>
<button onClick={()=>this.props.sex()}>更改性别</button>
{/* <button onClick={()=>this.props.bgcolor()}>更改颜色</button> */}
<pre>
{ JSON.stringify(this.props) }
</pre>
</header>
</div>
);
}
} const mapStateToProps = state => ({
...state
})
const mapDispatchToProps = dispatch=>({
name: (name)=>dispatch(nameAction(name)),
sex: ()=>dispatch(sexAction())
// bgcolor: ()=>dispatch(bgcolorAction())
}) export default connect(mapStateToProps,mapDispatchToProps)(App);
这个地方关注 connect,mapStateToProps,mapDispatchToProps,
connect是redux提供的连接器,任何要使用redux这一套的view就必须使用connect连接,mapStateToProps是将store中的数据复制到
本view的props中,而且是实时同步的,
mapDispatchToProps 是将actioni复制到本view的props中,让view拥有发送action的机会。
react-redux的基本用法的更多相关文章
- react+redux教程(八)连接数据库的redux程序
前面所有的教程都是解读官方的示例代码,是时候我们自己写个连接数据库的redux程序了! 例子 这个例子代码,是我自己写的程序,一个非常简单的todo,但是包含了redux插件的用法,中间件的用法,连接 ...
- react+redux教程(四)undo、devtools、router
上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...
- react+redux教程(三)reduce()、filter()、map()、some()、every()、...展开属性
reduce().filter().map().some().every()....展开属性 这些概念属于es5.es6中的语法,跟react+redux并没有什么联系,我们直接在https:// ...
- react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware
今天,我们通过解读官方示例代码(counter)的方式来学习react+redux. 例子 这个例子是官方的例子,计数器程序.前两个按钮是加减,第三个是如果当前数字是奇数则加一,第四个按钮是异步加一( ...
- 实例讲解基于 React+Redux 的前端开发流程
原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...
- Immutable.js 以及在 react+redux 项目中的实践
来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...
- react + redux 实现幻灯片
写在前面: 这一篇是我 使用scss + react + webpack + es6实现幻灯片 的进阶篇,效果请点我,将会使用上redux的基础用法,因为一开始没有理解好redux的用法,单纯看文档, ...
- 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用
先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- react+redux教程(六)redux服务端渲染流程
今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...
随机推荐
- 简易调色盘控件 for .NET(EN)
By Conmajia Originally posted in 2012 Introduction Simple & fast implementation of a rectangular ...
- 树莓派linux系统中显示隐藏文件的几种方法
一.如果直接使用可视化文件管理器 1.直接点击右键,直接选择“显示隐藏文件”选项. 2.快捷键 CTRL + H 二.在终端命令行模式下 可以使用ls命令的-a参数来显示隐藏的文件及文件夹. ls - ...
- 简简单单的Vue4(vue-cie@3.x,vue’Debug[调试],vue‘sHttp)
既然选择了远方,便只顾风雨兼程! __HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 vue-cli@3.x 创建项目 Vue的Debug(调试) Vue的Http请求 提 ...
- 《全栈营销之如何制作个人博客》之一:用什么开发语言和CMS系统
现在的互联网,已经不再是初级互联时代,是需要全方位营销,自建粉丝池的时代,云码素材从提出全栈营销,到实践分析,总结出全栈营销第一步,先制作一个个人博客是最好的开始.今天开始就跟我一起学习如何制作一个精 ...
- 小程序应用的Python服务器部署高配,依然是腾讯云秒杀阿里云!
上一篇文章,“小程序创业最低配置部署,腾讯云折扣秒杀阿里云!”介绍了小程序项目启动时的最低配置服务器选择,但当项目良好发展时,还是要把服务器配置调整到标准水平,承受住日益增长的流量访问. 随着Pyth ...
- 如何创建ChromeApp
一个ChromeAPP 包含以下内容: 1. 清单文件 manifest.json,列出应用的一些基本信息例如:如何启动应用,应用的权限等等. 2. 事件处理页面也就是我们常说的后台脚本(backgr ...
- about-php
鉴于本人收集的php资料多,感觉查询起来不怎么方便.特意在github上建立了一个分支:about-php 主要是介绍围绕php的相关资料,包括php入门知识,php框架,开发工具,php项目,php ...
- php中curl返回false的解决办法
本文介绍一下自己在使用curl中遇到的问题解决办法.希望可以帮助到大家. 原文地址:代码汇个人博客 http://www.codehui.net/info/37.html 首先来看一个封装的curl函 ...
- 【html】使用img标签和背景图片之间的区别
1.加载问题 背景图片会等到html结构加载完成才开始加载 img标签是网页结构的一部分,会在html结构加载的时候加载 在网页加载的过程中,背景图片会等到结构加载完成(网页的内容全部显示以后)才开始 ...
- Elasticsearch 通关教程(七): Elasticsearch 的性能优化
硬件选择 Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch. ...