本文介绍redux的使用

  1. 安装

    1. cnpm install redux --save
    2. cnpm install react-redux --save
    3. cnpm install redux-devtools --save-dev
    4. 如果你之前使用过vuex,我相信redux对于你来说就是易如反掌
    5. redux官网将的很杂很乱,但是实用的东西就那么点
  2. action

    1. action就是一个对象,用来描述你要修改store状态树中的数据
    2. {
    3. type: 'change_name',
    4. name: 'yejiawei'
    5. }
    6. type字段必须要有,这是约定
  3. action创建函数

    1. 正常情况下,你需要给每一个action定义一个函数,从而方便调用
    2. export function changeName (value) {
    3. return {
    4. type: 'change_name',
    5. name: value
    6. }
    7. }
  4. Reducer

    1. Reducer的作用,就是将不同的action汇总,然后返回相应的state
    2. const initialState = {
    3. name: 'haha'
    4. }
    5. function firstDemo (state = initialState, action) {
    6. switch (action.type) {
    7. case "change_name":
    8. return Object.assign({},state,{
    9. name: action.name
    10. })
    11. default:
    12. return state
    13. }
    14. }
    15. 返回值必须是全新的
  5. 拆分reducer

    1. 实际开发中都是模块化的,有必要将不同模块的reducer分开
    2. import { combineReducers } from 'redux'
    3. combineReducers({firstDemo,firstDemo1})
  6. store

    1. 创建store是非常简单的
    2. import { createStore } from 'redux'
    3. 将上面创建的reducer当做参数传递即可
    4. let store = createStore(firstDemo)
    5. store.getState() // 获取store中的数据
    6. let unsubscribe = store.subscribe( () => {
    7. ...
    8. } ) // 监听器
    9. store.dispatch(changeName('yejiawei')) // 调用action修改store中的state
    10. unsubscribe() // 注销监听器
  7. 在react组件中使用redux

    1. 下面我将列出,正常项目开发的结构
    2. index.js
    3. import React from 'react'
    4. import ReactDOM from 'react-dom'
    5. import { Provider } from 'react-redux'
    6. import store from './store.js'
    7. import App from './app.js'
    8. ReactDOM.render(
    9. <Provider store={store}>
    10. <App />
    11. </Provider>,
    12. document.getElementById('root')
    13. )
    14. 使用 Provider 组件传递storereact组件中
    15. app.js
    16. import React from 'react'
    17. import MyComponent1 from './component1.js'
    18. import { connect } from 'react-redux'
    19. class MyComponent extends React.Component {
    20. render () {
    21. return (
    22. <div>
    23. <MyComponent1 {...this.props}></MyComponent1>
    24. </div>
    25. )
    26. }
    27. }
    28. function appWant(state) {
    29. return state
    30. }
    31. export default connect(appWant)(MyComponent)
    32. 使用connect方法将react组件连接到redux中,接受一个回调函数,并且回调函数的参数就是store中的state
    33. ** 原则,使用connect方法尽量只在容器组件中使用,其余的子组件如果也想访问store,就通过props传递即可
    34. store.js
    35. import { createStore } from 'redux'
    36. const initialState = {
    37. message: 'yejiawei'
    38. }
    39. function firstApp (state = initialState, action) {
    40. switch (action.type) {
    41. case "change_message":
    42. return Object.assign({},state,{
    43. message: action.message
    44. })
    45. default:
    46. return state
    47. }
    48. }
    49. let store = createStore(firstApp);
    50. export default store
    51. 此文件专门用来管理和生成store的,同时还可以将reducer专门再生成一个reducer.js管理
    52. component1.js
    53. 此组件代表类似的子组件
    54. import React from 'react'
    55. import { delayData } from './actions.js'
    56. class MyComponent extends React.Component {
    57. componentDidMount() {
    58. this.props.dispatch(changeMessage('我改变了'))
    59. }
    60. render() {
    61. return (
    62. <div style={{"height": "200px","width": "200px","background": "red","position": "absolute","top": "100px", "left": 0}}>我是组件一{this.props.message}</div>
    63. )
    64. }
    65. }
    66. export default MyComponent
    67. 在子组件中访问store中的statedispatch通过props直接访问即可
    68. actions.js
    69. 此文件专门用来处理redux中的action生成函数
    70. export function changeMessage (text) {
    71. return {
    72. type: 'change_message',
    73. message: text
    74. }
    75. }
  8. 在react组件中使用redux补充

    1. 上面讲到的connect方法,还可以传递其他参数
    2. 注意到我们传递给connect方法的参数是如下的这个函数
    3. function appWant(state) {
    4. return state
    5. }
    6. 这个函数会在state改变的时候更新整个app组件,也就是说不管你在哪里dispatch了,那么整个app都会重新更新,性能损失
    7. 所以可以选择只传递一部分state,如下
    8. function appWant(state,ownProps) {
    9. return {
    10. age: state.age
    11. }
    12. }
    13. 然后在其他的组件中也调用connect方法,管理自己的state,而不是只通过props传递,这样可以提高性能
    14. 另外也可以把action单独传递或者传递一部分,我不建议这样做,对性能没有任何提高,反而提升代码复杂度,直接使用dispatch简单清晰明了
    15. app.js文件中改成如下代码
    16. import React from 'react'
    17. import MyComponent1 from './component1.js'
    18. import { connect } from 'react-redux'
    19. import { bindActionCreators } from 'redux';
    20. import { delayData } from './actions.js'
    21. class MyComponent extends React.Component {
    22. render () {
    23. return (
    24. <div>
    25. <MyComponent1 {...this.props}></MyComponent1>
    26. </div>
    27. )
    28. }
    29. }
    30. function appWant(state) {
    31. return {
    32. age: state.age
    33. }
    34. }
    35. function funcWant(dispatch) {
    36. return {
    37. demo: bindActionCreators({delayData},dispatch)
    38. }
    39. }
    40. export default connect(appWant,funcWant)(MyComponent)
    41. 然后再component1.js中,就不需要通过dispatch调用了
    42. this.props.demo.delayData('我又变了');
  9. 异步action

    1. 上面讲的内容是同步的,也就是说dispatch方法调用后,store中的state立即发生改变
    2. 那么,现在有一个需求是,dispatch的写法不发生任何改变,还可以进行异步操作
    3. 如何操作?只需要将action返回一个函数,然后在函数里面进行异步处理就完事儿了
    4. 要实现这个操作就要借助 redux-thunk-middleware 中间件
    5. 安装 cnpm install --save redux-thunk
    6. 然后将上面的store.js文件改成下面的
    7. import { createStore, applyMiddleware } from 'redux' // 导入applyMiddleware方法用来使用中间件
    8. import thunkMiddleware from 'redux-thunk' // 导入中间件
    9. const initialState = {
    10. message: 'yejiawei'
    11. }
    12. function firstApp (state = initialState, action) {
    13. switch (action.type) {
    14. case "change_message":
    15. return Object.assign({},state,{
    16. message: action.message
    17. })
    18. default:
    19. return state
    20. }
    21. }
    22. let store = createStore(firstApp,applyMiddleware(thunkMiddleware)); // 将中间件应用于store中
    23. export default store
    24. 然后再actions.js中添加一个异步action
    25. export function delayData (value) {
    26. return (dispatch) => {
    27. setTimeout( () => {
    28. dispatch(changeMessage(value))
    29. },1000 )
    30. }
    31. }
    32. 最后,直接在component1.js文件中直接调用即可
    33. import React from 'react'
    34. import { delayData } from './actions.js'
    35. class MyComponent extends React.Component {
    36. componentDidMount() {
    37. this.props.dispatch(delayData('我改变了'))
    38. }
    39. render() {
    40. return (
    41. <div style={{"height": "200px","width": "200px","background": "red","position": "absolute","top": "100px", "left": 0}}>我是组件一{this.props.message}</div>
    42. )
    43. }
    44. }
    45. export default MyComponent
  10. 异步action的补充一

    1. 上面在定义异步action时,在返回的函数里面传递了dispatch参数,其实它还支持如下的参数
    2. 还是借助上面的例子
    3. 传递getState获取store中的state
    4. export function delayData (value) {
    5. return (dispatch,getState) => {
    6. setTimeout( () => {
    7. dispatch(changeMessage(value))
    8. console.log(getState())
    9. },1000 )
    10. }
    11. }
    12. 传递自定义参数
    13. store中将创建store的代码改成
    14. let store = createStore(firstApp,applyMiddleware(thunkMiddleware.withExtraArgument( {a: 'aaa', b: 'bbb'} )));
    15. 然后再actions.js中获取参数
    16. export function delayData (value) {
    17. return (dispatch, getState, {a,b}) => {
    18. setTimeout( () => {
    19. dispatch(changeMessage(value))
    20. console.log(a,b)
    21. console.log(getState())
    22. },1000 )
    23. }
    24. }

