redux与react-redux学习笔记

少年驰骋,仗剑天涯
愿你眼眸有星辰,心中有大海
从此,以梦为马,不负韶华

redux 是一个应用数据流框架,主要是解决了组件间状态共享的问题,原理是集中式管理。

React-redux是为方便react使用,在redux上封装的库。在实际的项目中我们可以使用redux也可以直接使用react-redux。

1.redux

1.redux的概念

redux和react之间是没有关系的,Redux支持React、angular、jQuery甚至Javascript

redux 是一个应用数据流框架,主要是解决了组件间状态共享的问题,原理是集中式管理,主要有三个核心方法,action,store,reducer

(1)单一数据源

(2)state是只读的

唯一改变state的方法就是触发action,action是一个用于描述已经发生事件的普通对象

store.dispatch({type:'COMPLETE_TODO',index:1})

(3)使用纯函数来执行修改

为了描述action如何修改state tree,你需要去编写reducers

Reducers只是一些纯函数,它接收先前的state和action,并且返回新的state.可以复用、可以控制顺序、传入附加参数

2.redux的组成

state:就是我们传递的数据,可以分为三类:DomainData、UI State、App State

(1)Action:将我们的数据从应用传递到store的载体,它是store数据的唯一来源。我们可通过store.dispatch()将action传递给store

{
 type:'USE_LIST',//必须字段
 list:{...}
 }
// action只是描述有事件发生,并不更新state

//action的创建函数
function addAction(params){
	return{
		type:'add',
		...params
	}
}

(2)Reducer:本质是一个函数,用来响应发送过来的actions,经处理将state发生给store

接收两个参数:一是初始化state,二是action

const initState = {...}
rootReducer = (state = initState,action)=>{...return{...}}

(3)Store作为action和reducer的桥梁

import {createStore} from 'redux'
const store = createStore(传递reducer)

拥有以下属性和方法:

State应用的数据状态
getState获取数据状态
Dispatch发送action
Subscribe注册监听,Subscribe的返回值注销监听

redux的使用例子:

1.创建store/index.js

store就是保存数据的地方,可以看作是一个容器。

import { createStore } from "redux";
//导入已经创建的reducer
import {reducer} from '../reducer'
export default createStore(reducer)

2.创建action/index.js

Action 就是 View 发出的通知,表示 State 应该要发生变化了。

Action 是一个对象。其中的type属性是必须的,表示 Action 的名称。其他属性可以自由设置.

const sendAction = ()=>{
    return {
        type:'send_action',
        value:'发送了某个数据——--'
    }
}
module.exports = {
    sendAction
}

3.创建reducer/index.js

store 收到 action 以后,会给一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer。

//第一个参数为state,我们可以定义默认值,然后进行赋值
//在函数中判断第二个参数action的type值是否是我们发送的,是则通过return返回新的state,
//将reducer导出
/**
 * 专门处理发送过来的action
 */
const reducer = (state={value:'默认值'},action)=>{
    console.log('reducer',state,action)
    switch (action.type) {
        case 'send_action':
            return Object.assign({},state,action)
        default:
            return state;
    }
}

module.exports = {
    reducer
}

4.在组件中的使用

import { Button } from "antd";
import React, {Component}  from "react";
import store from "../../store";
import {sendAction} from "../../action"
class UrlList extends Component{
    constructor(props){
        super(props)
        //也可以使用箭头函数哈
        this.handleClick = this.handleClick.bind(this)
    }
    handleClick(){
         const action = sendAction()
         store.dispatch(action)
    }
    //当组件加载完毕来监听
    componentDidMount () {
        console.log(this.context.router)
         store.subscribe(()=>{
         //通过store.getState().value来获取state中的值
             console.log('subscribe',store.getState().value)
             this.setState({})
         })
    }
   
    render(){
        return (
            <>
               <Button onClick={this.handleClick}>按钮发送</Button>
                <h1>{store.getState().value}</h1>
            </>
        )
    }

}
export default Com

2.react-redux

React-redux中的两个核心成员:Provider、Connect

Provider:这个组件使得整个app都能获取到store中的数据

Connect:使得组件能够跟store关联

2-1.provider
  • Provider包装在根组件的最外层,使得所有组件都可以拿到state
  • Provider接收state作为props,通过context往下传递,这样react中任何组件都可以通过context获取store
2-2.connect
  • Provider 内部组件如果想要使用到state中的数据,就必须要connect进行层包裹封装,换-句话来说就是必须要被connect进行加强
  • connect 就是方便我们组件能够获取到store中的state
(1)react-redux的安装:

yarn add redux

yarn add react-redux

(2)构建store和reducer

1.创建reducer/index.js文件,构建reducer来响应actions

//render/index.js
//一、state 二、action
let initState={
    count:0
}
exports.reducer = (state = initState, action) => {
    switch (action.type) {
        case 'send_action':
            return {
                count:state.count+1
            }
        default:
            return state;
    }
}

2.创建store/index.js文件,通过createStore方法,把我们的reducer传入进来

import { createStore } from "redux";
//导入已经创建的reducer
import {reducer} from '../reducer'
export default createStore(reducer)
(3)Provider的实现

1.导入Provider组件,在react-redux中进行导入

2.需要利用Provider组件,对我们整个结构进行包裹

3.给我们Provider组件设置store的属性,而这个属性值是通过createStore构建出的store实例对象

import './App.css';
import ComA from './pages/ComA'
import ComB from './pages/ComB'
import store from "./store";
import { Provider } from 'react-redux';
function App() {
  return (
    <Provider store={store}>
          <ComA/>
          <ComB/>
      </Provider>
  );
}

export default App;
(4)connect

对connect简单分析一下

