Javascript Can';t击败;动作必须是普通对象。使用自定义中间件进行异步操作。”;尝试遵循redux.js.org教程时出错

Javascript Can';t击败;动作必须是普通对象。使用自定义中间件进行异步操作。”;尝试遵循redux.js.org教程时出错,javascript,reactjs,redux,Javascript,Reactjs,Redux,我正在努力学习redux.js.org上的redux教程。我偶然发现“动作必须是简单的物体”。“为异步操作使用自定义中间件”错误。这没有意义,因为我的操作确实是普通对象(至少我认为是这样),所以我不应该被迫使用任何中间件。(我尝试使用thunk也失败了,但这不是这个问题的关注点) 以下是我的行动创造者: export const ADD_TODO = 'ADD_TODO' export const TOGGLE_TODO = 'TOGGLE_TODO' export const SET_FILT

我正在努力学习redux.js.org上的redux教程。我偶然发现“动作必须是简单的物体”。“为异步操作使用自定义中间件”错误。这没有意义,因为我的操作确实是普通对象(至少我认为是这样),所以我不应该被迫使用任何中间件。(我尝试使用thunk也失败了,但这不是这个问题的关注点)

以下是我的行动创造者:

export const ADD_TODO = 'ADD_TODO'
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_FILTER = 'SET_FILTER'

export const VisibilityFilters = {
    SHOW_ALL: 'SHOW_ALL',
    SHOW_COMPLETED: 'SHOW_COMPLETED',
    SHOW_ACTIVE: 'SHOW_ACTIVE'
  }

export function addTodo(todoText) {
    return 
    {
        type: ADD_TODO
        todoText
    }
}

export function toggleTodo(index) {
    return
    {
        type: TOGGLE_TODO
        index
    }
}

export function setFilter(filter) {
    return 
    {
        type: SET_FILTER
        filter
    }
}
我的减速机:

import { combineReducers } from 'redux'
import { 
    ADD_TODO,
    TOGGLE_TODO,
    SET_FILTER,
    VisibilityFilters 
} from '../actions'

const { SHOW_ALL } = VisibilityFilters

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_FILTER:
            return action.filter
        default: 
            return state
    }
}

const todoApp = combineReducers({
    visibilityFilter,
    todos
  })

export default todoApp
…最后是index.js(main):

从“React”导入React
从“react dom”导入react dom
导入“./index.css”;
从“./App”导入应用程序;
从“./registerServiceWorker”导入registerServiceWorker;
从“redux”导入{createStore};
从“/reducers”导入todoApp;
进口{
addTodo,
切换到,
设置过滤器,
可视性过滤器
}来自“./操作”;
const store=createStore(todoApp)
//记录初始状态
console.log(store.getState())
//每次状态更改时,都要记录它
//请注意,subscribe()返回一个用于注销侦听器的函数
const unsubscribe=store.subscribe(()=>
console.log(store.getState())
)
//采取行动
dispatch(addTodo('learnaboutactions')//此行导致错误。
dispatch(addTodo('learnaboutreducers'))
dispatch(addTodo('learnaboutstore'))
存储调度(切换到(0))
仓库调度(切换TODO(1))
存储调度(设置过滤器(VisibilityFilters.SHOW_COMPLETED))
//停止收听状态更新
退订
ReactDOM.render(,document.getElementById('root'));
registerServiceWorker();

如果您能帮我清除云层,我将不胜感激,这样我就可以继续我的Redux旅程。

您必须将返回对象brakets放在同一条线上

export function addTodo(todoText) {
    return {
        type: ADD_TODO
        todoText
    }
}

您必须将返回对象brakets放在同一行中

export function addTodo(todoText) {
    return {
        type: ADD_TODO
        todoText
    }
}

真的吗?我不敢相信这就是原因。有没有一篇文章解释了背后的rational?默认情况下,javascript在行的末尾放一个分号,您的return语句将转换为
return;{type:ADD_TODO todoText}
你可以在这里看到更多的细节,真的??我不敢相信这就是原因。有没有一篇文章解释了背后的rational?默认情况下,javascript在行的末尾放一个分号,你的return语句将转换为
return;{type:ADD_TODO todoText}
您可以在此处查看更多详细信息