🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

Redux:动作 Actions

动作(Actions)。在 Redux 的动作里会带着发送给 Store 的信息,动作是 Store 的唯一信息来源,可以使用 store.dispatch() 把动作发送给 Store。

下面就是一个动作,这个动作表示的是添加新的任务项目(假设这个动作来自一个任务列表应用):

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

动作其实就是一个 JavaScript 对象,它里面必须得有个 type 属性,这个属性表示的是要执行的动作的类型,也就是在你的应用里会发生的一些事情。一般这个类型的值是一个字符串恒量,但这并不是必须的,你可以直接使用一个普通的字符串表示动作,但是对于大型应用来说,让动作的名字使用恒量是有好处的。在动作对象里,除了必须的 type 属性以外,你可以在这个对象里放任何东西。你可以参考 Flux Standard Action ,学习动作的结构。

你可以把动作放到单独的模块里:

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

下面这个动作描述了用户切换一个任务项目的完成状态,在这个动作里 index 的值表示的是某个具体的任务项目。

{
  type: TOGGLE_TODO,
  index: 5
}

动作里包含的数据越少越好,比如上面这个动作只是传递了表示任务项目的 index,而不是整个任务项目(todo)对象。

下面这个类型的动作,描述的是改变当前可见的任务项目:

{
  type: SET_VISIBILITY_FILTER,
  filter: SHOW_COMPLETED
}

Action Creators

Action creators (动作创建器)就是创建动作用的函数。

在 Redux 里面,Action creators 会返回动作:

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

调度动作,可以把 Action creator 返回的结果交给 dispatch() 函数,像这样:

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

另外,你也可以创建一个 bound action creator (绑定动作创建器),它可以自动调度:

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

现在你可以直接调用它们:

boundAddTodo(text)
boundCompleteTodo(index)

dispatch() 函数可以直接在 store.dispatch 访问到。但大部分情况下你会用到一些帮手方法,比如 react-redux 的 connect() 。你可以使用 bindActionCreators() 来自动绑定多个动作创建器到 dispatch() 函数上。

Source Code

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 }
}
Redux
微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点