2016-11-16 42 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