FSA 是一个命名 flux action 对象的友好标准(并非强制性标准,但是有利于合理的安排 action
对象)。

github 链接:

一、FSA 的设计目标:

  • 人性化

    • FSA 的 action 应当容易阅读和写作
  • 有用

    • FSA action 应当能够创建有用的工具和抽象
  • 简单

    • FSA 设计上应该简单、直接和灵活。

二、举例:

1、一个基本的 FSA:

{
    type:'ADD_TODO',
    payload:{
        text:'Do something.'
    }
}

2、 表示错误的 FSA,类似把一个 Promise 给 rejected:

{
    type:'ADD_TODO',
    payload:new Error().
    error:true
}

三、 Actions 的要求:

一个 action 必须:

  • 是一个 javascript 对象
  • 有一个 type 属性

一个 action 可能:

  • 有一个 error 属性
  • 有一个 payload 属性
  • 有一个 meta 属性

一个 action 除了 type,error,payload,meta 之外不能再拥有其他属性

type

type 主要是对用户的行为进行鉴定和标识。type 是一个字符串常量。如果类型相同,则比较相同必须使用 ===

payload

payload 可能是任何类型的值。它用来表用 action 的一部分内容值。

action 中除了 type 或者是 status(error)外,其他值都应该放在 payload 中

error

如果 action 表示错误,则可以使用一个可选的属性 error ,并将其值设置为 true。

如果 action 的 error 属性是 true,则该 action 实际上表示对 Promise 进行 rejected,并且 payload 属性的值应当是一个错误对象。

如果 error 属性的值是除了 true 之外的任何值,包括 undefined 和 null ,则该操作不能被解释为错误。

meta

可选的 meta 属性可以是任何类型的值,它旨在用于不属于 payload 的额外信息。

四、实用的功能

flux-standard-action 已经是一个可用的 npm 模块,暴露了一些实用的接口。

isFSA(action)

import {FSA} from `flux-standard-action`;

如果是一个合格的 FSA,则返回 true。

import {isError} from 'flux-standard-action';

如果 action 表示的是 error 的 action,则返回 true。

这个库的代码如下:

import {
  isPlainObject,
  isString,
} from 'lodash';

export function isFSA(action) {
  return (
    isPlainObject(action) &&
    isString(action.type) &&
    Object.keys(action).every(isValidKey)
  );
}

export function isError(action) {
  return isFSA(action) && action.error === true;
}

function isValidKey(key) {
  return [
    'type',
    'payload',
    'error',
    'meta',
  ].indexOf(key) > -1;
}