Redux 基础教程 文档翻译 一 action reducer store

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决) 本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。 阅读详情

基础部分 一

译者目前在做前端,博客内容主要是文档翻译。如果读者希望我翻译某些和前端相关的文档,欢迎留言告诉我。对于已有在网络上能够搜到质量较高译文的文章,我就不做重复工作了。本人精力有限,翻译质量达不到出版书籍的程度,可能有些人看不懂,不过我相信这总会帮助到一些人。有空的时候我会返回来对之前的文章进行润色。

对应官方文档,基础部分,Actions,Reducers,Store三节。

https://redux.js.org/basics

文内索引:

  1. Actions
  2. Reducers
  3. Store

Actions

首先,让我们定义一些action。

action是从你的应用发送到store的数据的信息负载。它们是store中唯一的信息源。你可以使用store.dispatch()将它们发送到store。

下面是一个action的示例,它会添加一个代办事项。

const ADD_TODO = 'ADD_TODO'

{
  type: ADD_TODO,
  text: 'Build my first Redux app'
}

action是简单的JavaScript对象。action必须有一个type(类型)属性来标示什么type的action将被执行。type通常被定义为字符串常量。当你的应用足够大时,需要把它们放入不同的模块(module)。

import { ADD_TODO, REMOVE_TODO } from '../actionTypes'

你不是一定要将action type的定义放入不同的文件,甚至根本不需要定义它们。对于一个小项目,可以简单的用字符串字面量来定义action type。然而,在大型的代码库中,声明常量是有益处的。读Reducing Boilerplate来获得关于保持代码库干净的建议。

除了type,action对象的构成取决于你。如果你感兴趣,读Flux Standard Action来获得一些如何构建action对象的建议。

我们添加一个action来表示用户将待办事项设置为完成状态。我们通过index来引用一个具体的待办事项,因为它们被存储在数组里。在真实的应用中,明智的做法是创建一个唯一的ID来进行标记。

{
  type: TOGGLE_TODO,
  index: 5
}

建议在action中传递尽量少的信息。例如,传递index比传递整个对象要好。

最后,再设置一个action来改变待办事项的可见性。

{
  type: SET_VISIBILITY_FILTER,
  filter: SHOW_COMPLETED
}

action creator

action creator的功能就是生成action。很容易将术语action和action creator搞混,所以要尽量区分它们。

在Redux中,action creator简单地返回一个action:

function addTodo(text) {
  return {
    type: ADD_TODO,
    text
  }
}

这使得它们简单并易于测试。

在传统的Flux中,action creator在被唤醒时经常会触发一个dispatch,例如:

function addTodoWithDispatch(text) {
  const action = {
    type: ADD_TODO,
    text
  }
  dispatch(action)
}

在Redux中这不是惯例。

取而代之的是使用返回的结果来触发dispatch():

dispatch(addTodo(text))
dispatch(completeTodo(index))

为了简化,你可以创建一个bound action creator,它会自动进行dispatch:

const boundAddTodo = text => dispatch(addTodo(text))
const boundCompleteTodo = index => dispatch(completeTodo(index))

现在你可以直接执行:

boundAddTodo(text)
boundCompleteTodo(index)

dispatch()函数可以直接从store.dispatch()访问,但是更多时候你会使用react-redux的connect()。你可以使用bindActionCreators()来自动将一些action creator和dispatch()函数绑定。

action creator还可以是异步的并且具有副作用。你可以读[进阶教程(之后会补充翻译)](advanced tutorial)中的异步action来学习如何处理AJAX响应和在异步工作流中创建action creator。在完成基础教程前不要跳到异步action,因为这里包含了其他的必要知识。

源代码

actions.js
/*
 * action types
 */
​
export const ADD_TODO = 'ADD_TODO'
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'
​
/*
 * other constants
 */
​
export const VisibilityFilters = {
  SHOW_ALL: 'SHOW_ALL',
  SHOW_COMPLETED: 'SHOW_COMPLETED',
  SHOW_ACTIVE: 'SHOW_ACTIVE'
}
​
/*
 * action creators
 */
