React Redux

React Redux是Redux的官方React UI绑定层。它允许您的React组件从Redux存储读取数据,并将操作分派到存储以更新状态。redux是一个管理状态数据state的容器。提供了可预测的状态管理。

React Redux 8.x需要React 16.8.3或更高版本/Rect Native 0.59或更高,才能使用React Hooks。

安装

npm install react-redux
# Or
yarn add react-redux

Store
就是把它们联系到一起的对象。Store 有以下职责:
维持应用的 state;
提供 getState() 方法获取 state;
提供 dispatch(action) 方法更新 state;
通过 subscribe(listener) 注册监听器;
通过 subscribe(listener) 返回的函数注销监听器。

三大原则

1、单一数据源
整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
2、State 是只读的
唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
3、使用纯函数来执行修改
为了描述 action 如何改变 state tree ,你需要编写 reducers。

action
所有数据的变化,必须通过派发(dispatch )action来更新
action是一个普通的JavaScript对象,用来描述这次更新的type和content;
使用action的好处是能够知道数据发生了什么变化,数据变化都是可以追踪,可预测的

reducer
联系state和action的一个纯函数,不能产生副作用,将传入的state和action结合起来生成一个新的state

redux 基本使用
安装redux,使用命令:yarn dd redux

const initialState = {
	counter :0
}
// reducer
function reducer(state = initialState,action){
	switch(action.type){
		case:"INCREMENT":
			return {...state,counter:state.counter+1};
		case:"DECREMENT":
			return {...state,counter:state.counter-1};
		case:"ADD_NUMBER":
			return {...state,counter:state.counter+action.num};
		case:"SUB_NUMBER":
			return {...state,counter:state.counter-action.num};
		defaultreturn state;
	}
}

// store 创建时要求传入reducer
const store = redux.createStore(reducer);

// actions
const action1 = {type:"INCREMENT"};
const action2 = {type:"DECREMENT"};
const action3 = {type:"ADD_NUMBER",num:3};
const action4 = {type:"SUB_NUMBER",num:3};
//派发action ,派发之后执行reducer
store.dispatch(action1);
store.dispatch(action2);
store.dispatch(action3);
store.dispatch(action4);

优化,真实开发中我们不可能把所以代码放一起,不方便维护,这里只是基本的使用。

Provider

API概述React Redux包括一个<Provider/>组件,该组件使Redux store可用于应用程序的其余部分:

import React from 'react'
import ReactDOM from 'react-dom/client'

import { Provider } from 'react-redux'
import store from './store'

import App from './App'

// As of React 18
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <Provider store={store}>
    <App />
  </Provider>,
)

Hooks

React Redux提供了一对自定义React挂钩,允许您的React组件与Redux store 交互。
useSelector从存储状态中读取一个值并订阅更新,
useDispatch返回存储的调度方法以允许您调度操作。

import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import {
  decrement,
  increment,
  incrementByAmount,
  incrementAsync,
  selectCount,
} from './counterSlice'
import styles from './Counter.module.css'

export function Counter() {
  const count = useSelector(selectCount)
  const dispatch = useDispatch()

  return (
    <div>
      <div className={styles.row}>
        <button
          className={styles.button}
          aria-label="Increment value"
          onClick={() => dispatch(increment())}
        >
          +
        </button>
        <span className={styles.value}>{count}</span>
        <button
          className={styles.button}
          aria-label="Decrement value"
          onClick={() => dispatch(decrement())}
        >
          -
        </button>
      </div>
      {/* omit additional rendering output here */}
    </div>
  )
}

案例

利用 react-redux 构建全局状态管理
● 创建 reducer,在的数里面判断action的type属性,然后返回状态
● 利用 createStore 来捣建 store
● 在 App,js 中导入 store
● 在 App.js 中导入 Provider,在根组件上对整个结构进行包裹,然后设置 store 属性,来统一对 store进行管理

App.js

import LayOut from './pages/LayOut.jsx';
import store from "./store";
import { Provider } from 'react-redux';
 
function App() {
  return ( 
    <Provider store={store}>
      <div className="App"> 
        <LayOut />
      </div>
    </Provider>  
  );
} 
export default App;

LayOut 组件 ,pages/LayOut.jsx

import React from "react";
 import { useCallback, useEffect } from "react"; 
import { setUserInfoAction } from "../store/user/action";
import { useDispatch } from "react-redux";
// import  getStateUser from "../store/getter/user" 
import {  useStateUserInfo } from "../store/getter/user";

