React学习笔记 在todolist中加入redux

基于ROS2的实时视频流转换:image2rtsp在多路相机采集中的应用 本文详细介绍了如何在ROS2机器人系统中使用image2rtsp工具,将ROS2内部的相机图像话题实时转换为标准的RTSP视频流。重点阐述了其安装配置、核心参数调优,并提供了多路相机采集的实战方案,解决了机器人视觉数据跨平台、跨网络分发的难题,极大提升了视频流集成的部署效率。 阅读详情

在之前的学习中,我已经使用React完成了todolist,这里我要在原来的基础上加上redux
原来的todolist:React入门 制作简单的todolist
首先,通过npm 安装redux

npm i redux --save

在原来的目录基础上,添加store文件夹,放入index.js来输出store,reducer.js来输出reducer
在这里插入图片描述
在index.js中创建并输出store

import {createStore} from 'redux'
import reducer from './reducer'
const store=createStore(
    reducer,
    // 让redux-devtools得以运行
    window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__()    
);
export default store

在reducer中写入默认数据并输出修改state的纯函数

// 默认数据
const defaultState={
    inputValue:'writing something',
    contentList:[{
        id:0,
        title:'todo 1',
        completed:false
    },{
        id:1,
        title:'todo 2',
        completed:false
    }],
    count:2,
    searchWord:""
}

export default (state = defaultState,action)=>{
    // 当前还没有state,所以现在先不做任何处理直接返回state
    return state
}

因为现在我们的数据来源都是store仓库,所以把App.js中的数据和对应修改数据的方法都删除

import React from 'react';
import Header from './component/todo/header';
import Add from './component/todo/add';
import List from './component/todo/list';
import './assets/style/whole.css'

class App extends React.Component{
    render(){
        return(
            <div className="app">
                <Header />
                <Add />
                <List />
            </div>
        )
    }
}

export default App;

接下来,就是要通过发起action来修改store仓库中的state,以list.js其中一个为例
引入store

// 导入store下的index.js时可以忽略index.js不写
import store from '../../store'

在constructor中引入state数据到当前组件的state,绑定一个删除方法

constructor(props){
    super(props);
    this.state=store.getState()
    this.deleteHandle=this.deleteHandle.bind(this);
    // 订阅
    store.subscribe(this.storeChange)
}

注意这里要订阅store中state的变化,否则UI不会跟随变化
然后编写删除方法

deleteHandle(id){
    let list=store.getState().contentList;
    for(let i=0;i<list.length;i++){
        if(list[i].id===id){
            list.splice(i,1);
        }
    }
    let action={
        type:'delete',
        value:list
    }
    // 发起action
    store.dispatch(action)
}

最后在render中调用相应的方法

<button onClick={this.deleteHandle.bind(this,c.id)}>删除</button>

然后回到reducer.js中,在纯函数中对type进行判断并返回新的state

export default (state = defaultState,action)=>{
    console.log('state: ', state);
    if(action.type==='delete'){
        let newState=JSON.parse(JSON.stringify(state));
        newState.contentList=action.value;
        return newState;
    }
    return state
}

到这里删除功能完成,接下来就直接把其他代码补齐了
add.js

import React from 'react';
import '../../assets/style/whole.css'
import store from '../../store'
class Add extends React.Component{
    constructor(props){
        super(props);
        this.state={
            ...store.getState()
        }
        // 为各个方法绑定this
        this.handleChange=this.handleChange.bind(this);
        this.addContent=this.addContent.bind(this);
        // 订阅state
        store.subscribe(()=>{
            this.setState(store.getState())
        })
    }
    // 将输入的内容绑定在state的title上
    handleChange(e){
        let action={
            type:"changeTitle",
            value:e.target.value
        }
        store.dispatch(action)
    }
    // 添加内容
    addContent(){
        if(this.state.searchWord!==''){
            let content={
                title:this.state.searchWord,
                completed:false,
                id:store.getState().count+1
            }
            // 重置输入框内容
            let action={
                type:'addContent',
                value:content
            }
            store.dispatch(action)
            action={
                type:'changeTitle',
                value:''
            }
            store.dispatch(action)
        }
    }
    render(){
        return(    
            <div className="addContent">
                <input placeholder={this.state.inputValue} value={store.getState().searchWord} onChange={this.handleChange}/>
                <button onClick={this.addContent}>add</button>
            </div>
        )}
}

export default Add;

list.js

import React from 'react';
import '../../assets/style/whole.css'
// 导入store下的index.js时可以忽略index.js不写
import store from '../../store'