​
export function addTodo(text) {
  return { type: ADD_TODO, text }
}
​
export function toggleTodo(index) {
  return { type: TOGGLE_TODO, index }
}
​
export function setVisibilityFilter(filter) {
  return { type: SET_VISIBILITY_FILTER, filter }
}

Reducers

reducer指出了应用的状态如何根据actionfan发送到store的响应而改变。记住,action仅仅描述了发生了什么,但没有描述应用的状态如何改变。

设计State Shape

在Redux中,所有应用状态被存储在单一的对象中。建议在写代码前设计好state的结构。比如如果用最小的对象来表述应用状态?

对于我们的待变事项应用,我们想要存储两个不同的东西:

  • 当前选择的可见性
  • 当前的代办事项列表

你经常会发现你需要存储一些信息,例如UI状态。这是正常的,但是要将数据和UI状态分离。

{
  visibilityFilter: 'SHOW_ALL',
  todos: [
    {
      text: 'Consider using Redux',
      completed: true
    },
    {
      text: 'Keep all state in a single tree',
      completed: false
    }
  ]
}

在更复杂的应用中,你将会需要不同的实体间互相引用。我们建议实体尽可能单一,不要任何的嵌入。让每一个对象保存的实体具有一个作为key的ID,并且使用ID来进行引用,包括在列表中。将应用的状态想象成数据库。这个方式在normalizr的文档中有对细节的讨论。例如,todosById: { id -> todo }和todos: array<id>是对于真实的应用建议的用法,但在教程中我们会尽量保持示例简单(而不这么做)。

处理action

现在我们已经决定了state的结构,我们准备好为它写一个reducer了。reducer是一个纯函数,根据之前的state和action来返回下一个state。

(previousState, action) => newState

它之所以称为reducer是因为函数的类型可以被传递入Array.prototype.reduce(reducer, ?initialValue)。让reducer保持纯函数非常重要。永远不要在reducer里面做下面的事:

  • 修改它的参数
  • 执行有副作用的功能,如调用API和改变路由。
  • 调用任何非纯函数,如Date.now()和Math.random()。

我们将在进阶指南中讨论如何执行带有副作用的功能。现在,仅仅记住reducer必须是纯函数就行了。给出同样的参数,返回同样的结果。没有副作用。没有修改。仅仅是计算。

带着这些原则,我们开始写reducer,让他逐步理解之前定义的action。

首先指定初始化的state。Redux第一次会使用undefined状态来调用reducer。此时可以返回应用的初始state:

import { VisibilityFilters } from './actions'
​
const initialState = {
  visibilityFilter: VisibilityFilters.SHOW_ALL,
  todos: []
}
​
function todoApp(state, action) {
  if (typeof state === 'undefined') {
    return initialState
  }
​
  // For now, don't handle any actions
  // and just return the state given to us.
  return state
}

一个便捷的方式是使用ES6默认参数语法来写:

function todoApp(state = initialState, action) {
  // For now, don't handle any actions
  // and just return the state given to us.
  return state
}

现在让我们处理SET_VISIBILITY_FILTER。它需要做的事处理state中的visibilityFilter。很简单:

function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    default:
      return state
  }
}

注意:

  1. 我们不改变state参数。我们通过Object.assign()来创建副本。Object.assign(state, { visibilityFilter: action.filter })也是错的,它修改了第一个参数。你一定要将空对象作为第一个参数。你还可以使用对象展开操作符来实现:{ ...state, ...newState }。
  2. 在default时返回之前的state。对于未知的action返回之前的state很重要。

Object.assign()是ES6的一部分,老的浏览器不支持。为了支持它们,你需要使用polyfill,Babel插件或其它的工具库如_.assign()。

