React(六) —— redux

这篇具有很好参考价值的文章主要介绍了React(六) —— redux。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧁个人主页:个人主页

✌支持我 :点赞👍收藏🌼关注🧡

⛳Redux

redux最主要是用作应用状态的管理。简言之,Redux用一个单独的常量状态树(state对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers)这样就可以进行数据追踪。

🍆redux定义

Redux 是一个使用叫做“action”的事件来管理和更新应用状态的模式和工具库。它以集中式Store(centralized store)的方式对整个应用中使用的状态进行集中管理,其规则确保状态只能以可预测的方式更新。

💐redux使用原则

🔎🔎🔎

  1. state以单一对象存储在store对象中
  2. state只读(每次都返回一个新的对象)
  3. 使用纯函数reducer执行state更新

React(六) —— redux

🍰redux使用场景

🏸🏸🏸

  1. 同一个state需要在多个Component中共享
  2. 需要操作一些全局性的常驻Component,如Tooltips等
  3. 太多props需要在组件树中传递,其中大部分只是为了传给子组件
  4. 业务太复杂导致Component文件太大,可以考虑将业务逻辑拆出来放到Reducer中

🧊redux工作流程

📢📢📢

  1. 组件通过dispatch方法触发Action(type+payload载荷)
  2. Store接收Action并将Action分发给Reducer
  3. Reducer根据Action类型对状态进行更改并将更改后的状态返回给Store
  4. 组件订阅了Store中的状态,Store中的状态更新会同步到组件

🥫redux基本

创建store

redux文件夹下的store.js

//1.引入redux,
//2.createStore(reducer)
import {createStore} from 'redux'
const reducer = (preState,action)=>{
    return prevState
}
const store = createStore(reducer);
export default store

定义改变数据的actions,并在renducer函数中对对应的action作出不同的操作

//store.js 第二个参数为操作的actions
const reducer = (prevState={
    show:true,
    //...初始状态值
},action)=>{
    console.log(action);
    let newStare = {...prevState}
    switch(action.type){
        case 'hide-tabbar':
            newStare.show = false
            console.log(newStare.show);
            return newStare.show
        case 'show-tabbar':
            newStare.show = true
            console.log(newStare.show);
            return newStare.show
        default:
            return prevState
    }
}

离开或到达Detail页面,触发相应的actions

//Detail.js
import {show,hide} from '../../redux/actionCreator/TabbarActionCreator'

useEffect(()=>{
      //store.dispatch 通知
      store.dispatch(hide())
      return()=>{
        // console.log('destroy');
        store.dispatch(show())
      }
 },[])
.............................................
//actionCreator文件夹下TabbarActionCreator.js
function hide(){
    return {
            type:'hide-tabbar'
    }
}
function show(){
    return {
            type:'show-tabbar',//必须有type值
        	//payload:'需要传的值'
    }
}
export {show,hide}

订阅store,更新状态到页面上

//App.js中
state = {
    isShow:store.getState()
  }
  //store.subcribe 订阅
  componentDidMount(){
    store.subscribe(()=>{
      console.log('app中订阅',store.getState());
      this.setState({
        isShow:store.getState().show
      })

    })
  }
  //store.subcreibe 订阅
  render() {
    return (
      <div>
        <MRouter>
           {this.state.isShow && <Tabbar></Tabbar>}
        </MRouter>
      </div>
    )
}

获得store中的状态,根据状态的不同来控制Tabbar的显示或隐藏

🍸补充(actioncreator)

action creator是一个函数,用于生成一个action对象,他接受一个或多个参数(任何类型的数据),但是必须在action对象中有一个type属性:描述操作的类型。action creator函数返回一个对象,该对象是一个action,这个action对象包含了描述操作的数据

function addTodo(text){
	return{
		type:'add_todo'
	}
}
..............................
store.dispatch(addTodo())

上述:addTodo是一个action creator函数,它接受一个text参数并返回一个包含type和text属性的action对象。在Redux中,我们可以使用dispatch函数将这个action对象发送到store中,以便更新store状态。

🍫redux核心

  • getState:获取状态

    store.getState()
    
  • subscribe:订阅状态

    store.subscribe(()=>{})
    
  • dispatch:触发Action

    store.dispatch({type:'description...'})
    

reducer合并

🚀如果不同的action所处理的属性之间没有联系,我们可以把Reducer函数拆分。不同的函数负责处理不同属性,最终把他们合并成一个大的Reducer,并且抛出在store内的文件中引入。

redux文件夹下CityReducer.js

创建多个reducer,分别管理不同的数据

const CityReducer = (prevState={
    cityName:'北京'
},action)=>{
    let newStare = {...prevState}
    switch(action.type){
        case 'change-city':
            newStare.cityName = action.payload
            return newStare
        default:
            return prevState
    }
}
export default CityReducer

store.js

使用combinReducers方法合并多个Reducer。combinReducers方法可以吧多个reducer合并成一个reducer,以便在创建store实例时使用

import {combineReducers, createStore} from 'redux'
import CityReducer from './reducers/CityReducer';
import TabbarReducer from './reducers/TabbarReducer';
const reducer = combineReducers({
    CityReducer,
    TabbarReducer
})
const store = createStore(reducer);
export default store

redux中间件

在redux里,action仅仅是携带了数据的普通js对象,action creator返回的值是这个action类型的对象,然后通过store.dispatch()进行分发。同步的情况下一切都很完美,但是reducer无法处理异步的情况。

