【前端】react and redux教程学习实践,浅显易懂的实践学习方法。

简介: 前言   前几天,我在博文【前端】一步一步使用webpack+react+scss脚手架重构项目 中搭建了一个react开发环境。然而在实际的开发过程中,或者是在对源码的理解中,感受到react中用的最多的,就是redux了,于是打开文档学习了一番。

前言

  前几天,我在博文【前端】一步一步使用webpack+react+scss脚手架重构项目 中搭建了一个react开发环境。然而在实际的开发过程中,或者是在对源码的理解中,感受到react中用的最多的,就是redux了,于是打开文档学习了一番。在这里做一些记录。

redux概念

  redux是什么?它是用来管理状态的。在react开发中,我们经常会遇到一种情况,组件与父组件之间的通信,组件与组件之间的通信,

其中组件与父组件的通信通过props来完成。

  

/***********parent****************/
<Number
            value={this.state.number}
        />

/***********number****************/
<div >{this.props.value}</div>

number内部使用props获取父组件自己的state,通过setState更改父组件的state.number可以实现number组件的实时更新。

那么组件与组件之间的通信呢?例如我们有a,b两个组件,现在a要给b转发一个激活状态active,一般思路是,在同一个父组件下,使用props传递回调函数的方式。

/*********组件 a**********/
class A{
    .....
    changeActive(){
        this.props.changebActive();
    }
    render(){
        return <button onClick={this.changeActive}></button>
    }
}
/*********组件 b**********/
class B{
    render(){
        return <div>状态:{this.props.active}</div>
    }
}
/*********组件 parent**********/
class parent{
    ......
    changebActive(){
        this.setState({
            active:"开启"
        })
    }
    render(){
        return <div>
                <A
                    changebActive={this.changebActive.bind(this)}
                />
                <B
                    active={this.state.active}
                />
            </div>
    }
}

 

通过A点击调用到parent的 changebActive方法,设置state更新b,这种方式非常容易使项目变得不可预测,并且state管理复杂,没错,redux很大程度就是用来解决这个问题的,它在react中的思想是:

将组件状态统一放到同一个超级父组件,再由这个超级父组件用更专业的方法分发props给所有的子组件,无论嵌套多少层。由超级父组件统一管理应用中所有的state。

---这就是redux。无论api名词如何晦涩难懂,它的核心思想是在开发中浮现的。

 

redux的API

  一、所有的状态,保存在一个对象里面。

    所有的状态都保存在一个对象里面,redux基本三大原则之一,单一数据源,一个应用所有的状态被保存在一个对象里,这个对象通过store管理,想象一下,整个页面的状态被存储在一个对象里面,其实类似一个配置文件,你可以从服务器读取,可以从任何地方改变。view则是同步的,这看起来更精炼不是么。

  二、store

  Store 就是保存状态数据对象的地方,你可以把它看成一个容器。整个应用只能有一个 Store。

Redux 提供createStore这个函数,用来生成 Store。createStore传入了一个函数这个函数将接收到两个参数,一个state,一个action,action就是由子组件发出的更改请求,state就是那个单一的state对象。

import { createStore } from 'redux';
const store = createStore(fn);

  三、action

发起状态改变的起点是action,由子组件发出action,子组件通过props调用回调函数,通知父组件发出action。

触发:

store.dispatch(action);

  

 

  四、store.dispatch

  这个方法就是发出action的方法,一般传入action,调用这个方法之后,会触发在createStore中传入的函数。

  五、store.getState

   它用来获取当前的state对象

  六、reducer

这个就是createStore中传入的函数的名词解释,这个函数的执行必须返回一个新的state:

export default (state={number:0},action)=>{//每次调用都会传入state和当前通知的action
    switch(action.type){
        case "NUMBER_ADD": //发过来的action如果是NUMBER_ADD 就返回number++
            state.number++;
        break;
        case "NUMBER_LESS":
            state.number--;
        break;
    }
    return Object.assign({},state); //必须返回一个新的state ,可以使用assign合并 
}

注意这里用了es6,给state添加了一个默认值,{number:0}。

  六、store.subscribe()

 Store 允许使用store.subscribe方法设置监听函数,一旦 State 发生变化,就自动执行这个函数。

import { createStore } from 'redux';
const store = createStore(reducer);

store.subscribe(render);

比如上面我在生成store传入reducer函数之后,使用store.subscribe()设置监听函数为render,则每次state改变了,就会执行render函数,刷新视图。

概念名词太多,不如实践

  实践一个number输入框的加减组件,你就能大概知道redux究竟是怎么工作的。

  一、准备

    首先你需要搭建一个react的开发环境,需要一个index.html 输出目录等。详见我的另一篇博文:【前端】一步一步使用webpack+react+scss脚手架重构项目  。

