React入门7-redux

本文深入讲解Redux的基本概念与工作流程,包括store、action及reducer的作用与实现方式,并通过实例演示如何在React应用中集成Redux进行状态管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.背景介绍

react是单向数据流,一级一级组件传递这个过程是不能越级的,为了解决深度嵌套, redux横空出世

2. redux

安装:npm/cnpm i redux  

(1).  分清两个state

Redux中的state和React中的state完全不是一回事,React中的state是组件内部自己的状态信息,而Redux中的state是Redux自己的数据

(2). Redux

redux工作流:

a.store

store:首先要创建一个对象store,这个对象有各种方法,用来让外界获取Redux的数据(store.getState),或者让外界来修改Redux中的数据(store.dispatch)

b.action

action:描述我要干啥,一般是一个对象的形式,其中有一个type字段是必须要有的,比如:{ type:‘撩妹’ },还可以带点数据{ type:‘交朋友’,money: 100 }

c.reducer

reducer: 根据不同的action type处理逻辑

3. React-redux

安装:npm/cnpm i react-redux 

在React-redux中有两个比较关键的概念:Provider和connect方法。

a.Provider

一般我们都将顶层组件包裹在Provider组件之中,这样的话,所有组件就都可以在react-redux的控制之下了,但是store必须作为参数放到Provider组件中去。这个组件的目的是让所有组件都能够访问到Redux中的数据。

b.connet

用法:connect(mapStateToProps, mapDispatchToProps)(MyComponent)

mapStateToProps 接收一个state,返回一个对象。 mapDispatchToProps 接收一个 dispatch 组成的对象。

4. demo使用

index.js: provider包含组件最外层,将store传给最顶级组件

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

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

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

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

store/index.js: combineReducers合并所有模块的reducer; createStore将ruduces转化为store

import {createStore, combineReducers} from 'redux'
import user from './user'
let reduces = combineReducers({
    user: user
})

export default createStore(reduces)

store/user.js: 抽象的reducer

import {SET_NAME, ADD_AGE} from '../actions'

function userReducer(state={ name: 'david', age: 18 }, action) {
    switch(action.type) {
        case SET_NAME: 
            return {
                ...state,
                name: action.name
            };
        case ADD_AGE: 
            return {
                ...state,
                age: state.age + action.age
            };
        default:
            return state;
    }
}

export default userReducer

actions.js: 定义type

export const SET_NAME = 'set_name'
export const ADD_AGE = 'add_age'

Home.js: 组件中使用connect, 可以得到redux的state,可以改变state的方法

import React, { Component } from 'react';
import {connect} from 'react-redux';
import {SET_NAME, ADD_AGE} from '../actions';

class Home extends Component {
    constructor(...args) {
        super(...args);
        this.state = {
            inputName: ''
        }
    }

    handelChangeName = (e) => {
        this.setState({
            inputName: e.target.value
        })
    }

    /**
     * @description 改变名称
     */
    changeName = (e) => {
        this.props.setName(this.state.inputName)
    }
    
    /**
     * @description 改变年龄
     */
    changeAge = (e) => {
        this.props.addAge(3)
    }

    render() {
        return (
            <div>
                <div>name: {this.props.name}</div>
                <div>age: {this.props.age}</div>
                <input type="text" placeholder="请输入名字" value={this.state.inputName} onChange={this.handelChangeName} onBlur={this.changeName}></input>
                <button onClick={this.changeAge}>+3</button>
            </div>
        );
    }
}

export default connect((state, props) => {
    return state.user
}, {
    setName(name){
        return {
            type: SET_NAME,
            name
        };
    },
    addAge(age){
        return {
            type: ADD_AGE,
            age
        };
    }
})(Home)

或者使用dispatch({type: SET_NAME, name: this.state.inputName}) 也可以达到相同的目的。

import React, { Component } from 'react';
import {connect} from 'react-redux';
import {SET_NAME, ADD_AGE} from '../actions';

class Home extends Component {
    constructor(...args) {
        super(...args);
        this.state = {
            inputName: ''
        }
    }

