redux使用教程一 ——实现计数器

2023-10-29

安装

安装稳定版redux:cnpm install --save redux
安装redux绑定库和开发者工具:
cnpm install --save react-redux
cnpm install --save-dev redux-devtools

概念介绍

action 和 action创建函数

  1. action:是一个JavaScript对象,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作(只有type是必须的,其它自动可以随意定义)
    可以通过store.dispatch() 将数据传到store
    示例:
const action = {
	type:'ADD',
	step:1
}
  1. action创建函数:返回值是action的函数
const action = step=>{
	return {
		type:'ADD',
		step
	}
}
//这种写法和上面的写法效果一直

reducer

reducer:就是一个接收state和action作为参数并返回新的state的方法。方法内部描述了state更新的逻辑。

注意事项:reducer是一个纯函数有以下约束

  • reducer函数里面不能修改参数
  • 函数内不能请求API、页面跳转等有副作用的操作
  • 调用new Date()、Math.random()等非纯函数

例如:

//定义一个reducer
const changeCount = (state=0,action)=>{ //接收一个state和action
	//state具体的更新逻辑
    switch (action.type) {
        case "INCREMENT":
            return state+action.step
        case "DECREMENT":
            return state-action.step
        default:
            return state
    }
}

Store

  1. 创建Store的方法

创建最简单的store

import {createStore} from 'redux'
//createStore的第一个参数是一个reducer,第二个可选参数用于设置 state 初始状态
const store = createStore(changeCount)

创建有初始值的store

import {createStore} from 'redux'
//如果传第二个参数则 state 的初始值为 6
const store = createStore(changeCount,6)

创建有中间件的store

import {createStore,applyMiddleware} from 'redux'
import logger from 'redux-logger'
//创建含有中间件的store,有state初始值的写法
const store = createStore(changeCount,6,applyMiddleware(logger))
//创建含有中间件的store,没有state初始值的写法
const store = createStore(changeCount,applyMiddleware(logger))
  1. Store的作用

提供 getState() 方法获取 state;store.getState()
提供 dispatch(action) 方法发起action,自动触发reducer,更新 state;store.dispatch(action)
通过 subscribe(listener) 注册监听器,它的返回值是一个函数;当state变化的时候可以通过它来重新渲染页面
通过 subscribe(listener) 返回的函数注销监听器

  1. 注意:Redux 应用只有一个单一的 store

计数器示例

import React from 'react'
import {createStore} from 'redux'
import ReactDOM from 'react-dom'

//定义action
import React from 'react'
import {createStore, applyMiddleware} from 'redux'
import ReactDOM from 'react-dom'
import logger from 'redux-logger'

//增加计数action
const increment = (step = 1) => (
    {
        type: "INCREMENT",
        step
    }
)
//减小计数action
const decrement = (step = 1) => (
    {
        type: "DECREMENT",
        step
    }
)
// 改变步长action(state中step的值)
const setStep = step => (
    {
        type: 'SETSTEP',
        step
    }
)

//state初始值
const state = {
    count: 6,
    step: 1
}
// reducer
const changeState = (state, action) => {
    switch (action.type) {
        case 'INCREMENT'://增加count逻辑
            return Object.assign(
            	{}, 
	            state, 
    	        {count: Number(state.count) + Number(action.step)}
    	    )
        case 'DECREMENT'://减小count逻辑
            return Object.assign(
            	{}, 
            	state, 
            	{count: Number(state.count) - Number(action.step)}
           	)
        case 'SETSTEP'://改变步长逻辑
            return Object.assign(
            	{}, 
            	state, 
            	{step: action.step}
            )
        default:
            return state
    }
}

// 创建store
/*
* @params
* changeState,reducer
* state,初始值
* applyMiddleware,应用的中间件,此处为打印日志的中间件
* */
const store = createStore(changeState, state, applyMiddleware(logger))

//定义一个函数返回要渲染的元素
const Counter = ({count, increment, decrement, step}) => (
    <div>
        <div style={{marginBottom:"10px"}}>
            步长:<input type="number" value={step} onChange={(event) => {
                    store.dispatch(setStep(event.target.value))
                }}/>
        </div>
        <button onClick={decrement}>减小</button>
        <span>{count}</span>
        <button onClick={increment}>增加</button>
    </div>
)

// 进行渲染
const rend = () => {
    ReactDOM.render(<Counter
        count={store.getState().count}
        decrement={() => store.dispatch(decrement(store.getState().step))}
        increment={() => store.dispatch(increment(store.getState().step))}
        step={store.getState().step}
    />, document.getElementById('root'))
}
rend()
// 监听state发生变化时渲染页面
store.subscribe(rend)

在这里插入图片描述

如果没有看明白的话可以结合阮一峰老师的这篇文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redux使用教程一 ——实现计数器 的相关文章