class List extends React.Component{
    constructor(props){
        super(props);
        this.state=store.getState()
        this.deleteHandle=this.deleteHandle.bind(this);
        this.storeChange=this.storeChange.bind(this);
        this.onCompletedChange=this.onCompletedChange.bind(this);
        // 订阅
        store.subscribe(this.storeChange)
    }
    storeChange(){
        this.setState(store.getState())
    }
    deleteHandle(id){
        let list=store.getState().contentList;
        for(let i=0;i<list.length;i++){
            if(list[i].id===id){
                list.splice(i,1);
            }
        }
        let action={
            type:'delete',
            value:list
        }
        // 发起action
        store.dispatch(action)
    }
    onCompletedChange(id){
        let list=store.getState().contentList;
        for(let i=0;i<list.length;i++){
            if(list[i].id===id){
                list[i].completed=!list[i].completed;
            }
        }
        let action={
            type:'completedChange',
            value:list
        }
        store.dispatch(action)
    }
    render(){  
        // 按列表标题的数量来渲染内容
        return(    
            <div className="contentList">
                <ul>
                    {this.state.contentList.map((c)=>{
                        return(
                            <li className="detailContent" key={c.id}>
                                <input type="checkbox" onChange={this.onCompletedChange.bind(this,c.id)}/>
                                <span className={c.completed?'haveCompleted':'notCompleted'}>{c.title}</span>
                                <button onClick={this.deleteHandle.bind(this,c.id)}>删除</button>
                            </li>
                        )
                    })}
                </ul>
            </div>
        )}
}

export default List;

reducer.js

const defaultState={
    inputValue:'writing something',
    contentList:[{
        id:0,
        title:'todo 1',
        completed:false
    },{
        id:1,
        title:'todo 2',
        completed:false
    }],
    // 计数,每次增加一个新内容时赋值给id然后加1
    count:2,
    searchWord:""
}

export default (state = defaultState,action)=>{
    console.log('state: ', state);
    if(action.type==='addContent'){
        let newState=JSON.parse(JSON.stringify(state));
        newState.contentList[newState.count]=action.value;
        newState.count++;
        newState.searchWord="";
        return newState
    }else if(action.type==='changeTitle'){
        let newState=JSON.parse(JSON.stringify(state));
        newState.searchWord=action.value;
        return newState;
    }else if(action.type==='delete'||action.type==='completedChange'){
        let newState=JSON.parse(JSON.stringify(state));
        newState.contentList=action.value;
        return newState;
    }
    return state
}

到这里就完成了在todolist中加入redux的工作了,但是在这里仍有很多可以改进的地方,action的type可以使用字符串常量,放在一个专门的文件里来管理,action的发起可以封装函数来完成,达到复用的效果
这里只是简单的完成在todolist中加入redux,所以其他的这些优化,就有待后面完成了

25 - GRACE Mascon数据缺失月份数据插值 本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。 阅读详情

相关推荐

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

redux与react的结合使用(todolist实现)

redux与react的结合使用(todolist实现) 在众多的框架中与redux结合使用的框架中,react是与其结合使用的较好的框架之一。因此将react与redux结合起来使用,对于我们来说是一个不错的选择。那么接下来就介绍两者使用的一个流程,这其中的...

domino~~的博客 773

腾讯云CodeBuddy+微信小程序:5分钟开发番茄小闹钟

番茄钟是一种简单的时间管理方法。这个方法很简单:你专注工作25分钟,然后休息5分钟。这样可以让你更专心,不容易分心,还能防止过度疲劳。 很多人用番茄钟来提高工作效率,因为它能帮助你更好地管理时间。不过,市面上的一些免费番茄钟应用常常会有广告弹出来,影响使用体验。这就是为什么我们要开发一个没有广告的番茄钟小程序,让用户可以专心工作,不被打扰。

2201_75366661的博客 1689

基于react、redux的todoLists

上篇的counter例子其实太简单,action太少,reducer也只有一个,只能说一个初窥的样例,但是这个todoLists例子应该初学redux的人最常遇见,因为其五脏虽小,但是几乎使用了redux和react-redux该使用的所有特性。 按照我的理解,使用redux起来最难的是如何定义数据结构,这个就直接决定了你的项目的可维护性,所以写的顺序应该是actions => componen

taoweiquan0910的博客 2862

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