    handelChangeName = (e) => {
        this.setState({
            inputName: e.target.value
        })
    }

    /**
     * @description 改变名称
     */
    changeName = (e) => {
        // this.props.setName(this.state.inputName)
        this.props.dispatch({type: SET_NAME, name: this.state.inputName})
    }
    
    /**
     * @description 改变年龄
     */
    changeAge = (e) => {
        // this.props.addAge(3)
        this.props.dispatch({type: ADD_AGE, age: 3})
    }

    render() {
        return (
            <div>
                <div>name: {this.props.name}</div>
                <div>age: {this.props.age}</div>
                <input type="text" placeholder="请输入名字" value={this.state.inputName} onChange={this.handelChangeName} onBlur={this.changeName}></input>
                <button onClick={this.changeAge}>+3</button>
            </div>
        );
    }
}

// export default connect((state, props) => {
//     return state.user
// }, {
//     setName(name){
//         return {
//             type: SET_NAME,
//             name
//         };
//     },
//     addAge(age){
//         return {
//             type: ADD_AGE,
//             age
//         };
//     }
// })(Home)


export default connect((state) => {
    return state.user
})(Home)

最后推荐使用方式

import React, {Component} from 'react'
import {connect} from 'react-redux';
import {SET_NAME, ADD_AGE} from '../actions';

class Home extends Component {
    constructor(...args){
        super(...args)
        this.state = {
            inputName: ''
        }
    }

    handelChangeName = (e) => {
        this.setState({
            inputName: e.target.value
        })
    }

    render() {
        return (
            <div> dashboard
                <div>name: {this.props.user.name}</div>
                <div>age: {this.props.user.age}</div>
                <input type="text" placeholder="请输入名字" value={this.state.inputName} onChange={this.handelChangeName} onBlur={() => this.props.changeName(this.state.inputName)}></input>
                <button onClick={this.props.changeAge}>+3</button>
            </div>
        );
    }
}

// 不用装饰器设置 Redux
const mapStateToProps = (state) => {
    return { user: state.user }
}

const mapDispatchToProps = (dispatch, ownProps) => ({
    changeName: (name) => 
    {
        dispatch({type: SET_NAME, name: name})
    },
    changeAge: () => {
        dispatch({type: ADD_AGE, age: 3})
    }
})
  
export default connect(mapStateToProps, mapDispatchToProps)(Dashboard)

总结:

I. 单向数据流
state->component->action->state...

II.redux——集中状态管理
provider:包在组件最外面
connect:状态映射
reducer:状态对象
action: 状态更新

 

内容概要:本文深入解析了扣子COZE AI编程及其详细应用代码案例,旨在帮助读者理解新一代低门槛智能体开发范式。文章从五个维度展开:关键概念、核心技巧、典型应用场景、详细代码案例分析以及未来发展趋势。首先介绍了扣子COZE的核心概念,如Bot、Workflow、Plugin、Memory和Knowledge。接着分享了意图识别、函数调用链、动态Prompt、渐进式发布及监控可观测等核心技巧。然后列举了企业内部智能客服、电商导购助手、教育领域AI助教和金融行业合规质检等应用场景。最后,通过构建“会议纪要智能助手”的详细代码案例,展示了从需求描述、技术方案、Workflow节点拆解到调试与上线的全过程,并展望了多智能体协作、本地私有部署、Agent2Agent协议、边缘计算插件和实时RAG等未来发展方向。; 适合人群:对AI编程感兴趣的开发者,尤其是希望快速落地AI产品的技术人员。; 使用场景及目标:①学习如何使用扣子COZE构建生产级智能体;②掌握智能体实例、自动化流程、扩展能力和知识库的使用方法;③通过实际案例理解如何实现会议纪要智能助手的功能,包括触发器设置、下载节点、LLM节点Prompt设计、Code节点处理和邮件节点配置。; 阅读建议:本文不仅提供了理论知识,还包含了详细的代码案例,建议读者结合实际业务需求进行实践,逐步掌握扣子COZE的各项功能,并关注其未来的发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值