switch语句不是官方的做法。Flux的官方做法是:需要触发一个更新(update),dispatcher需要注册一个state,store需要是一个对象(当你想要一个universal app的时候会发生困难)。Redux通过使用纯reducer替代事件触发器解决了这些问题。

不幸的是一些人根据文档中是否使用switch语句来选择框架。如果你不喜欢switch语句,你可以使用自定义的createReducer函数,它接受一个处理器(handler)映射(map),参考“reducing boilerplate”

处理更多action

我们还有两个action要处理。就像我们对SET_VISIBILITY_FILTER做的,我们将引入ADD_TODO和TOGGLE_TODO action并且扩展reducer来处理ADD_TODO。

import {
  ADD_TODO,
  TOGGLE_TODO,
  SET_VISIBILITY_FILTER,
  VisibilityFilters
} from './actions'
​
...
​
function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    case ADD_TODO:
      return Object.assign({}, state, {
        todos: [
          ...state.todos,
          {
            text: action.text,
            completed: false
          }
        ]
      })
    default:
      return state
  }
}

就像之前一样我们没有直接修改state和它的属性,取而代之的是返回一个新的对象。新的todos等于久的todos末尾拼接了一个新的条目。新的条目使用了action中的数据。

最后,TOGGLE_TODO的处理没有什么新鲜的了:

case TOGGLE_TODO:
  return Object.assign({}, state, {
    todos: state.todos.map((todo, index) => {
      if (index === action.index) {
        return Object.assign({}, todo, {
          completed: !todo.completed
        })
      }
      return todo
    })
  })

因为我们想更新一个特定的条目而不对它本身做改变,我们必须对除index所在元素外的其他元素创建一个新的数组。如果你经常写这种操作,建议使用immutability-helper、updeep这样的工具或Immutable这样支持深度更新的库。记住不要修改state中的东西除非你对它进行了克隆。

分割reducer

这是迄今为止的代码,它非常冗长:

function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    case ADD_TODO:
      return Object.assign({}, state, {
        todos: [
          ...state.todos,
          {
            text: action.text,
            completed: false
          }
        ]
      })
    case TOGGLE_TODO:
      return Object.assign({}, state, {
        todos: state.todos.map((todo, index) => {
          if (index === action.index) {
            return Object.assign({}, todo, {
              completed: !todo.completed
            })
          }
          return todo
        })
      })
    default:
      return state
  }
}

有什么办法让它易于理解吗?看起来todos或visibilityFilter完全独立地被更新。有时state的内容互相依赖,这时需要更多的考虑,但在我们的示例中可以轻易地将todos分离到独立的函数中:

function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case TOGGLE_TODO:
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: !todo.completed
          })
        }
        return todo
      })
    default:
      return state
  }
}
​
function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    case ADD_TODO:
      return Object.assign({}, state, {
        todos: todos(state.todos, action)
      })
    case TOGGLE_TODO:
      return Object.assign({}, state, {
        todos: todos(state.todos, action)
      })
    default:
      return state
  }
}

注意todos仍然接受state,但它是个数组!现在todoApp将某些状态交给它管理,并且todos知道如何处理这些状态。这称为reducer composition,并且是构建Redux应用的基础模式。

让我们继续讨论reducer composition。我们可以将visibilityFilter分离吗?是的。

我们用ES6对象解构来声明SHOW_ALL:
const { SHOW_ALL } = VisibilityFilters
之后:

function visibilityFilter(state = SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}

现在我们重写主reducer,让它调用管理state不同部分的reducer,并且将它们整合进一个单独对象中。这不再需要了解完整的初始state。当state是undefined时,各个reducer会返回初始state。

function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case TOGGLE_TODO:
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: !todo.completed
          })
        }
        return todo
      })
    default:
      return state
  }
}
​
function visibilityFilter(state = SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}
​
function todoApp(state = {}, action) {
  return {
    visibilityFilter: visibilityFilter(state.visibilityFilter, action),
    todos: todos(state.todos, action)
  }
}

