React-Redux 对Todolist修改

在单独使用redux的时候 需要手动订阅store里面 感觉特别麻烦 不错的是react有一个组件可以帮我们解决这个问题, 那就是react-redux

react-redux提供了Providerconnent给我们使用。

先说一下几个重点知道的知识

  1. Provider 就是用来提供store里面的状态 自动getState()
  2. connent 用来连接store里面的状态
  3. 为什么要使用connect连接Store 手动subscribe会导致性能上的消耗 手动订阅也不太优雅
  4. 想要使用store里面的数据需要Provider组件包裹
  5. 并不是所有的组件都需要搭配redux使用。要区分不同组件的作用。例如: ui组件 不需要 作用是描述ui的骨架、容器组件 描述如何运行(数据获取、状态更新)可以使用

话不多说,直接实战

首先安装 yarn add react-redux

我们前面说了 子组件想要使用store里面的数据 得先使用Provider进行包裹

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Provider } from 'react-redux';
import store from './store';

// 将Provider作为根组件 并提供store给子组件使用
ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>
    , document.getElementById('root'));

虽然已经提供了store里面的状态 但是子组件还是没有状态,正常的话需要手动订阅store里面的改变 当使用了react-redux之后 直接使用connent连接store做映射就 可以直接注入到props里面

todolist.js

class TodoList extends React.Component {
    componentDidMount() {
        // 获得映射的dispatch
      fetch('http://jsonplaceholder.typicode.com/posts').then((res) => {
                return res.json()
            }).then(res => {
                this.props.getList(res);
            })
        }
    

    deleter = (index) => {
        this.props.delete(index);
    };

    add = () => {
        this.props.create();
    };

    change = (e) => {
        this.props.change()
    };
    
    render() {
        const {
            list
        } = this.props.add;

        const {
            name
        } = this.props.deleter;

        return (
            <div>
                <h1>{name}</h1>
                <button onClick={this.add}>增加</button>
                <button onClick={this.change}>change</button>
                {
                    list.map((item, index) => {
                        return <div key={item.id} style={{display: 'flex', justifyContent: "center"}}>
                            <div>{item.title}</div>
                            <div>{item.userId}</div>
                            <button onClick={this.deleter.bind(this, index)}>删除</button>
                        </div>
                    })
                }
            </div>
        );
    }
}

// 对store里面的状态做一个映射。注入到连接组件的props
const mapStateToProps = (state) => {
    // 是走过reducers的state
    return state;
};

// 传入了这个参数 则连接的组件props里面将不存在dispatch方法  直接将action写在此方法里面  传入到props 会自动dispatch
const mapDispatchToProps = (dispatch) => {
    return {
        create: () => {
            dispatch({
                type: 'addTodoList',
                payload: {
                    id: 4,
                    name: '赵六',
                    age: 1
                }
            });
        },
        delete: (index) => dispatch({
            type: 'deleteTodoList',
            payload: index
        }),
        change: () => dispatch({
            type: 'change',
            payload: '王五'
        })
    };
};

// mapDispatchToProps还可以换一种形式写
const mapDispatchToProps1 = {
    create: () => ({
        type: 'addTodoList',
        payload: {
            id: 4,
            name: '赵六',
            age: 1
        }
    }),
    delete: (index) => {
        return {
            type: 'deleteTodoList',
            payload: index
        };
    },

    change: () => ({
        type: 'change',
        payload: '王五'
    }),

    getList: (data) => {
        return {
            type: 'getList',
            payload: data
        };
    }
};



// connect() 方法的返回是一个函数 需要传递一个被包裹的组件 可以得知 connect是HOC高阶组件
// 如果你的actions是通过导出形式 还可以换着写 increment只要是函数 返回的是action就会被自动dispatch
// 第二个参数可以是action creator
// export default connect(mapStateToProps, {increment, decrement})(TodoList)

export default connect(mapStateToProps, mapDispatchToProps)(TodoList)

注意

  • 千万connent参数顺序不要写反
  • mapStateToProps 如果不传递的话 props里面是没有数据的
  • 传递了mapDispatchToprops props里面是没有dispatch函数的 如果不传这个函数的话比较自由 dispatch可以随意使用

效果

react-redux实现效果
参考来源:憧憬在 aoppp.com发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL——视图(VIEW)详解

今天我们一起来学起视图(VIEW)&#xff0c;那么视图是什么呢&#xff1f;视图有什么作用呢&#xff1f;视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图&#xff01;带着问题一起来寻找答案吧~~~ 1. 常见的数据库…

Zookeeper概述

​ ZooKeeper概述 ZooKeeper是什么 zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现&#xff0c;是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。提供了基于类似Unix系统的目录节点树方式的数…

python3 爬虫相关学习9:BeautifulSoup 官方文档学习

目录 1 BeautifulSoup 官方文档 2 用bs 和 requests 打开 本地html的区别&#xff1a;代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1BeautifulSoup(html1,"lxml") 2.3 用requests打开 本地 h…

【默认端口】市面上各种中间件、软件、服务的默认端口汇总

常用软件&#xff0c;中间件&#xff0c;服务的默认端口汇总 常用软件默认端口汇总 市面上各种中间件、软件和服务的默认端口众多&#xff0c;下面列举一些常见的默认端口&#xff1a; SSH&#xff08;Secure Shell&#xff09;&#xff1a;22 Telnet&#xff1a;23 FTP…

赛宁网安助力智能网联汽车发展 | “饶派杯”XCTF车联网安全挑战赛圆满收官

