没有明确类型的操作 属性
actions without an explicit type property
正如您在源代码存储库中看到的 on this line of the Redux source code, actions must have a type
property. In the real world 示例,有一个类似这样的操作,没有声明 type
属性。
function fetchUser(login) {
10 return {
11 [CALL_API]: {
12 types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ],
13 endpoint: `users/${login}`,
14 schema: Schemas.USER
15 }
16 }
17 }
所指的CALL_API
是一个JavaScript符号here
export const CALL_API = Symbol('Call API')
在 Mozilla 站点的旁注中,您似乎访问了带有数组括号的符号
var sym = Symbol("foo");
var obj = {[sym]: 1};
因此,回到 redux 代码,处理没有显式类型的操作的中间件似乎访问了 CALL_API...
创建的 属性
export default store => next => action => {
84 const callAPI = action[CALL_API]
85 if (typeof callAPI === 'undefined') {
86 return next(action)
87 } function fetchUser(login) {
10 return {
11 [CALL_API]: {
12 types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ],
13 endpoint: `users/${login}`,
14 schema: Schemas.USER
15 }
16 }
17 }
回到上面引用的第一个代码,如果我像这样从调用 api 周围删除数组括号
function fetchUser(login) {
10 return {
11 CALL_API: {
我收到错误,"Actions may not have an undefined "键入“属性”。
问题:例如,在 fetchUser 函数中(正确)使用符号如何满足操作类型 属性 的要求?
在对象字面量中使用括号是较新的 ES6 语法的一部分。它允许您使用表达式在对象中定义键,其中可以包含变量的值:
const keyName = "test";
const obj = { [keyName + "Key"] : 42};
// result: { "testKey" : 42}
符号也可以用作对象键(参见 http://blog.keithcirkel.co.uk/metaprogramming-in-es6-symbols/ )以获得一些解释。
当您将 [CALL_API]
放在方括号中时,您表示的是 "use the value of the CALL_API
variable as the key"。当你 不 使用方括号时,你说的是 "Use the literal string "CALL_API"
as the key name".
然后中间件正在寻找一个动作对象,该对象具有与 CALL_API 符号正确匹配的键。当它看到一个时,它会停止它,并且 not 将它传递给减速器。因此,当您删除括号时,您实际上是在分派一个看起来像 {"CALL_API" : {} }
的操作。这与中间件正在寻找的内容不匹配,它 确实 到达了减速器,然后类型检查失败了。
正如您在源代码存储库中看到的 on this line of the Redux source code, actions must have a type
property. In the real world 示例,有一个类似这样的操作,没有声明 type
属性。
function fetchUser(login) {
10 return {
11 [CALL_API]: {
12 types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ],
13 endpoint: `users/${login}`,
14 schema: Schemas.USER
15 }
16 }
17 }
所指的CALL_API
是一个JavaScript符号here
export const CALL_API = Symbol('Call API')
在 Mozilla 站点的旁注中,您似乎访问了带有数组括号的符号
var sym = Symbol("foo");
var obj = {[sym]: 1};
因此,回到 redux 代码,处理没有显式类型的操作的中间件似乎访问了 CALL_API...
创建的 属性export default store => next => action => {
84 const callAPI = action[CALL_API]
85 if (typeof callAPI === 'undefined') {
86 return next(action)
87 } function fetchUser(login) {
10 return {
11 [CALL_API]: {
12 types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ],
13 endpoint: `users/${login}`,
14 schema: Schemas.USER
15 }
16 }
17 }
回到上面引用的第一个代码,如果我像这样从调用 api 周围删除数组括号
function fetchUser(login) {
10 return {
11 CALL_API: {
我收到错误,"Actions may not have an undefined "键入“属性”。
问题:例如,在 fetchUser 函数中(正确)使用符号如何满足操作类型 属性 的要求?
在对象字面量中使用括号是较新的 ES6 语法的一部分。它允许您使用表达式在对象中定义键,其中可以包含变量的值:
const keyName = "test";
const obj = { [keyName + "Key"] : 42};
// result: { "testKey" : 42}
符号也可以用作对象键(参见 http://blog.keithcirkel.co.uk/metaprogramming-in-es6-symbols/ )以获得一些解释。
当您将 [CALL_API]
放在方括号中时,您表示的是 "use the value of the CALL_API
variable as the key"。当你 不 使用方括号时,你说的是 "Use the literal string "CALL_API"
as the key name".
然后中间件正在寻找一个动作对象,该对象具有与 CALL_API 符号正确匹配的键。当它看到一个时,它会停止它,并且 not 将它传递给减速器。因此,当您删除括号时,您实际上是在分派一个看起来像 {"CALL_API" : {} }
的操作。这与中间件正在寻找的内容不匹配,它 确实 到达了减速器,然后类型检查失败了。