redux 核心-创建 Action

创建 Action

Action 是 JavaScript 对象,用于描述需要更新应用状态的任何事件。这些对象必须具有 type 属性,以便区分发生的特定 action 类型。

const LOAD_PROFILE = 'LOAD_PROFILE';

const myAction = {
  type: LOAD_PROFILE
};

type所描述的行为发生时,任何与该行为相关的数据都可以作为 action 的属性被传入 action 内(换句话说,是普通的 JavaScript 对象)。

Action 建议
在构建 action 对象时需要注意以下几点:

  • 最好将 type 属性的值设为常量,而不是字符串。二者都可行,但是使用常量的话,如果出现任何拼写错误(例如LAOD_PROFILELOAD_PROFILE),控制台将显示错误,而不是毫无提示地运行失败。
  • 使载荷数据尽量很小。让你的资源仅发送必要的数据!

Action Creators

Redux action 是 JavaScript 对象,用于描述应该更新应用状态的任何事件。但是,普通对象不易移植。为了使 action 更易移植并更容易测试,它们通常封装在函数里。这些函数称为 action creator。术语“action creator”很好理解,因为它就是一个创建和返回 action 的函数。

const submitUser = user => ({
  type: SUBMIT_USER,
  user
});

现在,只要我们需要 SUBMIT_USER action,就可以调用 submitUser() 函数,向其传入 user,它将生成该 action!

开始构建项目

我们开始构建课程项目 Udacimeals 吧!该应用将提供一个可定制的日历,让用户跟踪他们整个星期的早餐、午餐和晚餐。用户将利用 Edamam's Recipe Search API 的菜谱搜索 API,然后根据所选生成一份配料购物清单。

我们将编写 action 来表示以下两种应用状态更改方式:

  1. 添加新的食谱
  2. 从日历中删除某种食物

我们将使用 Create React App 脚手架。确保安装该工具,然后创建新的应用。你可以重新阅读之前的《React 基础知识》课程,复习下所学的知识。

此处是项目脚手架的 commit.

总结

在此部分,我们学习了action 和 action creator

Redux 中的 Action 是 JavaScript 对象,你可以用来描述应用中应该更新应用状态的任何事件。

const LOAD_PROFILE = 'LOAD_PROFILE';

const loadProfileAction = {
  type: LOAD_PROFILE
};

普通对象不易移植,为了使 action 更易移植并更容易测试,它们通常封装在叫做“action creator”的函数里。这些 action 并不修改状态本身;它们只是指出发生了一些事件,应该更新状态。务必使 action 保持专一性,不能出现副作用。

const loadProfile = user => ({
  type: LOAD_PROFILE,
  user
});

现在的问题是:接下来该做什么?现在我们只介绍了创建对象 (action) 并在函数 (action creator) 中封装这些对象。我们依然需要回答两个问题。首先,Redux 如何知道调用这些 action creator 应该修改应用的状态?其次,我们如何根据这些 action 指定应用的状态应该如何改变?这两个问题就引出了 Redux 中的 reducer。

./src/actions/index.js 代码示例

//定义可输出的action常量
export const ADD_RECIPE = 'ADD_RECIPE'
export const REMOVE_FROM_CALENDAR = 'remove_from_calendar'

// 定义可输出的actions creator return actions对象,接收一个对象{day,recipe,meal}
export function addRecipe({day,recipe,meal}) {
    return {
        type:ADD_RECIPE,
        recipe,
        day,
        meal
    }
}

// 定义actions creator return actions对象,接收一个对象{day,meal}
export function removeFromCalendar({day,meal}) {
    return {
        type:REMOVE_FROM_CALENDAR,
        day,
        meal,
    }
}

你可能感兴趣的:(redux 核心-创建 Action)