​​ 2023年5月31日&#xff0c;“饶派杯”XCTF车联网安全挑战赛在江西省上饶市圆满落幕。本次大赛特邀国内21支精英战队参与比拼&#xff0c;参赛选手覆盖全国知名高校、自动驾驶汽车和科研院所等车联网安全人才。最终&#xff0c;经过9个小时激烈角逐&#xff0c;来自南京邮电…

后端(二):Servlet

我们上一张聊的是Tomcat&#xff0c;它其实就是一个 HTTP 服务器&#xff0c;而Servlet 是基于 Tomcat 的 原生api &#xff0c;除了 Servlet&#xff0c;后面还有聊到很多 api 。 Servlet 是什么 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xf…

动态规划算法(多状态dp1)

动态规划算法专辑之多状态dp问题&#xff08;1&#xff09; 一、什么是多状态 多状态dp问题&#xff0c;指一个规模问题下存在多种状态&#xff0c;我们需要联合关注多种状态间的相互转移&#xff0c;才可以求解目的问题。 多状态问题可以理解为有限状态机&#xff0c;在有限…

centos 7 安装git并配置ssh

一、安装 1、查看是否安装git <span style"color:#333333"><span style"background-color:#ffffff"><code class"language-perl">rpm -qa|<span style"color:#0000ff">grep</span> git </code>…

边缘检测笔记

边缘是什么&#xff1f; 图像的边缘是指图像局部区域中亮度变化明显的部分&#xff0c;边缘位于像素的灰度值产生突变的地方。 边缘的正负之分&#xff1a;由暗到亮为正&#xff0c;由亮变暗为负。 图像的高频信号和低频信号 简单理解为&#xff0c;图像中高频分量&#xff08…

mcu:利用Cortex-M中的DWT实现高精度计时

1、Cortex-M中的DWT 在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace)&#xff0c;是用于系统调试及跟踪。 它有一个32位的寄存器叫CYCCNT&#xff0c;它是一个向上的计数器&#xff0c;记录的是内核时钟运行的个数&#xff0c;内核时钟跳动一次&#xff0c;该计数器…

YOLOV5 训练

YOLOV5训练过程 CUDA 和cuDnnan 安装教程 windows上安装可以参考这篇知乎文章 数据集准备 自己准备数据集 可以使用 labelImg 工具&#xff0c;直接 pip install labelimg 就可以安装了。 命令行中输入 labelImg 就可以运行 标注数据的输出结果有多种过格式&#xff0c;V…

前端什么最难学?

前言 个人认为是JS&#xff0c;无论是在平时的项目或者找工作时候JS都是大头&#xff0c;相比起其他的部分&#xff0c;它相对而言是难一点&#xff0c;同时也是十分重要的一部分&#xff0c;学好原生JS&#xff0c;后续的学习才能基于此循序渐进&#xff0c;下面是我总结的关…

GIT学习笔记

团队使用GIT有些时间了&#xff0c;也遇到一些问题&#xff1a; 遇到大量冲突&#xff0c;解决完之后&#xff0c;没有修改的代码也变成蓝色了&#xff0c;如果不push&#xff0c;代码将会丢失代码丢失&#xff08;具体情况&#xff0c;我暂时记不清了&#xff09;git push失败…

数据库入门下篇(如何安装和登录MYSQL数据库)

在这篇文章里&#xff0c;笔者将着重讲解如何在win和Linux系统上安装自己的MySQL数据库软件&#xff0c;以及安装好数据库软件后如何启动和登录&#xff0c;忘了密码怎么办&#xff1f;如何创建一个数据库&#xff0c;如何在数据库中创建一个表等内容 目录 在windows系统上安装…

HNU计算机体系结构-实验一:RISC-V指令理解

HNU计算机体系结构-实验一 前言1.实验目的2.实验步骤1.安装模拟器Ripes2.生成汇编指令3.思考问题1&#xff09;指令add x15, x14, x152&#xff09;指令bge x15 x14 -683&#xff09;指令lw x15, -20 x84&#xff09;指令sw x15, -20 x85&#xff09;简述BranchE信号的作用6&am…

中级前端笔试面试题总结

typeof null 的结果是什么&#xff0c;为什么&#xff1f; typeof null 的结果是Object。 在 JavaScript 第一个版本中&#xff0c;所有值都存储在 32 位的单元中&#xff0c;每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的…

(浙大陈越版)数据结构 第三章 树(中) 二叉搜索树和平衡二叉树

目录 4.1.1 二叉搜索树及查找 什么是二叉搜索树 定义 二叉搜索树特殊函数集&#xff1a; 查找操作&#xff1a;Find 算法思想 代码实现 补&#xff1a;查找最大和最小元素 4.1.2 二叉搜索树的插入 插入操作&#xff1a;Insert 算法思想 代码实现 例题 4.1.3 二叉…

吴恩达老师《机器学习》课后习题1之线性回归

在学习这些内容之前&#xff0c;需要学习python数据分析相关内容&#xff1a; numpy&#xff1a;科学计算库&#xff0c;处理多维数组&#xff0c;进行数据分析 pandas&#xff1a;基于numpy的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的 matplotlib&#xff1a…

如何进行微服务测试?

微服务测试是一种特殊的测试类型&#xff0c;因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤&#xff1a; 1. 确定系统架构 了解微服务架构对成功测试至关重要。确定每个微服务的职责、接口、依赖项和通信方式。了解这些信息可以帮助您更好地规划测试用例和测…

Aop详解

AOP简介 AOP是一种编程思想&#xff0c;就如同面向对象这种编程思想一样&#xff0c;是一种编程范式&#xff0c;用来指导开发者如何组织程序更好的运行 AOP&#xff08;面向切面编程&#xff09; 作用&#xff1a;在不改变原代码的前提下&#xff0c;为其增加功能。 连接点…