const LayOut = ()=>{
    const dispatch = useDispatch()
    const setUserInfo = useCallback((info) => dispatch(setUserInfoAction(info)), [dispatch])
    const userInfo = useStateUserInfo()

    const onFinish = ()=>{
      setUserInfo({
             name:"张三",
             age:"23"
        }); 
        console.log(userInfo)
    }
     useEffect(() => {
        console.log(userInfo)

    }, [userInfo]);
    return <div>
        登录 保存 user info <br/>
        
        {userInfo?.name} -- {userInfo?.age} <br/>
        <button onClick={onFinish}>登录</button>
    </div>
} 
export default LayOut
// export default connect(   mapState,  mapDispatch   )(MyComponent)

在src 下新建 store 文件如下
在这里插入图片描述
store 下面的index,js

 import {combineReducers,createStore} from 'redux'; 
 import UserReducer from "./user/reducer"; 
 const reducer = combineReducers({ 
  user: UserReducer,  
}); 
const store = createStore (
  reducer
); 
export default store; 

store 下的 user 模块 下的 action.js

import * as ActionTypes from "./actionTypes";  
export const setUserInfoAction = (info) => ({
  type: ActionTypes.SET_USERINFO,
  info,
}); 
export const clearUser = () => ({
  type: ActionTypes.CLEAR_USERINFO,
});

store 下的 user 模块 下的actionTypes.js

export const SET_USERINFO = "SET_USERINFO";
export const CLEAR_USERINFO = "CLEAR_USERINFO";

store 下的 user 模块 下的reducer.js


import * as actionTypes from "./actionTypes";
const initState = {
    name:"",
    age:""
}

export default function reducer(state = initState, action) {
  const { type, info } = action
  switch (type) {
    case actionTypes.SET_USERINFO:
      console.log(info)
      return info
    case actionTypes.CLEAR_USERINFO: {
      return null
    }
    default:
      return state
  }
}

store 下的 getter 获取数据 user

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

const getStateUser = (state) =>  state.user

export const useStateUserInfo = () =>  useSelector(getStateUser)  

用例结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/699353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

萌啦OZON数据分析工具:OZON电商卖家的得力助手

在当下电商领域&#xff0c;数据分析的重要性不言而喻。对于在OZON这一俄罗斯电商平台上耕耘的卖家而言&#xff0c;拥有一款高效、准确的数据分析工具&#xff0c;无疑是提升销售业绩、优化运营策略的关键。今天&#xff0c;我们就来聊聊“萌啦OZON数据分析工具”&#xff0c;…

每日一练——反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if (NULL head)return head;struct ListNode*…

从0到100:找搭子小程序开发笔记(一)

背景调查 “找搭子”小程序&#xff1a;能够解决人们在社交、休闲和约会方面的需求&#xff0c;提供方便快捷的方式来找到合适的伴侣或活动伙伴。许多人在社交场合中感到焦虑或不安&#xff0c;因此他们更倾向于使用在线平台来认识新的朋友或搭子。有些人可能生活在一个较小或…

LayerNorm层归一化

1.背景 与 Batch normalization 不同&#xff0c;Layer normalization 是在特征维度上进行标准化的&#xff0c;而不是在数据批次维度上。像 Batch Norm 它的核心是数据批次之间的归一化【强调的是第 i 批次和第 i1 批次的区别&#xff0c;然后BN去缩小他们的的区别】&#xf…

opencv_GUI

图像入门 import numpy as np import cv2 as cv # 用灰度模式加载图像 img cv.imread(C:/Users/HP/Downloads/basketball.png, 0)# 即使图像路径错误&#xff0c;它也不会抛出任何错误&#xff0c;但是打印 img会给你Nonecv.imshow(image, img) cv.waitKey(5000) # 一个键盘绑…

JAVAEE值之网络原理(1)_传输控制协议(UDP)、概念、特点、结构、代码实例

前言 在前两节中我们介绍了UDP数据报套接字编程&#xff0c;但是并没有对UDP进行详细介绍&#xff0c;本节中我们将会详细介绍传输层中的UDP协议。 一、什么是UDP&#xff1f; UDP工作在传输层&#xff0c;用于程序之间传输数据的。数据一般包含&#xff1a;文件类型&#xff0…

掌握Google搜索结果获取

在数据驱动的决策世界中&#xff0c;获取准确而全面的信息至关重要。Google 搜索结果抓取是一种强大的技术&#xff0c;可以让企业、调查人员和研究人员从搜索引擎结果中提取可靠的数据。本综合指南将深入研究 Google 搜索结果的最佳实践、工具和道德考量&#xff0c;以确定能够…