然后你需要一定的react开发实践,React有props和state两个属性: props意味着父组件分发下来的属性,state意味着组件内部可以自行管理的状态,并且整个React没有数据向上回溯的能力,也就是说数据只能单向向下分发,或者自行内部消化。

理解这个是理解React和Redux的前提。

  你需要npm安装redux:

    num install redux react-redux --save-dev

  二、代码

  1.number.js

   

import React,{Component} from "react";

const propTypes = {
    add:React.PropTypes.func.isRequired,
    less:React.PropTypes.func.isRequired,
    value:React.PropTypes.object.isRequired
}
class Number extends Component{
    add(){
        this.props.add({type:"NUMBER_ADD"}) //调用app.js中传过来的箭头函数,传入了type为NUMBER_ADD的action
    }
    less(){
        this.props.less({type:"NUMBER_LESS"})
    }
    render(){
        return <div>
                    <input type="text" value={this.props.value.number}/>
                    <button onClick={this.add.bind(this)}>
                        +
                    </button>
                    <button onClick={this.less.bind(this)}>
                    -
                    </button>
                </div>
    }
}
Number.propTypes = propTypes;
export {Number};

注意那两个click回调,发出了action,以及那个this.props.value.number的引用,props传入了state,获取了state.number

2.app.js

import React from "react";
import ReactDOM from "react-dom";

import {createStore} from "redux"; //导入createStore 

import {Number} from "./number.js";  
import reducers from "./reducers.js";    
const store = createStore(reducers); //生成store

const content = document.querySelector(".content");
const render = ()=> ReactDOM.render(
    <div>
        <Number
            value={store.getState()}
            add={(action)=>store.dispatch(action)}  //传入一个函数,传入发送过来的action,由reducers处理之后返回state,
            less={(action)=>store.dispatch(action)}
        />
    </div>,
    content
);
render();
store.subscribe(render); //在reducers处理之后,返回了state,然后触发了render,更新视图

3.reducers.js

export default (state={number:0},action)=>{//每次调用都会传入state和当前通知的action
    switch(action.type){
        case "NUMBER_ADD": //发过来的action如果是NUMBER_ADD 就返回number++
            state.number++;
        break;
        case "NUMBER_LESS":
            state.number--;
        break;
    }
    return Object.assign({},state); //必须返回一个新的state ,可以使用assign合并 
}

这就是createStore传入的函数,当发出action,store会自动调用它传入state,action 返回了一个新的state.

Redux 的基本用法就介绍到这里,下一篇介绍它的高级用法:中间件和异步操作。为什么是下一篇?因为我也还没学。

资源

  阮一峰的教程

  number——demo的github

  知乎上大神对redux的易懂解读

--------------------------------

转载必须在页头注明出处,此前多文章被转载不署名,自重

======================================================== 转载请注明出处。
目录
相关文章
|
3月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
25 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
DeepSeek Artifacts是Hugging Face推出的免费AI编程工具,基于DeepSeek V3,支持快速生成React和Tailwind CSS代码,适合快速原型开发和前端组件构建。
883 39
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
|
1月前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
112 26
|
3月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
274 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
编解码 前端开发 开发者
探索无界:前端开发中的响应式设计深度实践与思考###
本文将带你领略响应式设计的精髓,一种超越传统页面布局限制的设计策略,它要求开发者以灵活多变的思维,打造能够无缝适应各种设备与屏幕尺寸的Web体验。通过深入浅出的讲解、实际案例分析以及技术实现细节的探讨,本文目的是激发读者对于响应式设计深层次的理解与兴趣,鼓励在实际应用中不断创新与优化。 ###
110 10
|
3月前
|
编解码 前端开发 开发者
前端开发中的响应式设计实践
前端开发中的响应式设计实践
|
3月前
|
前端开发 JavaScript 开发者
使用React和Redux构建高效的前端应用
使用React和Redux构建高效的前端应用
70 1
|
3月前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计哲学与实践####
本文不拘泥于传统摘要的框架,而是以一种对话的方式,引领读者踏入响应式设计的奇妙世界。想象一下,互联网如同一片浩瀚的海洋,而网页则是航行其中的船只。在这片不断变化的海域中,如何让我们的“船只”既稳固又灵活地适应各种屏幕尺寸和设备?这正是响应式设计的魅力所在。通过深入浅出的探讨,我们将一同揭开它背后的哲学思想与实战技巧,让你的网页在任何设备上都能展现出最佳姿态。 ####
47 0
|
3月前
|
前端开发 JavaScript 算法
探索现代前端框架——React 的性能优化策略
探索现代前端框架——React 的性能优化策略
42 0

热门文章

最新文章

  • 1
    【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    详解智能编码在前端研发的创新应用
  • 6
    巧用通义灵码,提升前端研发效率
  • 7
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目