注意每一个reducer管理全局state的一部分。每一个reducer的state参数是不同的,并且和它所管理的那部分state相一致。

这已经看起来不错了。当应用很大时,我们可以将reducer分离进不通的文件并且保持它们独立,并且管理不同的数据区域。

最后,Redux提供了一个叫combineReducers()的工具,它可以实现上面todoApp的逻辑。通过它的帮助,我们可以将todoApp重写为:

import { combineReducers } from 'redux'
​
const todoApp = combineReducers({
  visibilityFilter,
  todos
})
​
export default todoApp

等价于:

export default function todoApp(state = {}, action) {
  return {
    visibilityFilter: visibilityFilter(state.visibilityFilter, action),
    todos: todos(state.todos, action)
  }
}

你同样可以为它们提供不同的key,或调用不同的函数。这两个方式是等价的:

const reducer = combineReducers({
  a: doSomethingWithA,
  b: processB,
  c: c
})
function reducer(state = {}, action) {
  return {
    a: doSomethingWithA(state.a, action),
    b: processB(state.b, action),
    c: c(state.c, action)
  }
}

combineReducers()仅仅生成一个函数,通过key来分割state并调用你的reducer,并且再次将结果整合为一个对象。这不是magic。就像其他的reducer,combineReducers()不会创建新对象如果所有reducer都没有改变状态。

因为combineReducers需要一个对象,我们可以将顶级reducer分割到不同文件中,export每一个reducer函数,并且使用import * as reducers获得它们的名字作为key的对象。

import { combineReducers } from 'redux'
import * as reducers from './reducers'
​
const todoApp = combineReducers(reducers)

因为import *是新的语法,我们不会再在文档中使用它以避免混乱,但是你肯能在一些社区的示例中碰到它。

源代码

reducers.js
import { combineReducers } from 'redux'
import {
  ADD_TODO,
  TOGGLE_TODO,
  SET_VISIBILITY_FILTER,
  VisibilityFilters
} from './actions'
const { SHOW_ALL } = VisibilityFilters
​
function visibilityFilter(state = SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}
​
function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case TOGGLE_TODO:
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: !todo.completed
          })
        }
        return todo
      })
    default:
      return state
  }
}
​
const todoApp = combineReducers({
  visibilityFilter,
  todos
})
​
export default todoApp

Store

在之前的章节中,我们定义了action来表示“发生了什么”并且定义了reducer来根据action更新state。

store将它们放到一起,store负责:

注意在Redux应用中你只需要一个store。当你需要分割你的数据处理时,使用reducer composition而不是多个store。

如果你有一个reducer,那么创建store是很简单的。在之前的章节中,我们使用combineReducers()将多个reducer整合进一个中。我们现在在如它,并将它传入createStore()。

import { createStore } from 'redux'
import todoApp from './reducers'
const store = createStore(todoApp)

你还可以将初始化状态作为第二个参数传入createStore()。这很容易将客户端的state和服务器端的Redux应用状态同步。

Dispatching Actions

现在我们创建了一个store,让我们确认程序工作一切正常。即使没有UI,我们也可以测试更新的逻辑。

import {
  addTodo,
  toggleTodo,
  setVisibilityFilter,
  VisibilityFilters
} from './actions'
​
// Log the initial state
console.log(store.getState())
​
// Every time the state changes, log it
// Note that subscribe() returns a function for unregistering the listener
const unsubscribe = store.subscribe(() =>
  console.log(store.getState())
)
​
// Dispatch some actions
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))
​
// Stop listening to state updates
unsubscribe()

你可看到store中state的变化。

图

我们设定了应用的行为,即使没有开始写UI。我们不会再这个教程中做这件事,但你可以自己来写。因为(reducer)是纯函数,所以你不需要模拟任何(环境)。调用它们然后会返回值进行断言就可以了。

源代码

index.js
import { createStore } from 'redux'
import todoApp from './reducers'
​
const store = createStore(todoApp)
Autosar诊断实战系列23-NRC优先级解析 NRC分类,优先级判断逻辑及测试注意事项介绍。 阅读详情