随机推荐

  • postman中发送post请求保存数据到数据库中文乱码问题

    postman中发送post请求保存数据到数据库中文乱码 postman 以为是header中的问题 加上这俩问题并未解决 以为是数据库的问题 改成这个也没解决 后台打印也没问题 book Book id null type 类别111 n
  • Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could

    Failed to configure a DataSource url attribute is not specified and no embedded datasource could be configured Reason Fa
  • SpringSecurity授权

    目录 一 RABC的介绍 二 权限表设计 三 编写权限控制方法 1 mapper接口 2 映射文件 3 修改认证逻辑 四 配置类访问资源 五 自定义访问控制逻辑 1 自定义 2 配置类 六 注解设置访问控制 1 Secured 1 在配置了
  • Status Code:200 OK (from disk cache)和304的区别,以及怎么禁止缓存

    有时候缓存是 200 OK from disk cache 有时候会是 304 看运维是否移除了 Entity Tag 移除了 就总是 200 OK from cache 没有移除 就两者交替出现 他们两个的区别是 200 OK from
  • C++中rand() 函数的用法

    C 中rand 函数的用法 1 rand 不需要参数 它会返回一个从0到最大随机数的任意整数 最大随机数的大小通常是固定的一个大整数 2 如果你要产生0 99这100个整数中的一个随机整数 可以表达为 int num rand 100
  • ajax的三种方法以及ajax概念

    目录 Ajax技术主要包括 1 客户端脚本语言 JavaScript 2 异步数据获取技术 XMLHttpRequest 3 数据交换和操作技术 XML和XSTL 4 动态显示和交互技术DOM及基于标准的表示技术XHTML和CSS等 aja
  • elasticsearch 启动报错 Exception in thread "main" java.nio.file.AccessDeniedException:

    系统 操作centos7 虚拟机 bin elasticsearch 启动报错 es1 es1 software elasticsearch 6 3 1 bin elasticsearch Exception in thread main
  • 中文版LLaMA:Chinese-LLaMA-Alpaca

    GitHub GitHub ymcui Chinese LLaMA Alpaca 中文LLaMA Alpaca大语言模型 本地CPU GPU训练部署 Chinese LLaMA Alpaca LLMs 以ChatGPT GPT 4等为代表的
  • Uncaught SyntaxError: Unexpected token ")"

    碰到一个很难排查的错误 记得以前处理过 光看报错信息 无法确定报错位置 从网上搜到解决方案 这个一般是对页面操作发生的错误 静态页面不报错 把源代码中的javascript void 改为javascript void 0 括号中添加一个0
  • 在Easy Samples中使用AvaloniaUI进行多平台UI编码——第1部分——AvaloniaUI构建块

    目录 介绍 为什么Avalonia会大受欢迎 Avalonia的一些缺点 Web和Xamarin框架在多平台开发中的缺点 你可以在这篇文章中找到什么 如何阅读这篇文章 使用Visual Studio 2019创建和运行简单的Avalon项目
  • JAVA学习之路遇到的报错信息以及解决方法(持续更新中)

    希望本篇文章对你有所帮助 文章目录 1 web项目启动发现错误 Artifact website war exploded Error during artifact deployment See server log for detail
  • cadence学习笔记(2)-PCB封装库制作

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 PCB封装库制作 二 制作焊盘 二 制作PCB封装 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门技术也越来越重
  • 我和计算机的故事

    为什么我选择了大三转专业 我和计算机的故事 一 我已经不是当年那个泡在生物实验室几乎每天只睡三个小时的章鱼烧了 也不是当年对着蓝框框在NEC笔记本上写 Pascal 一种编程语言 的章鱼烧了 我现在是三天不见到代码就浑身不舒服的章鱼烧 这个
  • 485芯片中slew-rate-limited是什么意思(转)

    边沿斜率限制 也称 压摆率 限制 压摆率 是单位时间 一般用微妙 器件输出电压值可改变的范围 对于485网络 若想提高线路的通讯速度 首先得要求接口器件具有较高的开关速度 而高开关速度必然会有较高的压摆率 但过高的压摆率会带来EMI干扰 这
  • 在Windows平台上搭建Docker开发环境

    本文介绍的是如何在Windows系统上安装Docker运行环境 Docker官方提供了Windows平台上的安装包 这个安装包会打开Windows平台上的HyperV虚拟机 所以如果不喜欢使用HyperV虚拟机或者有需要使用其他虚拟机软件的
  • MySQL抑制binlog日志中的BINLOG部分

    MySQL通过binlog来记录整个数据的变更过程 因此我们只要有MySQL的binlog日志即可完整的还原数据库 MySQL binlog日志记录有3种不同的方式 即 STATEMENT MIXED ROW 对于不同的日志模式 生成的bi
  • python--pandas数据聚合和分组运算

    groupby机制 1 通过列进行分组 访问列1 并根据列2和列3调用groupby 生成的是对象 s df 列1 groupby df 列2 df 列3 求和 sums s sum sums unstack 或者 df groupby k
  • 数据库——sql数据查询

    sql数据查询 单表查询 多表查询 联合查询UNION 连接查询 嵌套查询 子查询 复制表 判断查询 单表查询 查询全部数据 select from 表名 查询部分字段 select 字段1 字段2 from 表名 简单的条件查询 sele
  • Docker无法连接到docker守护程序

    本文翻译自 Docker can t connect to docker daemon After I update my Docker version to 0 8 0 I get an error message while enter
  • redux使用教程一 ——实现计数器

    文章目录 安装 概念介绍 action 和 action创建函数 reducer Store 计数器示例 安装 安装稳定版redux cnpm install save redux 安装redux绑定库和开发者工具 cnpm install