【redux】redux和react-redux的学习

ue4 classuobject没有成员beginplay_【教程】UE4 C++实现简单的AI及遇到的坑 后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。我们这篇文章的宗旨是用代码实现简单的AI,有多简单,只是搭建一个具有PawnSensing组件和回调的AI。重点也不是做一个AI,而是了解一下C++代码如何搭建最基本的AI(关于蓝图如何创建请自行百度)。如果英语还不错的话,可以移步 参考链接,链接中的内容除了创建基本的PawnSensing组件还有关于行为... 阅读详情

1.什么场景使用redux?

1.项目角度

  • 用户的使用方式复杂 
  • 不同身份的用户有不同的使用方式(多角色)
  • 多个用户之间可以协作
  • 与服务器大量交互,或者使用了websocket
  • view要从多个来源获取数据

2.组件角度

  • 某个组件的状态需要共享 
  • 某个状态需要在任何地方都可以拿到
  • 一个组件需要改变全局状态
  • 一个组件需要改变另一个组件的状态

 

2.redux设计思想

  • web应用是一个状态机,视图与状态一一对应的 
  • 所有的状态,保存在一个对象里面

 

3.redux三大原则

  • 唯一数据源
  • 保持只读状态
  • 数据改变只能通过纯函数来执行

 

4.redux流程图示意

 

 

5.redux版TodoList(示例原始的redux)

页面示例:

 

 

1.抽离默认数据到reducer(定义reducer)

//reducer.js

//1.定义默认的状态数据
const defaultState = {
    inputVal: '',
    data: [
        '尝遍人间甘辛味,言外冷暖我自知',
        '一切安乐,无不来自困苦',
        '如果脏了还用,就莫不如一开始就用带颜色的。白的就要纯白才行',
        '君といると、月が绮丽です',
        '得来不易的机会,会让所有的动物去做原来不喜欢做的事',
    ]
}


// 2.导出一个返回状态数据的函数
// 该函数有两个参数:state/action
// 将defaultState赋值给state,使得state有初始化数据,为后面使用state埋下伏笔
export default (state = defaultState,action) => {
    return state;
}

 

2.使页面上使用state中的数据(即获取state的数据)

 创建store以使用

//store/index.js

import { createStore } from 'redux';
import reducer from './reducer';

// 使用createStore 来引用reducer中返回的数据
const store = createStore(reducer);
export default store;

 

 

通过store.getState() 赋值给react state,以使state获得数据并显示在页面上。

如果这时想要更改state中的数据呢?

//TodoList.js

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
import store from './store';