相关推荐

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503

学习React之Redux(比较粗糙,用于自己理解)

第1章 redux 1.1 redux理解 1.1.1 学习文档 英文文档: https://redux.js.org/ 中文文档: http://www.redux.org.cn/ Github: https://github.com/reactjs/redux 1.2.2 redux redux是一个专门用于做状态管理的JS库(不是react插件库),类似Vue的Vuex 它可以用在react, angular, vue等项目中, 但基本与react配合使用。 作用: 集中式管理react应用中多

weixin_42991716的博客 871

从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作)

本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。

weixin_30706691的博客 384

reactjs redux的三个核心概念:Action(动作)、Reducer和Store(存储)

7.2. redux的三个核心概念 7.2.1. action 动作的对象 包含2个属性  type:标识属性, 值为字符串, 唯一, 必要属性  data:数据属性, 值类型任意, 可选属性 例子:{ type: ‘ADD_STUDENT’,data:{name: ‘tom’,age:18} } 7.2.2. reducer 用于初始化状态、加工状态。 加工时,根据旧的state和action, 产生新的state的纯函数。 7.2.3. store 1. 将state、action、redu

学亮编程手记 845

机器视觉学习(七)—— 卷积、边缘和滤波器

卷积运算、垂直边缘与水平边缘、滤波器

歆歆~黯了 2740

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了7个排查'Floating point exception'错误的实用步骤,包括边界条件检查、时间步长优化、求解器配置等关键技巧。通过系统化的诊断流程,帮助用户快速定位并解决CFD仿真中的浮点异常问题,提升计算稳定性。

weixin_42531886的博客 286

NgRx/Store 4 + Angular 5使用教程

这篇文章将会示范如何使用NgRx/Store 4和Angular5。@ngrx/store是基于RxJS的状态管理库,其灵感来源于Redux。在NgRx中,状态是由一个包含action和reducer的函数的映射组成的。Reducer函数经由action的分发以及当前或初始的状态而被调用,最后由reducer返回一个不可变的状态。你可以在@ngrx/store中找到我们将在下面的例子中...

515

S32K144后门密钥实战:如何用JLINK脚本绕过复位陷阱更新加密固件

本文详细介绍了在S32K144微控制器上,如何利用JLINK脚本绕过调试器默认复位陷阱,实现通过后门密钥安全更新加密固件的实战方案。针对汽车电子现场维护中常见的“解锁-复位-锁定”循环问题,文章提供了完整的JLinkScript定制方法、批处理工具及故障排除指南,帮助工程师高效完成固件升级。

weixin_29175469的博客 143

redux中action与reducer

redux中action与reducer action 对于action,将数据从应用程序发送到存储的有效信息负载。可以将其理解为用户对于要去操作某个动作而做出的反应。是改变store数据的唯一方法。可以通过store.dispatch(action),将其发送给s...

domino~~的博客 2600

零差云控关节模组:EtherCAT+preempt-RT实现微秒级同步

关节模组是协作机器人、外骨骼与高精度服务机器人的核心执行单元,其性能瓶颈常在于多轴运动的时序一致性与实时闭环能力。实现‘零差’同步依赖于确定性通信(如EtherCAT)与硬实时操作系统支持(如Linux preempt-RT),前者保障指令与状态在微秒级时间戳下全局对齐,后者消除内核调度抖动,使PID控制、电流采样、编码器反馈等关键路径具备纳秒级可预测性。技术价值体现在相位偏差<±0.01°、端到端控制周期稳定1ms、连续运行温漂<±1.2℃等工程指标,广泛应用于力控装配、康复训练、远程遥操作等对动态精度与

weixin_34192816的博客 1197

【中项】案例分析 | 答题技巧 | 备考 