redux使用教程详细介绍的更多相关文章

  1. mongodb 3.0下载安装、配置及mongodb最新特性、基本命令教程详细介绍

    mongoDB简介(本文由www.169it.com搜集整理) MongoDB是一个高性能,开源,无模式的文档型数据库,是目前在IT行业非常流行的一种非关系型数据库(NoSql).它在许多场景下可用于 ...

  2. 【WiFi密码破解详细图文教程】ZOL仅此一份 详细介绍从CDlinux U盘启动到设置扫描破解-破解软件论坛-ZOL中关村在线

    body { font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-ser ...

  3. Linux截屏工具scrot用法详细介绍

    Scrot是Linux命令行中使用的截图工具,能够进行全屏.选取等操作,下面小编将针对Scrot截图工具的用法给大家做个详细介绍,通过操作实例来学习Scrot的使用.   在Linux中安装Scrot ...

  4. 用grunt搭建自动化的web前端开发环境实战教程(详细步骤)

    用grunt搭建自动化的web前端开发环境实战教程(详细步骤) jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用!前端自动化, ...

  5. snoopy(强大的PHP采集类) 详细介绍

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单,可以用来开发一些采集程序和小偷程序,本文章详细介绍snoopy的使用教程. Snoopy的一些特点: 抓取网页的内容 fe ...

  6. WDCP是什么 关于WDCP的详细介绍

    WDCP是WDlinux Control Panel的简称,是一套用PHP开发的Linux服务器管理系统以及虚拟主机管理系统,,旨在易于使用Linux系统做为我们的网站服务器,以及平时对Linux服务 ...

  7. Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真

    Xilinx Vivado的使用详细介绍(1):创建工程.编写代码.行为仿真 Author:zhangxianhe 新建工程 打开Vivado软件,直接在欢迎界面点击Create New Projec ...

  8. vue对比其他框架详细介绍

    vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...

  9. Arduino可穿戴开发入门教程LilyPad介绍

    Arduino可穿戴开发入门教程LilyPad介绍 Arduino输出模块 LilyPad官方共提供了4种输出模块,他们分别是单色LED模块(图1.5).三色LED模块(图1.6).蜂鸣器模块(图1. ...

随机推荐

  1. DS 和【ADDRESS】学习记录

    CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址. 内存单元由2部分组成. 8086CPU中,内存地址由以下组成. 1:段地址 2:偏移地址 8086CPU中,有一个DS寄存器地址,通常用 ...

  2. BZOJ3244/UOJ122 [Noi2013]树的计数

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. review30

    数据流 DateInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流.这两个流是很有用的流,它们允许程序按着机器无关的风格读取Java原始数据.也就是说,当读 ...

  4. Microsoft MVC3 框架

             1. 安装MVC3框架 官网:http://www.asp.net/mvc 下载:ASP.NET MVC3 with Tools http://go.microsoft.com/fw ...

  5. Memcache笔记(1)

    缓存主要分为:页面缓存和数据缓存 Memcache .redis.mongodb都是做数据缓存的 Memcache是什么? 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的ha ...

  6. 解决:WebDriverException: 'chromedriver' executable needs to be in PATH

    打算学习用selenium + phantomJS爬取淘女郎页面照片. 一. 先安装lxml模块 python默认的解析器是html.parser,但lxml解析器更加强大,速度更快 1. 执行 pi ...

  7. 【Prism】MEF版HelloWorld

    引言 Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codepl ...

  8. JSP学习笔记(九十):eclipse3.4中建立控制台程序

    1.控制台程序的建立 File->New->Application Client Project,勾选上Create a default Main class 找到Main.java,修改 ...

  9. android中shape的属性

    <shape> <!– 实心 –> <solid android:color=”#ff9d77″/> <!– 渐变 –> <gradient an ...

  10. Linux U盘 启动盘

    /****************************************************************************** * Linux U盘 启动盘 * 说明: ...