返回顶部
首页 > 资讯 > 精选 >使用react和redux怎么实现一个计数器功能
  • 231
分享到

使用react和redux怎么实现一个计数器功能

2023-06-15 08:06:49 231人浏览 独家记忆
摘要

本篇文章给大家分享的是有关使用React和redux怎么实现一个计数器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Redux,本身就是一个单纯的状态管理者,我们不追溯它的

本篇文章给大家分享的是有关使用React和redux怎么实现一个计数器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Redux,本身就是一个单纯的状态管理者,我们不追溯它的历史,从使用角度来说:它提供一个全局的对象store,store中包含state对象用以包含所有应用数据,并且store提供了一些reducer方法。这些方法可以自定义,使用调用者得以改变state的值。state的值仅为只读,如果需要更改则必须只能通过reducer。

Redux

  • 核心对象:store

  • 数据存储:state

  • 状态更新提交接口:==dispatch==

  • 状态更新提交参数:带type和payload的==Action==

  • 状态更新计算:==reducer==

  • 限制:reducer必须是纯函数,不支持异步

  • 特性:支持中间件

React + Redux

在recat中不使用redux 时遇到的问题

在react中组件通信的数据是单向的,顶层组件可以通过props属性向下层组件传递数据,而下层组件不能向上层组件传递数据,要实现下层组件修改数据,需要上层组传递修改数据的方法到下层组件,当项目越来越的时候,组件之间传递数据变得越来越困难

使用react和redux怎么实现一个计数器功能

在react中加入redux 的好处

使用redux管理数据,由于Store独立于组件,使得数据管理独立于组件,解决了组件之间传递数据困难的问题

使用react和redux怎么实现一个计数器功能

使用redux

下载redux

npm install redux react-redux

redux 工作流程

  1. 组件通过 dispatch 触发action

  2. store 接受 action 并将 action 分发给 reducer

  3. reducer 根据 action 类型对状态进行更改并将更改后的数据返回给store

  4. 组件订阅了store中的状态,store中的状态更新会同步到组件

使用react和redux怎么实现一个计数器功能

使用react+redux实现计数器

创建项目,并安装 redux

# 如果没有安装react脚手架则执行这条命令安装reate脚手架npm install -g create-react-app# 创建reate项目create-react-app 项目名# 进入项目cd 项目名# 安装 reduxnpm install redux reate-redux

引入redux,并根据开始实现的代码在react中实现计数器

//index.jsimport React from 'react';import ReactDOM from 'react-dom';import App from './App';import { createStore } from 'redux';const initialState = {  count: 0}function reducer(state = initialState, action) {  switch (action.type) {    case 'increment':      return {        count: state.count + 1      }    case 'decrement':      return {        count: state.count - 1      }    default:      return state  }}const store = createStore(reducer)const increment = {  type: 'increment'}const decrement = {  type: 'decrement'}function Count() {  return <div>    <button onClick={() => store.dispatch(increment)}>+</button>    <span>{store.getState().count}</span>    <button onClick={() => store.dispatch(decrement)}>-</button>  </div>}store.subscribe( () => {  console.log(store.getState())  ReactDOM.render(    <React.StrictMode>      <Count />    </React.StrictMode>,    document.getElementById('root')  );})ReactDOM.render(  <React.StrictMode>    <Count />  </React.StrictMode>,  document.getElementById('root'));

明显以上方式虽然可以实现计数器的功能,但在实际项目中肯定不能这样使用,因为组件一般都在单独的文件中的,这种方式明显在其他组件中并不能获取到Store。

计数器案例代码优化-让store全局可访问

为了解决Store获取问题需要使用react-redux来解决这个问题,react-redux给我们提供了Provider组件和connect方法

Provide 组件

是一个组件 可以吧创建出来的store 放在一个全局的地方,让组件可以拿到store,通过provider组件,将 store 放在了全局的组件可以够的到的地方 ,provider要求我们放在最外层组件

connect

connect 帮助我们订阅store中的状态,状态发生改变后帮助我们重新渲染组件

通过 connect 方法我们可以拿到 store 中的状态 把 store 中的状态映射到props中

通过 connect 方法可以拿到 dispatch 方法

connect 的参数为一个函数 这个函数可以拿到store中的状态,要求我们这个函数必须返回一个对象,在这个对象中写的内容都会映射给组件的props属性

connect 调用后返回一个函数 返回的这个函数继续调用需要传入组件告诉connect需要映射到那个组件的props

新建 Component 文件夹、创建 Count.js 文件

import React from 'react'function Count() {    return <div>        <button onClick={() => store.dispatch(increment)}>+</button>        <span>{store.getState().count}</span>        <button onClick={() => store.dispatch(decrement)}>-</button>    </div>}export default Count

引入 Provider 组件放置在最外层,并制定store