对偏差原因的分析和对项目未来趋势的理解。如果偏差是由一次性事件或特殊原因引起的,那么这种偏差是非典型的,意味着未来的绩效将回归到预期的绩效水平。例如,如果项目初期的CPI小于1,原因是意外的自然灾害导致成本增加,那么这种偏差被认为是非典型的,因为它不太可能在未来重复发生。例如,如果项目初期的CPI小于1,且原因是低效的团队协作,那么这种偏差被认为是典型的,因为它可能在整个项目生命周期中持续存在。在实际应用中,项目经理通常会结合CPI、SPI和偏差趋势图等工具,综合分析偏差的性质,以制定合理的项目控制策略。

静谧、淡雅 1245

一文读懂Redux,state、Action、Reducers、store的应用

这样使得组件树成为一个大的”view“,任何组件都可以访问state或出发action,无论在什么位置。那个根 reducer 函数负责处理所有被 dispatching 的 actions,并计算每次所有的新 state 结果。通过定义和分离 state 管理中涉及的概念并强制执行维护 view 和 state 之间独立性的规则,代码变得更结构化和易于维护。因此,可以将大的根 reducer 函数拆分为两个较小的 reducer -,并编写一个新的根 reducer,它唯一的工作就是调用其他两个函数。

ZhShy 1657

深度学习特征融合(feature fusion)操作详解

特征融合是指在深度神经网络中,将来自不同来源(如不同网络分支、不同模态、不同时间步、不同空间尺度或不同抽象层级)的特征表示进行有策略地整合,以生成更具判别性、鲁棒性和语义丰富性的联合特征表示。其核心目标是最大化信息互补性,最小化信息冗余与噪声干扰。关键问题:如何“有效”融合?——这取决于任务需求、数据特性、计算资源和融合机制的设计。✅ 是否对齐了空间/通道/模态?✅ 融合方式是否与任务匹配?(检测需定位+语义 → 多尺度融合)✅ 是否引入可学习机制提升适应性?✅ 是否控制了计算开销?

浩瀚之水的专栏 793

Redux中的reducer到底是什么,以及它为什么叫reducer?

https://zhuanlan.zhihu.com/p/25863768Redux有3大核心概念:ActionReducerStore其中Action和Store都非常好理解,我们可以直接按照其字面意思,将他们理解为动作和储存。Action表示应用中的各类动作或操作,不同的操作会改变应用相应的state状态,说白了就是一个带type属性的对象。Store则是我们储存state的地方。我们通过re...

uwenhao2008的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

如何使用Redux-in-russian文档:面向初学者的完整学习路线

Redux-in-russian是Redux官方文档的俄语翻译版本,为俄语用户提供了系统学习Redux的优质资源。无论你是刚开始接触状态管理的新手,还是希望深入理解Redux核心原理的开发者,这份文档都能帮助你快速掌握Redux的使用方法和最佳实践。 ## 📚 为什么选择Redux-in-russian文档? Redux作为JavaScript应用的可预测状态容器,以其简洁的设计和强大的生态

gitblog_00940的博客 674

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Redux最新实践指南之Redux-Toolkit

​redux-toolkit是目前redux官方推荐的编写redux逻辑的方法,针对之前redux使用不便的地方做出优化,可以使开发更加高效且易维护

Mr.CJ 1万+

Flux/Redux架构初步

https://github.com/react-guide/redux-tutorial-cn   // 章节 0 - introduction.js   // 为什么要有这个教程呢?   // 在我尝试学习 Redux 的时候,我发现之前的阅读过的一些文章加上个人的经验,   //

三少GG 2243

RN开发系列<8>--Redux(1)入门篇

Redux的基本使用

JH_Cao的博客 3095

从零开始学React特别篇~Redux+Redux Toolkit介绍与使用

前言 首先我原本是一个vue开发者,会有vuex的使用经验,虽然说可能上手会快,但是也有可能会被框架包袱所限制 为了写好今天这篇,看了特别多文档。 首先吐槽一下,最开始的时候我看的是这个文档 redux中文文档 我还想着这个中文文档真的是给人类看的吗?翻译成这样我还不如去看英文文档。每个字我都认识,连起来就看不懂了。 后面才知道上面那个不是官网,这个 redux中文官网 才是正版。针不戳,刚开始就踩坑。 今天是学习react的第七天,我的第一个小目标是将平时使用的todo清单软件通过react在web端

