React-Redux核心原理与容器组件实战

  • ‌Redux‌:纯JavaScript状态管理库,不绑定任何UI框架,可在React、Vue、Angular甚至原生JS项目中使用,只负责全局状态的集中存储、更新规则定义,不处理视图层的渲染同步逻辑。
  • ‌React-Redux‌:专门为React生态设计的绑定工具,完全依赖React的Context机制实现store的全局传递,只服务于React项目,核心作用是打通Redux状态与React组件的自动渲染链路。

连接容器组件和UI组件

1、根据上期文章的代码进行改造成UI组件

javascript 复制代码
import { React,{ Component } } from 'react'
 
export default class Count extends Component {
 
    state= {
        car:'0'
    }
 
    increment = () => {
        const { value } = this.selectNumber 
      
 
    }
    
    decrement = () => {
        const { value } = this.selectNumber 
       
 
    }
 
    incrementIfOdd =() => {
        const { value } = this.selectNumber 
    }
 
    incrementAsync = () => {
        const { value } = this.selectNumber
    }
    
    render(
        <div>
            <h1>当前求和为:</h1>
            <select ref={ c => this.selectNumber = c }>
                <option value="1">1</option>
                <option value="2">2</option> 
                <option value="3">3</option>
            </select>
            <button onClick = { this.increment }>+</button>
            <button onClick = { this.decrement }>-</button>
            <button onClick = { this.incrementIfOdd }>当前求和为奇数再加</button>
            <button onClick = { this.incrementAsync }>异步加</button>
        </div>
    )
}

2、容器组件

下载react-redux依赖。创建containers文件用以放入更多的容器组件,便于管理,并在其创建Count文件夹和Count文件夹里的index.jsx文件

javascript 复制代码
//引入之前改造的UI组件
import CountUI from './count'

//引入store
import store from '../redux/store'

//引入connect用于连接UI组件与redux
import { connect } from 'react-redux'

//使用connect()()创建并暴露一个Count的容器组件
//const CountContainer = connect()(CountUI)
export default connect()(CountUI)

展示页面的时候,就不能使用改造的UI组件了,就需要使用容器组件了

App.jsx

javascript 复制代码
import React,{ Component } from 'react'
import Count from './containers/Count'

import from './redux/store'

export default class App extends Component {
    reder(){
        return (
            <div>
                <Count store = { store }/>
            </div>
        )
    }
}

react-redux的基本使用

1、容器组件改造

javascript 复制代码
//引入之前改造的UI组件
import CountUI from './count'

//引入store
import store from '../redux/store'

//引入connect用于连接UI组件与redux
import { connect } from 'react-redux'

//a函数返回的对象中的key就作为传递给UI组件props的key,
//value就作为传递给UI组件props的value--状态
function a(){
    return { n:900 }
}

//b函数返回的对象中的key就作为传递给UI组件props的key,
//value就作为传递给UI组件props的value--操作状态的方法
function b(){
    return { jia:()=>{ console.log(1) } }
}

//使用connect()()创建并暴露一个Count的容器组件
export default connect(a,b)(CountUI)

2、UI组件中打印props

javascript 复制代码
render(){
    console.log(this.props)
}

利用这点,UI组件就可以展示容器组件传递的值

javascript 复制代码
render(
        <div>
            <h1>当前求和为:{ this.props.n }</h1>
            <select ref={ c => this.selectNumber = c }>
                <option value="1">1</option>
                <option value="2">2</option> 
                <option value="3">3</option>
            </select>
            <button onClick = { this.increment }>+</button>
            <button onClick = { this.decrement }>-</button>
            <button onClick = { this.incrementIfOdd }>当前求和为奇数再加</button>
            <button onClick = { this.incrementAsync }>异步加</button>
        </div>
    )

3、容器组件中传递store或操作给UI组件

javascript 复制代码
//引入之前改造的UI组件
import CountUI from './count'

//引入store
import store from '../redux/store'

//引入connect用于连接UI组件与redux
import { connect } from 'react-redux'

//a函数返回的对象中的key就作为传递给UI组件props的key,
//value就作为传递给UI组件props的value--状态
function a(state){
    return { count:state }
}

//b函数返回的对象中的key就作为传递给UI组件props的key,
//value就作为传递给UI组件props的value--操作状态的方法
function b(dispatch){
    return { jia:(number)=>{ 
      //通知redux执行方法
       dispatch(type:'increment',data:number)

      //也可以使用我们在之前的文章中提到的action改写
      //dispatch(createIncrementAction(number))
  } }
}

//使用connect()()创建并暴露一个Count的容器组件
export default connect(a,b)(CountUI)

4、UI组件调用容器组件方法

javascript 复制代码
    increment = () => {
        const { value } = this.selectNumber 
        this.props.jia(value*1)
    }

5、正式化容器组件

javascript 复制代码
//引入之前改造的UI组件
import CountUI from './count'

//引入store
import store from '../redux/store'

//引入createIncrementAction、createDecrementAction、createIncrementAsyncAction
。。。。。

//引入connect用于连接UI组件与redux
import { connect } from 'react-redux'

//mapStateToProps函数返回是一个对象
//返回的对象中的key就作为传递给UI组件props的key,value就作为传递给UI组件props的value
//mapStateToProps用于传递状态
function mapStateToProps(state){
    return { count:state }
}

//mapDispatchToProps函数返回是一个对象
//返回的对象中的key就作为传递给UI组件props的key,value就作为传递给UI组件props的value
//mapDispatchToProps用于传递操作状态的方法
function mapDispatchToProps(dispatch){
    return {
        jia:(number)=>{ dispatch(createIncrementAction(number)) },
        jian:(number)=>{ dispatch(createDecrementAction(number)) },
        jiaAsync:(number,time)=>{ dispatch(createIncrementAsyncAction(number,time)) },
    }
}

//使用connect()()创建并暴露一个Count的容器组件
export default connect(mapStateToProps,mapDispatchToProps)(CountUI)
相关推荐
做运维的阿瑞38 分钟前
自连接、交叉连接与复杂 JOIN:一条问题链讲透
前端·数据库·mysql
web打印社区1 小时前
C-Lodop 提示未准备好或 WebSocket 没准备好:先让本机服务起来
javascript·网络·websocket·网络协议·pdf·html
言乐61 小时前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript
回眸&啤酒鸭1 小时前
DeepSeek V4.1 Flash 批量处理实战指南
服务器·前端·javascript
用户3374096924261 小时前
2026-09-27-Qwen-Image-2.1-1660Ti本地部署实战
前端
BIM云平台开发1 小时前
DAZ里,如何保存现在姿势,如果调错了,可以重新导回
linux·服务器·前端·daz基础教程
传人1 小时前
网页文字滚动效果如何做
前端·javascript·jquery
福兮说1 小时前
前后端算的 MD5、SHA-256 对不上?编码、换行、BOM、HMAC、JSON 顺序,八个原因逐个实测
前端·javascript·node.js·json·哈希算法
一木 之林1 小时前
DeepSeek Agent 开发
java·前端·人工智能