ReactDOM.render(  // 通过provider组件 将 store 放在了全局的组件可以够的到的地方  provider要求我们放在最外层组件  <Provider store={store}><Count /></Provider>,  document.getElementById('root'));

引入 connect 方法 根据 connect 的使用来包裹组件

const mapStateProps = state => ({    count: state.count,    a: '1'})// connect 的参数为一个函数 这个函数可以拿到store中的状态,要求我们这个函数必须返回一个对象,在这个对象中写的内容都会映射给组件的props属性// connect 调用后返回一个函数 返回的这个函数继续调用需要传入组件告诉connect需要映射到那个组件的propsexport default connect(mapStateProps)(Count)

改造 Count 组件把 action 复制到该文件中

const increment = {    type: 'increment'}const decrement = {    type: 'decrement'}function Count({count,dispatch}) {    return <div>        <button onClick={() => {dispatch(increment)}}>+</button>        <span>{count}</span>        <button onClick={() => {dispatch(decrement)}}>-</button>    </div>}

现在项目已经可以运行了但是Count组件中的 提交Action的那一长串代码影响视图的可读性,所以代码还是需要优化

计数器案例代码优化-让视图中的代码可读性更高

我们希望视图中直接调用一个函数这样视图代码可读性强,这个需要利用connect的第二个参数,第二个参数是一个函数,这个函数的形参就是dispatch方法,要求这个函数返回一个对象,返回的这个对象中的内容都会映射到组件的props属性上

申明一个变量为connect中的第二个参数,在这个变量中返回执行不同action操作的对象

// connect 的第二个参数 这个参数是个函数 这个函数的形参就是dispatch方法 要求返回一个对象 这个对象中的属性会被映射到组件的props上const mapDispatchToProps = dispatch => ({    increment (){        dispatch({            type: 'increment'        })    },    decrement (){        dispatch({            type: 'decrement'        })    }})// connect 的参数为一个函数 这个函数可以拿到store中的状态,要求我们这个函数必须返回一个对象,在这个对象中写的内容都会映射给组件的props属性// connect 调用后返回一个函数 返回的这个函数继续调用需要传入组件告诉connect需要映射到那个组件的propsexport default connect(mapStateProps, mapDispatchToProps)(Count)

在组件中结构props在视图中直接绑定事件

function Count({count,increment,decrement}) {    return <div>        <button onClick={increment}>+</button>        <span>{count}</span>        <button onClick={decrement}>-</button>    </div>}

通过这次优化我们发现 调用 dispatch 触发action 的方法的代码都是重复的,所以还需要继续优化

优化调用 dispatch 触发action 的方法的重复代码简化

利用 bindActionCreators 来简化 dispatch 触发 action的操作,bindActionCreators来帮助我们生成执行action动作的函数

bindActionCreators 有两个参数,第一个参数为 执行action的对象,第二个参数为 dispatch方法

分离action操作,新建store/actions/counter.actions.js文件把执行action操作单独放在这个文件并导出

export const increment = () => ({type: 'increment'})export const decrement = () => ({type: 'decrement'})

在Count.js中导入关于计数器的action,用bindActionCreators方法来生成dispatch执行action函数

import { bindActionCreators } from 'redux'import * as counterActions from './../store/actions/counter.actions'const mapDispatchToProps = dispatch => (bindActionCreators(counterActions, dispatch))// connect 的参数为一个函数 这个函数可以拿到store中的状态,要求我们这个函数必须返回一个对象,在这个对象中写的内容都会映射给组件的props属性// connect 调用后返回一个函数 返回的这个函数继续调用需要传入组件告诉connect需要映射到那个组件的propsexport default connect(mapStateProps, mapDispatchToProps)(Count)

代码优化到这里我们发现,redux的代码与组件融合在一起,所以我需要拆分成独立的,为什么要抽离redux呢?因为我们要让我们的代码结构更加合理

重构计数器,把redux相关代码抽离

把reducer函数抽离为单独的文件、把创建store抽离到单独的文件中

因为在reducer 和 actions中我们都写了字符串,但是字符串没有提示所以我们把字符串定义成常量防止我们出现单词错误这种低级错误,新建 src/store/const/counter.const.js 文件

export const INCREMENT = 'increment'export const DECREMENT = 'decrement'

新建 src/store/reducers/counter.reducers.js 文件把 reducer 函数抽离到此文件中

import { INCREMENT, DECREMENT} from './../const/counter.const'const initialState = {    count: 0}// eslint-disable-next-line import/no-anonymous-default-exportexport default (state = initialState, action) => {    switch (action.type) {        case INCREMENT:            return {                count: state.count + 1            }        case DECREMENT:            return {                count: state.count - 1            }        default:            return state    }}

更改actions中的字符串为引入变量

import { INCREMENT, DECREMENT} from './../const/counter.const'export const increment = () => ({type: INCREMENT})export const decrement = () => ({type: DECREMENT})

创建src/store/index.js文件 ,在这个文件中创建store 并导出

import { createStore } from 'redux';import reducer from './reducers/counter.reducers'export const store = createStore(reducer)

在引入store的文件中改变为冲项目中store文件中引入store

import React from 'react';import ReactDOM from 'react-dom';import Count from './components/Count';import { store } from './store'import { Provider } from 'react-redux'ReactDOM.render(  // 通过provider组件 将 store 放在了全局的组件可以够的到的地方  provider要求我们放在最外层组件  <Provider store={store}><Count /></Provider>,  document.getElementById('root'));

为action 传递参数,对计数器案例做扩展

这个计数器案例已经实现了点击按钮加一减一操作了,现在有个新需求我们需要加减一个数值例如加五减五

这就需要对action传递参数了

在视图中按钮绑定函数传入参数

function Count({count,increment,decrement}) {    return <div>        <button onClick={() => increment(5)}>+</button>        <span>{count}</span>        <button onClick={() => decrement(5)}>-</button>    </div>}

在dispacth执行action动作时接受参数并传入到action中

export const increment = payload => ({type: INCREMENT, payload})export const decrement = payload => ({type: DECREMENT, payload})

在reducers中接收参数并作相应处理

export default (state = initialState, action) => {    switch (action.type) {        case INCREMENT:            return {                count: state.count + action.payload            }        case DECREMENT:            return {                count: state.count - action.payload            }        default:            return state    }}

以上就是使用react和redux怎么实现一个计数器功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 使用react和redux怎么实现一个计数器功能

本文链接: https://lsjlt.com/news/278814.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用react和redux怎么实现一个计数器功能
    本篇文章给大家分享的是有关使用react和redux怎么实现一个计数器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Redux,本身就是一个单纯的状态管理者,我们不追溯它的...
    99+
    2023-06-15
  • 使用react+redux实现计数器功能及遇到问题
    Redux,本身就是一个单纯的状态管理者,我们不追溯它的历史,从使用角度来说:它提供一个全局的对象store,store中包含state对象用以包含所有应用数据,并且store提供了...
    99+
    2024-04-02
  • 使用CocosCreator怎么实现一个计时器功能
    这篇文章给大家介绍使用CocosCreator怎么实现一个计时器功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、setTimeOut3秒后打印abc。只执行一次。setTimeout(()=>{consol...
    99+
    2023-06-14
  • 使用Pandas怎么实现一个分组计数功能
    这篇文章将为大家详细讲解有关使用Pandas怎么实现一个分组计数功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在对dataframe进行分析的时候会遇到需要分组计数,计数的column中...
    99+
    2023-06-14
  • Redis中怎么实现一个计数器功能
    这期内容当中小编将会给大家带来有关Redis中怎么实现一个计数器功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符串键下面代码演示了如何利用 Redis 中的字符...
    99+
    2024-04-02
  • 使用vue怎么实现一个倒计时功能
    这期内容当中小编将会给大家带来有关使用vue怎么实现一个倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通过父组件传入的结束时间减去当前日期得到剩余时间子组件部分<div clas...
    99+
    2023-06-14
  • 利用Servlet怎么实现一个点击计数器功能
    这期内容当中小编将会给大家带来有关利用Servlet怎么实现一个点击计数器功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、Web页面的点击计数器以下是基于Servlet生命周期实现一个简单的页面点击...
    99+
    2023-05-31
    servlet
  • redux应用加减求和功能怎么实现
    本篇内容介绍了“redux应用加减求和功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1.去...
    99+
    2024-04-02
  • 使用javascript怎么实现一个定时器倒计时功能
    这期内容当中小编将会给大家带来有关使用javascript怎么实现一个定时器倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<!DOCTYPE html><html&n...
    99+
    2023-06-14
  • 怎么在Android中实现一个计步器功能
    本篇文章给大家分享的是有关怎么在Android中实现一个计步器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。activity_main.xml<xml ve...
    99+
    2023-06-14
  • 利用java怎么实现一个倒计时功能
    这期内容当中小编将会给大家带来有关利用java怎么实现一个倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:package timer;import java.util.Calendar;...
    99+
    2023-05-31
    java ava
  • 使用java怎么实现一个ATM功能
    使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • 利用Java怎么实现一个整数乘积计算功能
    利用Java怎么实现一个整数乘积计算功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。计算机计算整数乘积的原理:实现代码:package math;public...
    99+
    2023-05-31
    java ava
  • 使用数据库怎么实现一个订座功能
    这篇文章给大家介绍使用数据库怎么实现一个订座功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一部分:SKIP LOCKED/NOWAIT订座功能实现订座在现实生活中是一种很常见的场...
    99+
    2024-04-02
  • 怎么在Java8中使用Collectors实现一个求和功能
    怎么在Java8中使用Collectors实现一个求和功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义工具类public class MyColle...
    99+
    2023-06-06
  • 怎么在Java中使用JavaScript实现一个字符串计算器功能
    本篇文章为大家展示了怎么在Java中使用JavaScript实现一个字符串计算器功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下:package scc;import ...
    99+
    2023-05-30
    java javascript 字符串
  • 怎么在Java中利用Redis实现一个高并发计数器功能
    这篇文章主要介绍了怎么在Java中利用Redis实现一个高并发计数器功能,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
    99+
    2023-06-06
  • 使用canvas怎么实现一个滤镜功能
    使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为...
    99+
    2023-06-09
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • 使用ajax怎么实现一个登录功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:最大的一点是页面无刷新,用户的体验非常好。使用异步方式与...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作