2016-11-16 73 views
0

在丹·阿布拉莫夫的优秀教程终极版工作,并在第一章27 - 生成容器与连接() - 一个奇怪的错误发生:作出反应,终极版的connect()方法抛出类型错误

首先,我定义这些两个功能:

const mapStateToProps = (state) => { 
    return { 
     todos: getVisibleTodos(state.todos, state.visibilityFilter) 
    }; 
} 
const mapDispatchToProps = (dispatch) => { 
    return { 
     onTodoClick: (id) => { 
     dispatch({ 
      type: 'TOGGLE_TODO', 
      id 
     }) 
     } 
    } 
} 

然后我导入必要的依赖关系:

import { connect } from 'react-redux' 

然后,我创建采用t我的组件他的方法从react-redux中暴露出来,并传入两个函数,最后连接到我的其他组件TodoList

const VisibleTodoList = connect(mapStateToProps, mapDispatchToProps)(TodoList); 

当我做到这一点,使浏览器无法呈现和控制台回报:

TypeError: Cannot read property 'displayName' of undefined

我以前从来没有碰到过这样的错误,似乎具体到connect()方法react-redux

有没有人遇到过这个,和/或知道可能是什么原因造成的?


UPDATE:

getVisibleTodos如上所定义。如果其TodoList你想看到...

const TodoList = ({todos, onTodoClick}) => (
    <ul> 
     {todos.map(todo => 
     <Todo key={todo.id} 
      {...todo} 
      onClick={() => onTodoClick(todo.id)} 
     /> 
    )} 
    </ul> 
) 
+1

请向我们展示'getVisibleTodos'正在做什么。 –

+0

请参阅更新 – Paulos3000

+0

你是什么'TodoList'反应类?它是否正确导入或定义? –

回答

1

你可能定义后您的来电connectTodoList组件。与var关键字不同,ES6关键字如letconstclass而不是得到悬挂在范围的顶部,并且只存在于它们声明的行上。因此,如果您在定义TodoList之前致电connect(),那么您实际上正在运行connect()(undefined)。也有可能您的导入声明不正确,这也可能导致TodoList未定义。

请参阅https://github.com/reactjs/react-redux/issues/253作进一步讨论。

+0

你是个传奇人物。就是这样!此外,知道ES6变量关键字不会提升的真正有用,并没有意识到这一点。谢谢! :) – Paulos3000

+0

当然。是的,块范围实际上是'let'和'const'存在的主要原因,但对人们来说可能有点意外。仅供参考,我有[ES6功能](https://github.com/markerikson/react-redux-links/blob/master/es6-features.md)文章列表作为我的[React/Redux链接列表](https://github.com/markerikson/react-redux-links),你可能会觉得有帮助。 – markerikson