export default class TodoList extends Component{
    constructor(){
        super();
        // getState获取store中的状态
        this.state = store.getState();
    }
    
    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.state.inputVal}
                />
                <Button 
                type="primary" 
                >
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.state.data}
                renderItem={(item,index) => (
                    <List.Item>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

 

3.通过定义action对象变更state中的数据(dispatch:事件派发)

 定义action对象以便派发事件

 通过store.dispatch(action对象)派发事件

//TodoList.js 

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
import store from './store';


export default class TodoList extends Component{
    constructor(){
        super();
        // getState获取store中的状态
        this.state = store.getState();
    }
   
    // 输入框变化
    handleChange(e){
        // 触发reducer(store)修改数据
        const action = {
            // type必传
            type: 'change_inputVal',
            value: e.target.value
        };
        //dispatch 事件派发
        store.dispatch(action);
    }
    
    // 新增
    handleClick(){
        const action = {
            type: 'add_to_data'
        }
        store.dispatch(action);
    }
    
    //双击删除
    handleDoubleClick(index){
        store.dispatch({
            type: 'del_to_data',
            value: index
        })
    }

    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.state.inputVal}
                onChange={this.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.state.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

 将reducer中的导出状态函数补充完整,修改state的具体逻辑在该函数中

 三点需要注意:

  • let newState = JSON.parse(JSON.stringify(state)) 可谓是该函数中最重要的一句代码,直接将reducer与state撇清关系;自此后续所有操作都围绕newState进行,可以说,初始化的defaultState的唯一作用只是为newState提供了数据的原始版本
  • 该函数最后返回的是newState,而不是state,newState代表的永远是最新的数据
  • action的作用只是通过属性type值区分逻辑操作而已,推荐使用switch...case语句
//store/reducer.js

//1.定义默认的状态数据
const defaultState = {
    inputVal: '',
    data: [
        '尝遍人间甘辛味,言外冷暖我自知',
        '一切安乐,无不来自困苦',
        '如果脏了还用,就莫不如一开始就用带颜色的。白的就要纯白才行',
        '君といると、月が绮丽です',
        '得来不易的机会,会让所有的动物去做原来不喜欢做的事',
    ]
}


// 2.导出一个返回状态数据的函数
// 该函数有两个参数:state/action
export default (state = defaultState,action) => {
    // reducer 只能接收和返回新的state,不能直接更改state,所以需要对state进行深拷贝
    // 到这里其实 newState与state(最开始默认的defaultState)并无关系,
    // 往后所有操作都是操作newState,显然,此时defaultState只是一个摆设
    let newState = JSON.parse(JSON.stringify(state));

    //reducer接收到一个事件,先判断不同的类型
    switch (action.type) {
        case 'change_inputVal':
            newState.inputVal = action.value 
            break;
        case 'add_to_data':
            newState.data.push(newState.inputVal);
            newState.inputVal = '';
            break;
        case 'del_to_data':
            newState.data.splice(action.value,1);
            break;    
        default:
            break;
    }
    // 始终返回的都是深拷贝的newState
    return newState;
}


 

4.store数据的订阅(subscribe:数据订阅)

 subscribe(函数),该函数在store变化时,去更改react state中的数据

//TodoList.js 

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
import store from './store';


export default class TodoList extends Component{
    constructor(){
        super();
        // getState获取store中的状态
        this.state = store.getState();
        // subscribe 订阅
        // 订阅store ,一旦store 状态数据有更新,会进行触发
        store.subscribe(this.storeChange.bind(this));

    }
    
    // store变化时,修改react state的函数
    storeChange(){
        this.setState(store.getState());
    }
    
    // 输入框变化
    handleChange(e){
        // this.setState({
        //     inputVal: e.target.value
        // });
        // 触发reducer(store)修改数据
        const action = {
            // type必传
            type: 'change_inputVal',
            value: e.target.value
        };
        //dispatch 事件派发
        store.dispatch(action);
    }
    
    // 新增
    handleClick(){
        const action = {
            type: 'add_to_data'
        }
        store.dispatch(action);
    }
    
    //双击删除
    handleDoubleClick(index){
        store.dispatch({
            type: 'del_to_data',
            value: index
        })
    }

    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.state.inputVal}
                onChange={this.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.state.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

 到这里redux版TodoList已经完成

 

 

6.actionType(封装action对象的type常量)  

以上述redux版TodoList为例: 

 在没有封装actionCreaters的情况,actionType封装点有两处:

  • reducer中switch...case中的action属性type
  • 页面代码(TodoList)中的定义的action对象

 新建action type常量文件 

//store/actionTypes.js

//定义action type 常量值
export const CHANGE_INPUTVALUE = 'change_inputVal';
export const ADD_TO_DATA = 'add_to_data';
export const DEL_TO_DATA = 'del_to_data';

改造两处需封装的地方:

//store/reducer.js

import { CHANGE_INPUTVALUE,ADD_TO_DATA,DEL_TO_DATA } from './actionType';

//1.定义默认的状态数据
const defaultState = {
    inputVal: '',
    data: [
        '尝遍人间甘辛味,言外冷暖我自知',
        '一切安乐,无不来自困苦',
        '如果脏了还用,就莫不如一开始就用带颜色的。白的就要纯白才行',
        '君といると、月が绮丽です',
        '得来不易的机会,会让所有的动物去做原来不喜欢做的事',
    ]
}


// 2.导出一个返回状态数据的函数
// 该函数有两个参数:state/action
export default (state = defaultState,action) => {
    // reducer 只能接收和返回新的state,不能直接更改state,所以需要对state进行深拷贝
    // 到这里其实 newState与state(最开始默认的defaultState)并无关系,
    // 往后所有操作都是操作newState,显然,此时defaultState只是一个摆设
    let newState = JSON.parse(JSON.stringify(state));

    //reducer接收到一个事件,先判断不同的类型
    switch (action.type) {
        case CHANGE_INPUTVALUE:
            newState.inputVal = action.value 
            break;
        case ADD_TO_DATA:
            newState.data.push(newState.inputVal);
            newState.inputVal = '';
            break;
        case DEL_TO_DATA:
            newState.data.splice(action.value,1);
            break;    
        default:
            break;
    }
    // 始终返回的都是深拷贝的newState
    return newState;
}


//TodoList.js 

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
import store from './store';

//引入action type
import { CHANGE_INPUTVALUE,ADD_TO_DATA,DEL_TO_DATA } from './actionType';


export default class TodoList extends Component{
    constructor(){
        super();
        // getState获取store中的状态
        this.state = store.getState();
        // subscribe 订阅
        // 订阅store ,一旦store 状态数据有更新,会进行触发
        store.subscribe(this.storeChange.bind(this));

    }
    
    // store变化时,修改react state的函数
    storeChange(){
        this.setState(store.getState());
    }
    
    // 输入框变化
    handleChange(e){
        const action = {
            // type必传
            type: CHANGE_INPUTVALUE,
            value: e.target.value
        };
        //dispatch 事件派发
        store.dispatch(action);
    }
    
    // 新增
    handleClick(){
        const action = {
            type: ADD_TO_DATA
        }
        store.dispatch(action);
    }
    
    //双击删除
    handleDoubleClick(index){
        store.dispatch({
            type: DEL_TO_DATA,
            value: index
        })
    }

    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.state.inputVal}
                onChange={this.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.state.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

 

7.actionCreaters(封装action对象)

在以上示例的基础上封装action对象,只有一处封装点: 

  •  将页面代码(TodoList)中定义的对象进行封装
  • 由于action单独抽离,actionType也会随action的封装而去
//store/actionCreaters.js


//引入action type
import { CHANGE_INPUTVALUE,ADD_TO_DATA,DEL_TO_DATA } from './actionType';

// 定义action 对象

// 输入框变化action
export const CHANGE_INPUTVALUE_ACTION = (value) => {
    return {
        type: CHANGE_INPUTVALUE,
        value
    }
}


// 添加事项action
export const ADD_TO_DATA_ACTION = () => {
    return {
        type: ADD_TO_DATA
    }
}


// 删除事项action
export const DEL_TO_DATA_ACTION = (value) => {
    return {
        type: DEL_TO_DATA,
        value
    }
}


//TodoList.js 

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
import store from './store';

//引入actionCreaters
import { 
    CHANGE_INPUTVALUE_ACTION,
    ADD_TO_DATA_ACTION,
    DEL_TO_DATA_ACTION
} from './store-react-redux/actionCreaters';


export default class TodoList extends Component{
    constructor(){
        super();
        // getState获取store中的状态
        this.state = store.getState();
        // subscribe 订阅
        // 订阅store ,一旦store 状态数据有更新,会进行触发
        store.subscribe(this.storeChange.bind(this));

    }
    
    // store变化时,修改react state的函数
    storeChange(){
        this.setState(store.getState());
    }
    
    // 输入框变化
    handleChange(e){
        //dispatch 事件派发
        store.dispatch(CHANGE_INPUTVALUE_ACTION(e.target.value));
    }
    
    // 新增
    handleClick(){
        const action = {
            type: ADD_TO_DATA
        }
        store.dispatch(ADD_TO_DATA_ACTION());
    }
    
    //双击删除
    handleDoubleClick(index){
        store.dispatch(DEL_TO_DATA_ACTION(index));
    }

    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.state.inputVal}
                onChange={this.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.state.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

以上两中封装,说好听点呢,就是方便管理使用分类协作,说难听点呢,就是搞形式主义。。。

 

 

8.在redux的基础上整合react-redux

react-redux本身依赖于redux,安装前必须安装redux 

npm install react-redux

 整合react-redux,下述主要包括三部分:

  • Provider提供器组件,用于在各个组件间传递store数据
  • connect连接器函数用于映射state和action在props上(建立react与state/props的关系)

 

1.Provider提供器

 Provider是一个提供器,只要使用了这个组件,组件里的其他所有组件都可以使用store了,这是react-redux的核心组件

//src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import Todolist from './TodoList'; //介绍state,派发,订阅
import Leijia from './Leijia';//介绍action类型常量,actionCreater
import TodoListRR from './TodoListRR';//将之前的Todolist改造成封装了action类型常量/actionCreater,并整合react-redux

// 加入 react-redux
import store from './store-react-redux';
// 引入提供器组件
import { Provider } from 'react-redux';
// 放在Provider中的标签组件都可以使用Provider提供的数据

ReactDOM.render(
  // <Todolist />,
  // <Leijia />,
  // <TodoListRR />,
  <Provider store={store}>
    <TodoListRR /> 
  </Provider>,
  document.getElementById('root')
);

 

2.connect连接器 

//TodoList.js

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
//import store from './store';

//引入actionCreaters
import { 
    CHANGE_INPUTVALUE_ACTION,
    ADD_TO_DATA_ACTION,
    DEL_TO_DATA_ACTION
} from './store-react-redux/actionCreaters';


// 引入连接器函数,这时候会不需要store,将原先的store代码删除
import { connect } from 'react-redux';


class TodoListRR extends Component{
    
    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.props.inputVal}
                onChange={this.props.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.props.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.props.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.props.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}

//引入连接器后,不再是导出组件,而是导出connect(状态的映射,事件派发的映射)(组件名称)
export default connect()(TodoListRR);

 

3.state与action的映射

 这两者的映射主要是建议与react 组件 props的关系,使得具体业务逻辑可以直接使用props上映射的state和action 

import React,{ Component } from 'react';
import { Button,Input,List } from 'antd';
// 引入store
//import store from './store';

//引入actionCreaters
import { 
    CHANGE_INPUTVALUE_ACTION,
    ADD_TO_DATA_ACTION,
    DEL_TO_DATA_ACTION
} from './store-react-redux/actionCreaters';


// 引入连接器函数,这时候会不需要store,将原先的store代码删除
import { connect } from 'react-redux';


class TodoListRR extends Component{
    render(){
        return (
            <div style={{padding: '40px'}}>
                <Input 
                placeholder="请输入待办事项" 
                style={{ width: '350px',marginRight: '20px' }}
                value={this.props.inputVal}
                onChange={this.props.handleChange.bind(this)} 
                />
                <Button 
                type="primary" 
                onClick={this.props.handleClick.bind(this)}>
                    添加
                </Button>
                <List
                bordered
                style={{ marginTop: '30px',width: '435px',userSelect: 'none' }}
                dataSource={this.props.data}
                renderItem={(item,index) => (
                    <List.Item onDoubleClick={this.props.handleDoubleClick.bind(this,index)}>{item}</List.Item>
                )}
                />
            </div>
        )
    }
}
//状态映射
const mapStateToProps = (state) => {
    return {
        ...state
    }
}

// 事件派发映射
const mapDispatchToProps = (dispatch) => {
    return {
        // 新增
        handleClick(){
            dispatch(ADD_TO_DATA_ACTION());
        },
        //双击删除
        handleDoubleClick(index){
            dispatch(DEL_TO_DATA_ACTION(index));
        },
        handleChange(e){
            dispatch(CHANGE_INPUTVALUE_ACTION(e.target.value));
        }
    }
}


//引入连接器后,不再是导出组件,而是导出connect(状态的映射,事件派发的映射)(组件名称)
export default connect(mapStateToProps,mapDispatchToProps)(TodoListRR);

 tips:每一个组件内都这样写吗?过于麻烦

 

后续有时间在关注redux和react-redux在企业项目上的拆分

从零开始学习CANoe(六)—— CAPL 测试节点 创建CAPL Test Module的两种方式 阅读详情

相关推荐

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6536

react项目创建及redux,react-redux安装配置

1、全局安装create-react-app 1、npm i create-react-app -g (全局安装) 2、create-react-app react-app (创建项目--项目名称-react-app) 3、cd react-app (进入项目目录) 4、npm start (运行项目) 2、安装配置redux react-redux npm i redux react-red...

weixin_41927871的博客 3196

防反接电路、防倒灌电路、过流保护和ESP相关知识

1.开关电源给负载供电, 如果负载是电池或者其他感性负载(比如像 电机 有线圈 当电源突然断掉时 会产生感应电动势)时, 当220V断掉的时候,可能会出现 电池反向给开关电源 的 输出端 供电,导致开关电源的一些莫名损坏。2.系统在不同的 输出电压 之间 切换时,会存在高压电压倒灌到低压电压源中。例如:系统 有两个电源供电 比如 一个电池 一个 充电器 充电器的电压一般会高于电池 如果没有防倒灌的电路 可能充电器的电压会直接倒灌给电池 造成电池的损坏。

a_black_的博客 1万+

redux、react-redux 基本概念

一、前言 学了这些东西后,为了加深理解故作此记录。这些仅仅是初步的概念,更详细的使用和更强大的功能还是需要看官方文档。 二、redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理 Redux 由 Flux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂性 简单的说,redux把应用的所有状态集中在一起,这样可在应用越来越大、越来越复杂时方便管理。...

啊BEN999 336

大模型技术驱动智慧矿山数字化转型

多模态大模型作为AI领域的前沿技术,通过融合视觉、传感器等多源数据,构建了强大的环境理解与决策能力。其核心价值在于打破数据孤岛,实现实时分析与智能响应,特别适用于工业场景中的复杂系统优化。在智慧矿山建设中,该技术通过数字孪生、设备自诊断和智能调度等模块,显著提升了安全生产效率和资源利用率。典型应用包括基于强化学习的采掘路径规划、多层级灾害预警体系构建,以及可自我更新的矿山知识图谱系统,这些创新正在推动传统矿业向数字化、智能化方向转型。

weixin_29061531的博客 223

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 900

React学习———Redux 、 React Redux和react-persist

【代码】React学习———Redux 、 React Redux和react-persist。

KKKKKKD的博客 1246

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 643

React学习笔记九——React-redux的使用详解

const {value} = this.selectNumberconst {count} = this.propsif(count % 2 !== 0){this.props.increment(value*1)}}incrementAscyn= () => {const {value} = this.selectNumberthis.props.incrementAsync(value*1,500)}render(){return( this.selectNumber

2401_84411557的博客 1052

Codex 自定义模型操作指南:CLI 与桌面客户端双端实操

检查版本 codex --version # 预期输出类似:codex-cli 0.133.0-alpha.1 # 如未安装 npm install -g @openai/codex假设你要接入DeepSeek,在# 临时设置(当前终端会话有效)export DEEPSEEK_API_KEY="sk-你的 DeepSeek API Key"# 永久设置(推荐,写入 shell 配置)

篮球界最会写bug的人;程序猿中打球最菜的人。 455

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 982

ReactJS学习系列课程(React Redux使用)

React 数据流动的模式的Flux模式,也就是单向数据流,这也是官方推荐的方式,其实这也是React最难理解的一部分。 为了更好的了解React-redux的使用,我们先来了解一下Redux的使用。 Redux 介绍 对于复杂的单页面应用,状态(state)管理非常重要。state 可能包括:服务端的响应数据、本地对响应数据的缓存、本地创建的数据(比如,表单数据)以及一些 UI 的状态

天外野草技术专栏 1397

200Gb/s以上速率的通道信号完整性设计和优化经验(二)

为满足200Gb/s信号完整性需求,需综合优化PCB、连接器、封装及SERDES架构。关键措施包括:采用低粗糙度铜箔与低损耗材料降低传输线损耗(200G目标0.55–0.6dB/cm);通过背钻工艺控制残桩长度至4±2mil;缩减连接器焊盘残桩至600μm以内以消除谐振;封装层面推进跳层走线、低Dk/Df材料与可控SMT工艺;采用PAM4调制与基于ADC/DSP的混合信号架构实现高效均衡。先进CMOS工艺(如纳米片器件)支撑复杂数字处理,协同设计是突破速率瓶颈的核心。

小孟同学的博客 148

【React】React学习笔记4(Redux、React-Redux)

React学习笔记3(React路由、Ant Design)零 l  说明一 l  Redux 基础(一)Redux 工作流程   零 l  说明 本文参考教程:[尚硅谷2021版React技术全家桶] 本文上接: [React学习笔记1(React概念)] [React学习笔记2(React脚手架、组件通信与网络请求库)] [React学习笔记3(React路由、Ant Design)] 一 l  Redux 基础 文档: 英文文档: https://red

weixin_42159233的博客 657

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

React-Redux 学习资源全指南:从入门到进阶

React-Redux 学习资源全指南:从入门到进阶 【免费下载链接】redux 项目地址: https://gitcode.com/gh_mirrors/red/redux ...

gitblog_00940的博客 479

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

React-Redux学习笔记

之前用react开发了一些模块,对react的使用也更加熟悉了。最近有空,来总结记录一下react相关生态,系统的梳理一下,便于更好的理解和记忆。 参考资料: React-redux框架之connect()与Provider组件 用法讲解 Redux 类比Vuex,Redux也是用来解决复杂SPA中的全局状态管理问题。通过对比来一起记忆。 三大原则: 单一数据源:整个应用只能有一个唯...

Creabine的博客 429

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

redux及react-redux的学习总结

redux

m0_46559468的博客 403

React-redux学习总结

说明 本片文档是根据React-redux中文文档学习之总结,若有不恰当之处,忘加以斧正; 前篇 上一篇中我已经介绍来Redux的一些知识概念已经总结经验,地址: Redux个人学习总结 , 这篇文章主要是讲如何在React中使用redux,redux生态中提供了Reduct-redux解决方案。 介绍 React-Redux是Redux的官方React绑定库。它能够使你的React组件从Redu...

Alecor的博客 384

关于学习react-redux的参考文档

跟着例子一步步学习redux+react-redux Redux 中文文档

qq_37822951的博客 484

redux和react-redux的学习

redux redux是什么 redux是一个独立专门用于做状态管理的js库(不是react插件库) 它可以用在react angular vue等项目中,但是基本与react配合使用(它与react契合度比较高) 作用:集中式管理react应用中多个组件共享的状态 什么时候使用redux 某个组件的状态,需要共享 某个状态需要在任何地方都可以拿到 一个组件需要改变全局状态 一个组件需要改变...

mengweizhao的博客 188

第三章 react redux的学习之redux和react-redux,@reduxjs/toolkit依赖结合使用

前面两章,我们是只使用的redux的依赖。本章使用讲述的redux,react-redux,和@reduxjs/toolkit三者结合使用。下一章,讲述的是只使用react-redux,和@reduxjs/toolkit开发页面。< Provider > 组件通过其 store prop 接收 Redux store,并将其传递给其子组件树。

yunjin0101的博客 1278

react-redux学习

目录 1.React-Redux介绍 2. React-Redux-基本使用 3.React-Redux-获取状态useSelector 4.React-Redux-分发动作useDispatch 5.理解 Redux 数据流 6.Redux应用-代码结构 7.Redux应用-ActionType的使用 8.Redux应用-Reducer的分离与合并 9.Redux应用-redux管理哪些状态 1.React-Redux介绍 目标: 能够说出为什么需要使用react-redux ..

m0_62118859的博客 638

React + Redux + React-Router的学习

本人其实是一位Java开发者、利用空余的时间学习一下前端技术。在学习的过程也遇到了不少问题、所以通过文章的方式分享给初学者。文章写得不好、请大神们多多指点。 介绍: React:React主要用于构建UI、通俗一点就是React将页面划分为多个模块、每个模块都是相互独立、每个模块就是一个组件。由多个模块拼凑成一个完整的页面。(组件:从UI界面进行分析、把一些可服用的UI元素抽取为单独的组件;便...

qq184101033的博客 363

React redux学习脑图

React Redux React-Redux学习的脑图

jojoliya的专栏 338

Redux、Redux-Thunk、Redux-Sagas、React-Redux学习笔记

Redux、Redux-Thunk、Redux-Sagas、React-Redux学习笔记 React环境配置 安装脚手架工具 npm install -g create-react-app 创建项目工程 // demo是项目名称,不能有大写字母 create-react-app demo 安装浏览器调试工具 在谷歌扩展程序中安装 React Develope...

WJ的博客 2310

React - Redux使用 - 学习/实践 - 2020-12-30

1.应用场景 主要用于学习使用redux, 以及react-redux进行前端项目开发. 2.学习/操作 1.文档阅读 https://www.redux.org.cn/ http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html https://www.redux.org.cn/docs/react-redux/ 视频资源 https://www.b

"代码"的日常搬运 603
上一篇: 【vue】change事件在保留默认形参的情况下传递自定义形参
下一篇: 【ant design vue】表格超过高度时显示滚动条
谭CV
博客等级 码龄9年 73粉丝 85原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值