通过一个计数器来了解react-redux及其用法

栏目: 服务器 · 发布时间: 5年前

内容简介:react之前在看看的时候工作过,后面到了TX就一直使用vue,react被忘得一干二净,这几天下了一个决心,想把react文档从头到尾重新看一遍,结果发现东西实在是太多了。react,redux,react-redux,react-router...该怎么破?前几天刚把redux看完,其思想大致了解了下,但是想在react中使用redux结合react-redux是最好的,看了很多文章一直不理解其用法,直到我碰到阮一峰老师写的《Redux 入门教程(三):React-Redux 的用法》才真正理解了,为

react之前在看看的时候工作过,后面到了TX就一直使用vue,react被忘得一干二净,这几天下了一个决心,想把react文档从头到尾重新看一遍,结果发现东西实在是太多了。react,redux,react-redux,react-router...该怎么破?

前几天刚把redux看完,其思想大致了解了下,但是想在react中使用redux结合react-redux是最好的,看了很多文章一直不理解其用法,直到我碰到阮一峰老师写的《Redux 入门教程(三):React-Redux 的用法》才真正理解了,为此写一篇读后感来记录一下,以备日后翻阅

老师的最后提供了一个计数器的demo来展示react-redux的用法,我也是看了这个demo之后才对react-redux的理解更近了一步

demo实现的功能很简单,就是每点击一次按钮计数器加1,整个demo的代码如下:

import React from 'react'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider, connect } from 'react-redux'

// UI组件
const Counter = props => {
  const { value, onIncreaseClick } = props
  return (
    <div>
      <span>{value}</span>
      <button onClick={onIncreaseClick}>+</button>
    </div>
  )
}

const mapStateToProps = (state, ownProps) => {
  console.log('mapStateToProps called')
  return {
    value: state.count
  }
}

const mapDispatchToProps = {
  onIncreaseClick: () => {
    return {
      type: 'increase'
    }
  }
}

// 容器组件
const VisibleCounter = connect(mapStateToProps, mapDispatchToProps)(Counter)

// reducer
const reducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'increase':
      return { count: state.count + 1 }
    default:
      return state
  }
}

// store
const store = createStore(reducer)

ReactDOM.render(
  <Provider store={store}>
    <VisibleCounter />
  </Provider>, document.getElementById('root'))
复制代码

下面我们结合react-redux中的概念来具体讲解下

展示组件(UI组件)

react-redux是基于展示组件和容器组件的开发思想,这一点必须明确。

展示组件也叫UI组件,你也可以把它理解为react中的无状态组件,它有以下特征:

  • 无状态,使用this.props
  • 不使用任何redux的API
  • 不带有任何业务逻辑

就像上面的Counter组件就是一个展示组件,它只做展示数据,涉及到的任何业务逻辑都是通过它上层的容器组件实现的

容器组件

容器组件是对对展示组件的包装,有以下特征:

  • 负责管理数据和业务逻辑,不负责UI的展现
  • 带有内部状态state
  • 使用redux的API

总之,记住这个原则就可以了,展示组件负责UI 的呈现,容器组件负责管理数据和逻辑

connect

react-redux提供的connect方法用于从UI组件生成容器组件,像下面这样

const VisibleCounter = connect(mapStateToProps, mapDispatchToProps)(Counter)
复制代码

mapStateToProps负责输入逻辑,将state映射到UI组件的参数(props)

mapDispatchToProps负责输出逻辑,将用户对UI组件的操作映射成Action

mapStateToProps

一个函数,建立一个从外部state对象到UI组件props对象的映射关系

mapStateToProps执行后返回一个对象

const mapStateToProps = (state, ownProps) => {
  return {
    value: state.count
  }
}
复制代码

mapStateToProps有两个参数,第一个是state,第二个是当前的props

每当state更新的时候,mapStateToProps会自动执行,计算出UI组件的props,从而触发UI组件的重新渲染

mapDispatchToProps

mapDispatchToProps用来建立UI组件的props到dispatch方法的映射,它定义了用户的哪些操作会生成action,传给store,它可以是一个函数或者一个对象

当它是一个函数,有两个参数,第一个是dispatch,第二个是当前props

const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        onIncreaseClick: () => {
            dispatch({ type: 'increase' })
        }
    }
}
复制代码

当它是一个对象

const mapDispatchToProps = {
    onIncreaseClick: () => {
        return {
            type: 'increase'
        }
    }
}
复制代码

从以上两种类型可以知道,当mapDispatchToProps是函数时,应该返回一个对象,键值对应UI组件触发某个事件的回调函数名,键值是一个函数,里面调用dispatch来发出一个action

当mapDispatchToProps是一个对象时,键值对应UI组件触发某个事件的回调函数名,键值是一个函数(Action Creator),返回一个action,该action会由react-redux自动调用dispatch

Provider

方便我们的每个子组件拿到state对象,不然一级一级传递state组件会非常麻烦,它的使用方法和一般的组件使用方法一样,它有一个store属性,而我们的store是调用redux提供的createStore方法生成的

// reducer
const reducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'increase':
      return { count: state.count + 1 }
    default:
      return state
  }
}

// store
const store = createStore(reducer)

ReactDOM.render(
  <Provider store={store}>
    <VisibleCounter />
  </Provider>, document.getElementById('root'))
复制代码

关于Provider组件实现的原理是通过React组件的context属性,后面我会专门开一篇文章讲解Context,到此通过一个简单的demo讲解了react-redux的使用


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

在线

在线

王坚 / 中信出版集团股份有限公司 / 2016-9-1 / CNY 58.00

互联网成为基础设施,数据成为生产资料,计算成为公共服务。 移动互联网带来的真正影响,是人们的大部分时间都消耗在在线社会上了。 50多万年前的关键词是光明与黑暗,50多年前的关键词是数字和模拟,而今天的关键词是在线与离线。 移动互联网是比传统互联网在线程度更深的互联网。手机操作系统一旦做到了在线就会带来绝佳的用户体验。苹果手机不仅淘汰了传统手机,而且带来了一个新的时代。 对于......一起来看看 《在线》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具