[一步一步学react系列] 02—计数器V0.0

2023-12-11 15:40

本文主要是介绍[一步一步学react系列] 02—计数器V0.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:
本文将写一个计数器的例子
前备知识:
react基本知识 redux的基本概念和api
技术栈:
create-react-app redux

1.环境搭建

和vue一样,react也有脚手架: create-react-app
我们将在这上面进行开发
脚手架安装:

npm install -g create-react-app  
create-react-app my-app  
cd my-app  

生成的目录结构:

|----my-app/  |----README.md  |----node_modules/  |----package.json  |----.gitignore  |----public/  |----favicon.ico  |----index.html  |----src/  |----App.css  |----App.js  //模板文件|----App.test.js  |----index.css  |----index.js  //挂载点|----logo.svg  

如上我们主要动index.js 和App.js

运行程序:

npm  start   

作为redux的入门学习例子,我们先不直接霸王硬上弓使用redux,为了熟悉redux的编写思路,我们可以自己撰写方法(function)模拟redux的设计思路。

本节模仿redux涉及的点:

|-- action
|-- state
|-- dispatch
|-- reducer

2.开始计数器demo

接下来我们在App.js写下:

//App.jsimport React, {Component} from 'react';//【3】.根据传来的不同action标识判断应该做出的反应。
//如action的type为INCREMENT时,那么做出的反应就是计算某值,
//并将该值返回做为一个新的state
//reducer
const counter = (state = { value: 0 }, action) => {switch (action.type) {case 'INCREMENT':return { value: state.value + 1 };case 'DECREMENT':return { value: state.value - 1 };default:return state;}
}class MyCounter01 extends Component {// State 初始化数据state状态constructor() {super();this.state = counter(undefined,{});}//【2】.dispatch调用counter函数【即reducer】,//参数:数据当前的状态state和action动作(该action动作以type字段为标识)dispatch(action) {//【4】.以reducer返回的新state更新状态,通过this.setState方法修改状态值this.setState(prevState => counter(prevState, action));}// Actionsincrement = () => {this.dispatch({ type: 'INCREMENT' });};decrement = () => {this.dispatch({ type: 'DECREMENT' });};//view层render() {return (<div><p>{this.state.value}</p>//【1】. 用户点击加按钮,触发this.increment函数【即action】//函数通过 this.dispatch发出action,告诉数据你应该要发生变化啦<button onClick={this.increment}>+</button><button onClick={this.decrement}>-</button></div>)}}export default MyCounter01;

代码中标的1234点就是以下工作流的具体实施过程。
本节中只需要理解
和以往的点击函数实现加减不同,react明显多了两个跳板,一步一步渐进的完成整个动作。

action状态:根据用户的操作事件分发(dispatch)动作(action),每个动作由type标识

reducer:将收到的状态分流,规定某个状态对应数据的怎么变化,并返回一个新数据state

具体根据数据变化更新数据的:this.setState()

这里写图片描述

总结

在使用redux做做状态管理的组件中,组件内部对应X个参数和X个方法。参数即为数据、状态如这里的this.state.value,方法即为用户的交互或者从外部(父组件传值或网络)获取数据。

当用户点击+按钮触发了一个方法(increment),按照以前的思路,我们会直接在这个组件里定义一个加法,让this.state.value +1. 而现在我们是使用redux做状态管理。

比喻理解开始:
背景:计算鸡王国有个县城今年粮食收成很好,本地仓库与王国仓库中心粮食存量是同步的。现在要改变本地仓库的粮食存量,同时上报计算鸡王国,实时更新王国粮食中心的粮食存量。

思路:小县城发出信号告诉粮食中心我今年收成+1啦,你们快更新仓库粮食总量,粮食中心更新之后,县城便自动更新了本地粮存。

下面我们讨论:
1. 小县城怎么告诉粮食中心的? 【组件与redux通讯的问题】
2. 县城怎么自动更新本地粮存的?【组件怎么得到redux的最新数据的】

过程如下:

* 我们的麦子量有两个:本地的state,和redux的state。本地state绑定自redux的state。我们要修改自身的state不能直接修改,即使修改了上面也不承认相当于白修改。就只能通知上面的修改,修改了之后我本地实时更新同步。
* 于是我们就发出一个信号(action),这个action的type就标识了我这个信号的意义。(相当于古代的信号弹,红色代表巴拉巴拉,绿色代表巴拉巴拉。)。
* 注意:信号的发送也是有讲究的,只能使用皇家钦定的小螺号发送!不然别人信号中转站不认你的信号即this.dispatch({ type: 'DECREMENT' })dispatch()是 View 发出 Action 的唯一方法
* 然后有个信号中转站Reducer,专门负责接收来自全国各地的信号reducer负责整合各方旧信息,处理返回新信息。它知道现有的+1操作执行之前的(旧的)state值(可以实时通讯了解到仓库里的现有麦子值)与某     个将要改变仓库状态值的信号弹的颜色(action)。于是它就去它的小本本里翻,看下这个颜色的信号弹表示什么意思,哦原来绿色表示要粮仓数要+1.于是它就将旧state+1作为new state返回。
* 然后发出信号的根源地(原组件),收到reducer返回的新state就使用this.setState改变本组件的状态。this.setState(prevState => counter(prevState, action));

以上只是一个模拟实现,目的是理解redux的数据管理思路。

真正的redux是有个store,专门生成一个数据仓库,这里模拟相当于reducer里自带仓库了。
所以也解释了为什么会出现本地state数据..(本地明明可以通过this.setState直接改啊!)

实际中我们如果要将本组件的某个状态值存入redux中(比如页面的主题色),都是通过props直接得到那个值的,不会再去修改它。如果是本组件内部的值,我们也无需将其存在redux中(存入redux的根本目的只是为了便于数据集中管理而已,出于数据复用的情况(个人理解))

所以不要再纠结为什么本地state要绕那么大一圈,费这么多周折去改这个state啦(杀鸡焉用牛刀的疑问)我们只是为了模拟redux数据管理思路而已。。这仅是演习注意注意这只是演习。。
【况且我已经很卖力地套了个生龙活虎的例子让这个模拟看上去不怎么奇怪啦~.~

备注:模拟code例子来自以下链接

从零学习react技术栈 https://yubolun.com/react-learn-3-1/

这篇关于[一步一步学react系列] 02—计数器V0.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481203

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0