mapStateToProps方法:connect 的第一个参数传入的,而且会在每次store中的state改变时调用。用户获取state 中的数据,必须有返回值(普通对象)。

参数备注
state必传
ownProps非必传,自己的props

mapDispatchToProps:connect 的第二个参数传入的,用于将操作分配给store.

dispatch 是 Redux store 的一个函数。你调用 store.dispatch 来调度一个动作。这是触发状态更改的唯一方法。

第三个是要加强的组件

Connect(mapStateToProps,mapDispatchToProps)(要加强的组件)
2.3 小案例来看一下:

我们实现从在ComB中点击按钮+1,在ComA中获取+1后的值。

所以说ComB是发送方,ComA是接收方。

实现步骤:

1.导入connect

2.利用connect对组件进行加强

import React, {Component}  from "react";
import {connect} from 'react-redux'
class ComB extends Component{
    handleClick=()=>{
        console.log('ComB',this.props)
        this.props.sendAction()
    }

    render(){
        return (
            <>
            <button onClick={this.handleClick}>按钮+1</button>
            </>
        )
    }

}
const mapDispatchToProps = (dispatch)=>{
    return {
      //将sendAction注册到ComB的props中,然后就直接在ComB中直接使用this.props.sendAction()
        sendAction:()=>{
            dispatch({
                type:'send_action'
            })
        }
    }
}

export default connect(null,mapDispatchToProps)(ComB)
//connect(null,mapDispatchToProps)(ComB)

第一个参数:要接收的函数
第二个参数:要发送action的函数
第三个参数:后面的括号里面是要加强的组件

3.在ComA的组件方法中可以通过this.props拿到sendAction

import React, {Component}  from "react";
import { connect } from "react-redux";

class ComA extends Component{
    render(){
        console.log('Home render',this.props)
        return (
            <>
           <div>
           {this.props.count}
           </div>
            </>
        )
    }

}
const mapstateToProps = (state)=>{
    console.log('Home',state)
    return state;
}
export default connect(mapstateToProps)(ComA)
//简写:
//export default connect((state)=>state)(ComA)

大概总结一下整个流程:
在这里插入图片描述
本篇是个人的一个笔记,随手记一下,分享给对大家有用!前端路上,与君共勉!

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Redux是一个独立的JavaScript库,用于管理应用程序的状态。它提供了一个可预测的状态容器,可以在整个应用程序中共享。Redux通过单向数据流来管理状态,使得状态的变化变得可控和可预测。 React-ReduxRedux的官方绑定库,它提供了一些与React集成的功能,使得在React应用中使用Redux更加方便。React-Redux提供了一个Provider组件,它可以将Redux store传递给整个应用程序。它还提供了一个connect函数,它可以将Redux store中的状态映射到React组件的props中,使得React组件可以轻松地访问Redux store中的状态。 ### 回答2: Redux是一个用于JavaScript应用程序的状态容器,它提供了一个可预测且可维护的方式来管理应用程序的状态。Redux的核心概念是“单一数据源”,即将整个应用程序的状态存储在单一对象树中,并且任何组件都可以访问和修改该状态树的任意部分。 react-redux是一个与React紧密集成的Redux绑定库。它提供了一组React组件和API,使得使用ReduxReact应用程序中更加容易。 reduxreact-redux之间的关系可以理解为Redux是一种状态管理库,而react-reduxReduxReact之间的纽带。 具体来说,react-redux提供了两种主要的API:Provider和connect。 Provider是一个React组件,允许我们将应用程序的Redux存储连接到React组件树中的所有组件。在Provider组件内部,可以通过store属性传递Redux存储对象,使得所有组件都可以访问该存储。 connect是一个高阶组件,用于将React组件连接到Redux存储中的状态和操作。通过connect,我们可以在React组件中访问Redux状态,以及派发Redux操作。connect本质上是一个函数,它接收一个组件作为参数并返回一个新的连接了Redux存储的组件。 总之,reduxreact-redux之间的区别在于,redux是一个独立的状态管理库,而react-reduxReduxReact之间的桥梁,帮助React应用程序连接到Redux存储,并访问存储中的状态和操作。 ### 回答3: ReduxReact-Redux都是在React项目中使用的JavaScript库。Redux是一个JavaScript状态容器,用于管理应用程序中的所有状态。Redux允许将状态存储在一个单一的地方,以便在整个应用程序中共享该状态。React-ReduxReact的一个库,用于与Redux一起使用,以便在React组件中访问和更新Redux状态。 Redux通过store提供一个单一的状态树,包含了整个应用程序的状态。通过使用store中的action和reducer,Redux可以跟踪状态的所有更改。这可以帮助开发人员更容易地调试和管理代码。但是,使用Redux需要一定的时间和精力来管理各个状态,尤其在较大的代码库中尤其如此。 React-Redux库是Redux的一个扩展,它提供了一组工具来帮助React组件访问和更新Redux状态。通过提供Provider组件,React-Redux使得Redux存储的状态可以传递到整个应用程序中的所有组件。通过使用connect函数和mapStateToProps和mapDispatchToProps参数,React-Redux允许开发人员将Redux状态映射到React组件中。这样,开发人员就可以根据需要将Redux状态作为props传递给组件,并且可以更方便地将状态更改传递回Redux store。 总之,ReduxReact提供了一个易于管理的状态储存架构,以帮助应用程序开发人员管理和跟踪应用程序状态。React-Redux是一组工具,它使开发人员可以更方便地在React组件中使用Redux,从而帮助开发人员更快地开发应用程序。两者的区别在于Redux是包含整个应用程序状态的状态容器,而React-Redux则是提供了一组工具,以帮助开发人员更方便地在React组件中使用Redux状态。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值