【Redux 和 React-Recux】

一、Redux

Redux:是一个状态管理的库。不是React内置的,是独立的JavaScript的状态容器,提供可预测的状态管理。在React中使用Redux,可以把所有的state集中到组件的顶部,能够灵活地将所有的state分发给所有的组件。方便了开发者管理React中的状态,也方便了不同组件间的通信

1、三大核心

  • store:是一个数据容器,用来管理和保存整个项目的state。整个项目中只能有一个store
  • state:是一个对象,在state中存储相应的数据,当开发者需要使用数据时,可以通过store提供的方法来获取state
  • action:是一个通知命令,用于对state进行修改。通过store提供的方法可以发起一个动作(action)完成对state的修改

2、Redux的函数

(1)action:本质是JavaScript对象,在action中包含一个字符串类型的type属性,作用是指定要对state进行何种操作
action会通过store将要进行的操作传给reducer函数,由reducer完成对state的修改

action({type:'add',data:''})

(2)reducer:是一个纯函数。有两个参数state和action。该函数一定有一个返回值,是修改后的state。

纯函数:

a、纯函数在执行过程中没有任何的副作用。如定时器、网络请求。
b、如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部状态或数据的变化。

function reducer(state = { count:1},action) {
			 
	   switch(action.type){
					
		   case 'ADD':
					   
	          return { count:state.count+1 }
						  
			case 'SUB':
						
			  return { count:state.count-1 }
		}		 
			  return state;
}

(3)createStore:用于创建store,参数必须是reducer,reducer函数名可以自定义

3、store对象提供的方法

(1)getState:用来获取state

(2)dispatch(action):派发动作(action)给reducer

(3)subscribe(listener):会注册一个监听器来监听state的变化。会返回一个注销监听器的方法 。 Redux的工作模式:发布-订阅模式

举例:利用Redux实现计数器

💥举例:利用Redux实现计数器

index.js(自定义的js文件): 创建纯函数和一个状态容器


//版本问题createStore已修改为legacy_createStore,但可以通过以下形式修改成简单写法
import {legacy_createStore as createStore} from "redux";

//创建一个纯函数:
function reducer(state={count:1},action){
    console.log('Action'+action.type);

    switch (action.type){
        case 'ADD':
            return{count:state.count+1};
        case 'SUB':
            return{count:state.count-1}
        default:
            return state;
    }
}

//2.创建状态的容器:store
let store = createStore(reducer);

//3.导出store
export default store;
}

Counter.jsx代码段:

import React from "react";
//导入数据的状态容器store
import store from "../store";
class Counter extends React.Component{
    constructor(props) {
        super(props);
        this.state = {  //定义组件自己的状态
            number:store.getState().count  //将容器中的state的count值赋给自己的状态属性
        }
    }

    //组件挂载之前进行订阅
    componentDidMount() {
        this.unSubScribe = store.subscribe(()=>{
            this.setState({
                number:store.getState().count
            })
        })
    }

    //组件卸载时取消订阅
    componentWillUnmount() {
        this.unSubScribe && this.unSubScribe()  //如果订阅了store,就取消订阅
    }

    render(){
        return(
            <>
                <p>{ this.state.number}</p>
                <button onClick={()=>{ store.dispatch({type:'ADD'})}}>1</button>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <button onClick={()=>{ store.dispatch({type:'SUB'})}}>1</button>
            </>
        )
    }
}
export default Counter;

App.js:

import logo from './logo.svg';
import './App.css';
import Counter from "./components/Counter";

function App() {
    
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
      </header> 
        <Counter/>
    </div>
  );
}

export default App;

在这里插入图片描述

4、在组件(类组件)中使用redux的过程

(1)安装:npm install redux

(2)通过store的getState()方法获取store中状态属性的值

(3)通过store的dispatch方法向纯函数派送动作

(4)通过store的subscribe方法对store进行订阅

具体使用方法参考上一个示例

5、Redux使用的缺点

每个组件在使用时都要引入store,当组件嵌套时,整个操作会非常麻烦

二、React-Recux

1、特点

(1)是React官方的绑定库

(2)可以实现所有组件共享store

