1 回答
TA贡献1936条经验 获得超6个赞
以下是您必须解决的问题才能使其正常工作:
语法错误:
在
onClick
,this.props.someTab.active:
应该只是active:
mapStateToProps
,mapDispatchToProps
并且connect
应该移到Tabs
组件之外你错过了一个
{
以前this.props.items[this.prop.someTab.active]
一旦你修复了这些,你仍然会得到一些错误,因为你试图访问不存在的道具的属性。Tabs
没有连接到商店,所以您拥有的唯一道具是items
. 添加inconsole.log(props)
的第一行以了解我的意思。render
Tabs
如何修复 Redux 错误:
您需要将您的商店传递给您的提供商:
<Provider store={store}>
您正在调用连接,但没有将您的组件连接到 Redux。修复:
class Tabs extends Component {...}
const ConnectedTabs = connect(mapState, mapDispatch)(Tabs);
...
<Provider store={store}>
<ConnectedTabs />
</Provider>
mapStateToProps
应该返回一个对象,其属性对应于您的组件期望的道具,而不是减速器名称。在这种情况下:return { someTab: state.oneReducer.someTab }
现在您应该看到一个没有错误的页面。我们还没有完成!
在
mapDispatchToProps
你需要调用你传递给的函数dispatch
,特别是用你在组件中传递的参数调用它:
return { changeTab: change => dispatch(changeTab(change)) };
或者只是使用对象形式mapDispatch
:
const mapDispatchToProps = { changeTab } // it works!
在您的减速器中,您正在添加一个
state.change
属性,当您想要更新state.someTab.active
. 你可以 returnObject.assign({}, state, { someTab: { active: action.change.active } })
,或者让它更简单:去掉对someTab
do的引用Object.assign({}, state, { active })
。
这应该可以让您大体上到达您想去的地方。
一些简化事情的建议:
此时你也真的不需要多个减速器。你真的可以直接
reducer
进入createStore
,并摆脱对 . 的引用oneReducer
。您使用的唯一组件方法是
render
,因此您可以使用函数组件而不是类组件。(this.props
将成为props
)你不需要
data-index
,你可以做onClick={() => props.changeTab({ active: i })}
另一个注意事项:您可以搬进items
商店。你仍然可以通过 props 访问它们,所有相关的状态都将保存在一个地方,这是 Redux 的优势之一。
祝你好运!
添加回答
举报