OV-DINO的出现标志着在开放域目标检测领域的重大进步,其在处理未见过的物体类别时的能力得到了显著提升。这项技术对于需要适应未知或变化环境的应用具有重要意义,如自动驾驶、机器人视觉、安防监控等。

DeepAIedu的博客 2633

ZYNQ Linux 应用层 利用 AXI DMA 进行数据传输

ZYNQ Linux应用层 利用 AXI DMA 进行数据传输 软件版本: VIVADO2018.2 操作系统: Debian 9 硬件平台: ZYNQ-MZ7100FA 嵌入式操作系统:Debian(4.19.0-xilinx) AXI-DMA驱动:GitHub:bperez77/xilinx_axidma 一、搭建硬件环境 参见:《ZYNQ 修炼秘籍裸机篇 2019 版》第21章:CH21 利用 AXI DMA 进行批量数据环路测试 参考文章: ZYNQ跑系统 系列(四) AXI-DMA的linux下运

jin787730090的博客 1万+

使用React-redux实现小案例(todolist)的过程

使用React-redux实现,待办事项todolist案例。 注:以下列出主要页面代码,为说明React-redux实现的过程,所以并没有将案例的完整代码展示! 一、全局安装:rudux、react-redux npm install redux --save npm install react-redux 二、主要代码: 1、项目的入口文件index.js import React from...

WhyBecause的博客 1358

硬核拆解华为/大疆/小米硬件面试真题:手撕电路+考点思维导图(附答案)

设计一个增益为20dB、带宽≥100kHz的同相放大器,电源电压±5V,要求输出摆幅≥8V。12位ADC的参考电压2.5V,输入信号1kHz正弦波,峰峰值2V。输入24V转5V/10A的同步降压电路,开关频率500kHz,计算MOSFET的损耗并选择型号(需提供TI官网截图)。设计无人机图传系统,要求1080P@30fps,传输距离2km。FPGA设计中,100MHz时钟域到50MHz时钟域传输32位数据,给出同步方案并画时序图。“设计一个输入12V、输出5V/3A的同步降压电路,给出关键参数计算”

qq_63103361的博客 3539

react-redux实现todolist功能

一、redux介绍 2014年 Facebook 提出了 Flux 架构的概念,引发了很多的实现。但是使用中发现很多不完美的地方,2015年,Redux 出现将 Flux 与函数式编程结合一起,关系如下: 1、引入redux yarn add redux 2、store 即store/index.js,该导出的store对象包含所有数据。如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。当前时刻的 State,可以通过store.getState

一杯清泉 1100

别再为模糊的3D重建头疼了!手把手教你用3DSlicer处理DICOM数据,搞定医学影像三维可视化

本文详细解析了医学影像三维重建中常见的模糊问题,并手把手教你使用3DSlicer处理DICOM数据,实现精准的三维可视化。从层厚设置到数据格式转换,再到重建算法选择和渲染参数微调,提供了一套完整的优化方案,特别适合临床医生和医学影像处理人员提升工作效率。

weixin_28693447的博客 251

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2472

通过 todoList 搞懂 redux

React中的数据传递是从根节点开始,一级一级的向下传递, 相邻较远的组件之间的数据进行交流 就需要一个漫长的传递数据的过程, 为了解决这个问题, 便有了 Redux。 简而言之, Redux 是一个状态管理工具。 Rudux中有一个存储数据的 store, 这个 store 是独立于React组件之外的,每一个组件都可以直接拿到和修改store中的数据, 就不需要把数据传来传去了。 我们通过 一...

weixin_34138377的博客 146

基于STM32L4XX、HAL库的 L76KB-A58定位模块驱动程序设计

/ 确保字符串终止。// 缓冲区溢出,重置。// 重置缓冲区索引。支持GPS、GLONASS、Galileo、北斗和QZSS多系统定位。case 1: // UTC时间。// 配置GPS模块(可选)// 查找GGA语句。// 启动UART接收。// USART1初始化函数。内置LNA和SAW滤波器。

zhusl6688的博客 350

使用react-redux实现todoList

使用react-redux实现todoList 一、Redux作用 统一状态管理,将分散在各个组件中的状态全部放在统一的store对象中进行管理,适用于状态特别分散、状态共用较多、状态传递较深的情形。 二、安装 1.创建项目 yarn init create-react-app todolist 2.安装redux yarn add redux redux-chunk 3.目录结构规划 src | -| commponents -| store App.js index.css in

技术无止境,人生仍探索。 1751

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

react--redux+antd实现todoList

react--redux+antd实现todoList

冷月心的博客 1733