(3)虽然是React官方的绑定库,但使用时仍然需要安装(npm i react-redux),通常要和redux结合使用。

2、组成部分

(1)Provider组件:作用是将store共享给包含在<Provider>中的所有子组件

<Provider store={ 用户定义的store} >    // store是Provider组件的属性
			
	 <App/>
			   
</Provider>

含义:将用户定义的’store’共享给App的所有子组件

(2)connect组件/函数:是一个React定义的高阶组件。所谓的高阶组件就是给它传入一个组件,它会返回新的加工后的组件

connect(state=>newProps)(Component)

connect函数的参数:

mapStateToProps:本质是一个函数,用来监听store的state的变化,一旦发现state发生了改变,该函数就就会自动执行。

mapDispatchToProps:用来获取action并派送action

3、在类组件的使用

index.jsx: 创建纯函数和一个状态容器

import {legacy_createStore as createStore} from "redux";

function reducer(state={count:1},action){
    switch (action.type){
        case'ADD':
            return {count:state.count + 1}
        case'SUB':
            return {count:state.count - 1}
        default:
            return state

    }
}

let store = createStore(reducer);
export default store;

index.js(全局配置文件): 将自定义的store共享给了App及其子组件

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import {Provider} from 'react-redux'
import store from './store'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={ store }>  {/*将自定义的store共享给了App及其子组件*/}
        <App />
    </Provider>
);

action.js:

function add(){
    return {
        type:'ADD'
    }
}

function minus(){
    return {
        type:'MINUS'
    }
}

const action = {add,minus}

export default action;

Counter.jsx

import React from "react";
import {connect} from 'react-redux'
import action from "../store/action";

class Counter extends React.Component{
    render() {
        return (
            <div>
                <p>{ this.props.count }</p>
                <button onClick={ this.props.add}>1</button>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <button onClick={this.props.minus}>1</button>
            </div>
        )
    }
}

const mapStateToProps = state=> state; //获取store的state并传递给props
const mapDispatchToProps = {...action}  //获取action并派发出去

//通过connect函数将共享的store和定义好的action传递给Counter组件的props属性

export default connect(mapStateToProps,mapDispatchToProps)(Counter);

App.js:

import logo from './logo.svg';
import './App.css';
import Counter from "./components/Counter";

function App(props) {
    return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
      </header>
        <Counter/>
    </div>
  );
}
export default App;

在这里插入图片描述

4、在函数组件中使用

(1)在React-Redux7.x以后的版本中增加了用于操作React-Redux的Hooks,这些hooks只能在函数组件中使用
(2)组成部分:

       A、const state = useSelector(state=>state),功能类似于connect
	   
	   B、const dispatch = useDispatch(),返回store中的dispatch方法
	   
	   C、const store = useStore(),返回的是store

其余配置遇上一个示例相同

Counter1.jsx代码段:

import React from "react";

import { useDispatch,useSelector} from "react-redux";

function Counter1(props){
    const count = useSelector(state=>state.count)
    const dispatch = useDispatch();

    return (
        <div>
            <p>{ count } </p>
            <button onClick={()=>{ dispatch({type:'ADD'})}}>1</button>
            <button onClick={()=>{ dispatch({type:'MINUS'})}}>1</button>
        </div>
    )
}
export default Counter1;

在这里插入图片描述

三、reducer的拆分与合并

1、拆分

一个项目只有一个store,为了便于维护可以将reducer按照模块进行拆分

例如:User(用户数据)、Todo(待办事项)
function userReducer(state={},action){}
function todoReducer(state={},action){}

2、合并

在创建store时将reducer进行合并。使用的方法是combineReducer({})

const store = createStore(combineReducer({user,todo}))

四、redux-thunk中间件

1、中间件(middleware):Redux的核心操作比较简单。在实际的开发中,当action派发之后,reducer操作之前还要做一些其他的工作。由于reducer是一个纯函数,这些额外的工作他无法完成,所以需要一个中间件。

2、redux-thunk中间件:主要用于解决项目中的异步请求
(1)安装:npm i react-redux
(2)创建store时,引入中间件,redux提供了applyMiddleware来引入
(3)利用中间件完成额外工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值