那么我们就需要action和reducer中间架起一座桥梁来处理异步。这就是middleware

redux-thunk

作用

🚒让我们的action创建函数不仅仅返回一个action对象,也可以返回一个函数,这个函数会接受dispatch和getState两个参数,我们可以在函数内部进行 异步操作 ,然后再通过dispatch发出一个新的action对象,来更新应用的状态

安装redux-thunk

npm i --save react-thunk

引入

import {applyMiddleware, combineReducers, createStore} from 'redux'
import reactThunk from 'redux-thunk'
const reducer = combineReducers({
    .....
})
const store = createStore(reducer,applyMiddleware(reactThunk));
export default store

使用方法

import getCinemsListAction from '../redux/actionCreator/getCinemsListAction'
store.dispatch(getCinemsListAction())
...............................
import axios from "axios"
function getCinemasListAction(){
   return(dispatch)=>{
    axios({
     ........
    }).then(res=>{
        console.log(res.data.data.cinemas);
        dispatch({
              type:'change-list',
              payload:res.data.data.cinemas
        })
    })
   
   }
}
export default getCinemasListAction

注意:

当我们使用react-thunk中间件时,他会判断action是否为函数,如果是函数就执行这个函数,并在函数内部发出一个新的action对象,若不是则按照正常进行

取消订阅

 //订阅
    var unsubcribe=store.subscribe(()=>{
    })
    return ()=>{
      //取消订阅
      unsubcribe()
    }
  },[])

redux-promise

安装redux-promise

npm i redux-promise

引入

import {applyMiddleware, combineReducers, createStore} from 'redux'
import reactThunk from 'redux-thunk'
import reactPromise from 'redux-promise'
const reducer = combineReducers({
    ....
})
const store = createStore(reducer,applyMiddleware(reactThunk,reactPromise));
export default store

使用方法文章来源地址https://www.toymoban.com/news/detail-415373.html

import getCinemsListAction from '../redux/actionCreator/getCinemsListAction'
store.dispatch(getCinemsListAction())
...............................
import axios from "axios"
async function getCinemasListAction(){
   var list = await axios({
        ......
    }).then(res=>{
       return{
        type:'change-list',
        payload://res.data.data.cinemas
       }
    })
    return list
 }
export default getCinemasListAction

到了这里,关于React(六) —— redux的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是redux?如何在react 项目中使用redux?

    redux是一种用于管理JavaScript应用程序的状态管理库。它可以与React、Augular、Vue等前端框架结合使用,但也可以纯在JavaScript应用程序中独立使用。redux遵循单项数据流的原则,通过一个全局的状态树来管理应用程序的状态,从而使状态的变化更加可预测和已于维护。 redux的核心

    2024年02月15日
    浏览(31)
  • 【React】React中编写CSS,Redux

    ❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: style接受一个采用小驼峰命名属性的JS对象,而不是CSS字符串,可以动态获取当前state中的状态 缺点:1.写法上面需要使用驼峰2.编写样式没有提示3.大量的样式,代码混乱4

    2024年02月09日
    浏览(27)
  • React(六) —— redux

    🧁个人主页:个人主页 ✌支持我 :点赞👍收藏🌼关注🧡 redux最主要是用作应用状态的管理。简言之,Redux用一个单独的常量状态树(state对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers)这样就

    2023年04月16日
    浏览(27)
  • React | 再战Redux

    ✨ 个人主页:CoderHing 🖥️ React.js专栏:React.js 再战Redux 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列  16天学会Vue  7天学会微信小程序  Node专栏 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力!

    2024年02月12日
    浏览(35)
  • React笔记(八)Redux

    一、安装和配置 React 官方并没有提供对应的状态机插件,因此,我们需要下载第三方的状态机插件 —— Redux。 1、下载Redux 在终端中定位到项目根目录,然后执行以下命令下载 Redux 2、创建配置文件 在 React 中,不会自动生成状态机的相关配置代码,因此,需要我们自己手动

    2024年02月10日
    浏览(29)
  • react-redux:

    index.js: reducer.js: 组件: src/index.js:

    2024年02月15日
    浏览(30)
  • react-redux

    2024年02月14日
    浏览(36)
  • React中使用Redux

            redux是一个专门用于状态管理的一个库,和vue中的vuex功能类似。其中核心点就是状态的管理。虽然我们无论在vue还是在react中我们组件间的通行都可以使用消息总线或者父子组件间的消息传递来进行操作。但是如果我们需要A组件的状态在其他十个或者二十个组件上进

    2024年02月16日
    浏览(37)
  • Redux - Redux在React函数式组件中的基本使用

    Redux 是 JavaScript 应用的状态容器,提供可预测的状态管理。 它主要的几个方法如下: 重要的有方法 有 dispatch(分发action) 、 getState(获取state) 、 subscribe(监听state的变化) ,下面会介绍到,另外两个可以不用管; 那什么时候使用Redux呢? 当遇到如下问题时,建议开始使

    2024年02月13日
    浏览(37)
  • 【React】React中编写CSS,Redux,RTX

    ❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: style接受一个采用小驼峰命名属性的JS对象,而不是CSS字符串,可以动态获取当前state中的状态 缺点:1.写法上面需要使用驼峰2.编写样式没有提示3.大量的样式,代码混乱4

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包