Camera2Demo

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

react-redux 优化简单的todolist

react-redux 优化简单的todolist 为了更好的上手redux我们之前坐个redux实现的redux,那么可能很容易的感受到其中的繁琐,为了解决开发的繁琐,达到快速开发的目的,我们一般会使用react-redux插件,它可以简化Redux流程 我这里只是简单展示一个使用方法,更多内容可以查阅官方文档 安装:npm install --save react-redux 安装官方文档都......

pz1021的博客 1488

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

React 16 学习笔记(一)使用 Redux react-redux TodoList

React 16 学习笔记(一)使用 Redux react-redux TodoList 使用create-react-app创建React项目 在指定目录使用如下命令创建项目todolist create-react-app todolist 安装redux yarn add redux 安装react-redux yarn add react-redux 修改目录 剔除不需要的文...

C_SF_C 648

react Redux 用Redux中央仓库实现一个todolist,字节前端面试必问

资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**[外链图片转存中…(img-HYINMP5S-1711576441354)][外链图片转存中…(img-RmUW6IUJ-1711576441355)]

m0_60607895的博客 806

React中的Redux

文章目录Redux1、什么是Redux2、配置Redux3、TodoList案例4、Redux-thunk中间件5、Redux中间件执行原理6、react-redux7、数据持久化7.1、基本用法7.2、整合react-redux Redux 1、什么是Redux Redux 是React生态中重要的组成部分。很多人都说,简单的应用可以不用此工具。但是我个人认为,中小型应用使用的话,可以使文件结构更加规范,代码可读性更强。因为React提出将展示组件与容器组件分离的思想,所以降低了React 与Redux之

Mr-yang的随笔 3422

react-redux实现TodoList小案例

React-Redux是一个React生态中常用组件,它可以简化Redux流程。(需要注意的是概念:React、Redux、React-redux是三个不同的东西) 1、安装react-redux依赖 npm install --save react-redux 2、<Provider>提供器 <Provider>是一个提供器,只要使用了这个组件,组件里边的其它所有组件都可以使用store了,这也是React-redux的核心组件了 3、connect连接器 如何简

weixin_43177685的博客 525

todoList加入redux

//创建store import {createStore } from 'redux' import todoApp from './reducer/index' let store = createStore(todoApp, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSI...

HH 244

React+Hook+Redux+Ant-d+TypeScript实现TodoList

前言 博主在学习React Hook的时候遇到了一些坑,比如整合 redux 的时候,网上的方案大多不可用,要么就是过时了,踩了很多坑,最后终于实现了。特写了一篇博客记录下来。避免再次踩坑。 项目搭建 首先创建一个React+TypeScript 的项目,根据 官方文档 的说明,目前为止最新的创建方法为: npx create-react-app my-app --template typescript 然后删除不必要的文件及index.html中不必要的代码(非强制,可删可不删),然后创建一些文件,最终使

马旭辉博客 1121

React+Redux+AntD搭建TodoList应用

最近一直在学React,它是一款前端的,用于构建用户界面的JavaScript库,它的好处就是将界面拆分成一个个组件,然后进行组合,比较适合于模块化编程。但是组件之间的数据管理却没有一个好的解决方案,特别是对于组件之间层次比较深,数据之间传递还是很麻烦的,所以有了Redux,它主要职责就是多页面数据存储,使用时候会构建一个中心store,所有数据都会以state形式存放于store中,界面中只需要...

夏的专栏 863

React redux配置 使用react-redux redux-saga 实现todolist (一)

使用 redux 进行统一状态管理,实现 todolist 功能 # 安装 redux react-redux yarn add redux react-redux @types/react-redux # 安装 redux-devtools-extension yarn add redux-devtools-extension @types/redux-devtools-extension...

BradyCC的博客 524

React+Redux实现简单的Todolist(增、删、完成、localstorage)

React+Redux实现简单的Todolist,功能包括:通过回车与增加按钮对于事件的增加,点击删除按钮的单删功能,点击按钮使事件在完成与未完成间转换,一键删除所有事项,localstorage的本地保存。

weixin_43648936的博客 971

react Redux 用Redux中央仓库实现一个todolist

antd’ //引入input组件//无状态组件 提高性能 将组件改造成函数return (增加[外链图片转存中…(img-4G3cBlZe-1718716930962)]

2401_84438488的博客 667
上一篇: React学习笔记(九)refs 获取DOM节点/自定义组件的实例
下一篇: React学习笔记--在组件化开发中使用redux
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值