攻防演练之-网络安全产品大巡礼二

书接上文&#xff0c;《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼一&#xff0c;这里。 “咱们中场休息一会&#xff0c;我去接杯水哈”&#xff0c;看着认真听讲的众人&#xff0c;王工很是满意&#xff0c;经常夹在甲乙两方受气的他&#xff0c;这次终于表…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream&#xff0c;用于存储word_count_data中的数据。…

2025年QS世界大学排名,美国大学表现如何?

大多数访问学者申请&#xff0c;在探讨QS大学排名中美国大学的表现时&#xff0c;我们不难发现这些学府在全球高等教育舞台上占据着举足轻重的地位。QS排名作为评估全球大学综合实力的重要指标之一&#xff0c;充分展示了美国大学在学术声誉、科研实力、教学质量和国际影响力等…

专属部署的优势和企业价值

纷享销客支持多种部署方式&#xff0c;满足不同企业在高性能、隔离性、安全性、合规性等方面的要求。 公有云SaaS 公有云SaaS服务即直接使用纷享云服务&#xff0c;CRM应用、数据等均在纷享云&#xff0c;客户只需开通账号和相关服务&#xff0c;做到了即开即用。 纷享云采用…

Error:Kotlin: Module was compiled with an incompatible version of Kotlin.

一、问题&#xff1a;运行spring boot项目时&#xff0c;idea报出错误&#xff1a;时提示报错如下图&#xff1a; 错误代码&#xff1a; Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected …

springboot p2p金融信贷平台的设计与实现-计算机毕业设计源码82978

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对p2p金融信贷平台等问题&#xff0c;对p2p金…

PDF编辑与修正 提高工作效率 Enfocus PitStop Pro 2022 中文

Enfocus PitStop Pro 2022是一款专为Mac用户设计的强大PDF编辑和校对工具。它支持添加、删除、合并、分割PDF页面&#xff0c;以及文本和图像的编辑&#xff0c;如文字替换、字体更改、颜色调整等。内置自动修复功能&#xff0c;能快速检测并修复缺失字体、重叠文本等常见问题。…

健身小程序:智能化助力个人健身旅程

一、智能化功能的核心 健身小程序的智能化功能主要体现在以下几个方面&#xff1a; 智能健身计划推荐&#xff1a;小程序内置了先进的算法&#xff0c;能够根据用户的身体状况、健身目标和时间安排&#xff0c;智能推荐个性化的健身计划。这些计划不仅科学合理&#xff0c;而且…

在Vue2和Vue3中ECharts如何使用,详细步骤,ref,$ref。echarts官网。

不管是在vue2中还是在vue3中其实本质上的原理和步骤都是一样的&#xff0c;只是语法可能有所不同。 为了方便大家看起乱&#xff0c;vue2和vue3我分开写。 echarts官网&#xff1a; https://echarts.apache.org/zh/index.html Vue2篇&#xff1a; 1.导入echarts包&#xf…

云联HIS系统源码,二级医院信息系统源码,支持云架构部署模式

采用java语言开发B/S广域互联模式&#xff0c;支持云架构部署模式&#xff0c;支持大数据分析技术&#xff1b;支持与医保平台接口、电子票据对接。 云HIS系统相关技术&#xff1a; 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;Sprin…

数学模型:操作系统中FCFS、SJF、HRRN算法的平均周转时间比较 c语言

摘 要 研究目的&#xff1a;比较操作系统中进程调度FCFS、SJF、HRRN算法的平均周转时间和带权周转时间的大小关系。 研究方法&#xff1a;在建模分析时&#xff0c;分别举4个进程的例子&#xff0c;1个进程用两个字母分别表示到达时间和执行时间。分两种极端情况&#xff0c…

解锁工业数据流:NeuronEX 规则调试功能实操指南

工业企业要实现数据驱动的新质生产力升级&#xff0c;一个重要的环节便是如何准确、可靠地收集并利用生产过程中的数据流。 NeuronEX 工业边缘软件中的规则调试功能&#xff0c;可帮助用户在安全的环境中模拟数据输入&#xff0c;测试和优化数据处理规则&#xff0c;从而提前发…

低代码是什么,低代码平台可以解决哪些业务问题

低代码&#xff08;Low-Code&#xff09;是一种软件开发方法&#xff0c;它使得开发人员能够通过图形界面、拖放组件和模型驱动的逻辑&#xff0c;快速地构建和部署应用程序&#xff0c;而无需编写大量的代码。 近年来&#xff0c;低代码正在逐步帮助企业解决业务问题&#xff…