weixin_47077674的博客 2064

Redux新手必备:React Things带你从理论到实战的状态管理教程

Redux是React生态中最流行的状态管理库之一,而React Things作为一个专注于React学习的开源项目集合,为Redux初学者提供了从理论到实战的完整学习路径。本文将通过React Things项目中的精选资源,帮助你快速掌握Redux的核心概念和实际应用技巧。 ## 为什么选择Redux进行状态管理? 在React应用开发中,组件间的状态共享和数据流管理往往是新手面临的最大挑战

gitblog_01111的博客 375

前端新手别慌:一文搞懂Redux中reducer的核心作用与实战技巧

绝不碰副作用;绝不改旧状态;绝不给你“惊喜”。但正是这种轴,让混乱的前端状态有了一份可预测的秩序。掌握它、调教它、爱上它,你会发现 Redux 不再是“配置地狱”,而是一本写满最佳实践的“代码日记”。“状态又丢了?”——不存在的。“页面怎么不刷新?”—— reducer 表示这锅我不背。祝你下次调试时,Redux DevTools 里绿色 diff 一片,心情像状态一样稳。代码敲得开心,bug 睡得安详,我们下一篇 saga 里再见!欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1128

[OHIF-Viewers]医疗数字阅片-医学影像-Redux中的reducer到底是什么,以及它为什么叫reducer?...

[OHIF-Viewers]医疗数字阅片-医学影像-Redux中的reducer到底是什么,以及它为什么叫reducer? Redux有3大核心概念: Action Reducer Store 其中Action和Store都非常好理解,我们可以直接按照其字面意思,将他们理解为动作和储存。 Action表示应用中的各类动作或操作,不同的操作会改变应用相应的state状态,说白了就是一个...

浩秦的博客 439

redux 介绍及配合 react开发

前言 本文是 Redux 及 Redux 配合 React 开发的教程,主要翻译自Leveling Up with React: Redux,并参考了 Redux 的文档及一些博文,相对译文原文内容有增减修改。 目录 前言 目录 什么是 Redux,为什么使用 Redux Redux 的三大基本原则 1.唯一数据源 2.State 是只读的 3.使用纯函数来执行...

weixin_30508309的博客 140

通俗易懂的Redux了解下

Redux真的让我脑仁疼,感觉有点搞不定他,因为对我而言太抽象了。所以我用通俗易懂地方法去思考Redux,感觉能够理解了。 本文要点: action 配置行为 store.dispatch(action) reducer 纯函数 返回新的state createStore(reducer) store getStore dispatch subscribe combineR...

dingjizhu6802的博客 127

redux源码解析

用npm安装redux,看目录结构 npm install redux 找到src目录 * index.js: redux主文件,主要对外暴露核心api * createStore.js: createStore方法的定义 * utils: applyMiddleware、combineReducers、bindActionCreators为redux的核心方法,pick、ma

sysuzhyupeng的博客 1204

Redux 核心概念

http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html 。本文不是官方文档的翻译。你可以在阅读官方文档之前和之后阅读本文,以加深其中的重点概念。 根据该项目源码的习惯,示例都是基于 ES2015 的语法来写的。 Redux 是应用状态管理服务。虽然本身受到了 Flux 很深的影

1787

redux学习笔记

redux流程 view直接触发dispatch 将action发送到reducer中后,根节点上会更新props,改变全局view redux概念理解 store相关 redux中的store是通过createStore方法创建的,该方法接收两个参数reducer函数和初始化的数据(currentState),从而形成一颗状态树

SirM2z的博客 2440
上一篇: Angular Universal 官网翻译
若简LL
博客等级 码龄11年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值