Redux 连接状态 shorthand
Redux connect with state shorthand
我正在看this example。
然而,我发现这个(containers/UserSearch.jsx
)很难理解:
export default connect(
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
}),
{ searchUsers }
)(UserSearch);
重点是,routing
减速机根本就没有进口。这个所谓的 mapStateToProps
功能是如何实现的?
请帮忙解释一下。谢谢。
如果您查看 connect
api,它描述了传递给它的以下参数。
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
第一个是 mapStateToProps
,在你的例子中是一个函数。
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
})
这个函数的第一个参数是整个 redux 状态。您的语法 { routing, userResults, searchInFlight }
称为 Destructuring assignment
,您只从状态中选择所述变量。所以 routing
, userResults
, searchInFlight
都是你的 redux state 的节点。
有问题的 routing
节点应该在您之前 combineReducers
创建状态时由 routingReducer
添加。所以这里 routing
只是你所在州的一个节点,它保存由 RoutingReducer
指定的路由相关数据,而不是路由 reducer 本身。
最后在你的函数中,你return一个plain object
(可能是使用你从状态中提取的变量构造的),它将与传递的props
合并到组件(UserSearch
)
这就是为什么参数被命名为 mapStateToProps
的原因,它表示您映射 redux 状态有或没有操作,并根据需要将其作为 props 传递给组件。
编辑
第一个参数是 de-structuring
state
对象,并将提到的值提取到单独的变量中。以下代码可互换。
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
})
相当于写
(state) => {
let routing = state.routing;
let userResults = state.userResults;
let searchInFlight = sate.searchInFlight;
return {
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight: searchInFlight
}
}
相当于写
(state) => ({
query: state.routing.locationBeforeTransitions.query.q,
results: state.userResults,
searchInFlight: state.searchInFlight
})
解构赋值只是提取所需值并将其分配给您可以使用的局部变量的一种简便方法。我没有看到性能问题。我能看到的唯一优势是,即使状态有 1000 个属性,我们也只检索我们需要的那些并使用它们。
我正在看this example。
然而,我发现这个(containers/UserSearch.jsx
)很难理解:
export default connect(
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
}),
{ searchUsers }
)(UserSearch);
重点是,routing
减速机根本就没有进口。这个所谓的 mapStateToProps
功能是如何实现的?
请帮忙解释一下。谢谢。
如果您查看 connect
api,它描述了传递给它的以下参数。
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
第一个是 mapStateToProps
,在你的例子中是一个函数。
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
})
这个函数的第一个参数是整个 redux 状态。您的语法 { routing, userResults, searchInFlight }
称为 Destructuring assignment
,您只从状态中选择所述变量。所以 routing
, userResults
, searchInFlight
都是你的 redux state 的节点。
有问题的 routing
节点应该在您之前 combineReducers
创建状态时由 routingReducer
添加。所以这里 routing
只是你所在州的一个节点,它保存由 RoutingReducer
指定的路由相关数据,而不是路由 reducer 本身。
最后在你的函数中,你return一个plain object
(可能是使用你从状态中提取的变量构造的),它将与传递的props
合并到组件(UserSearch
)
这就是为什么参数被命名为 mapStateToProps
的原因,它表示您映射 redux 状态有或没有操作,并根据需要将其作为 props 传递给组件。
编辑
第一个参数是 de-structuring
state
对象,并将提到的值提取到单独的变量中。以下代码可互换。
({ routing, userResults, searchInFlight }) => ({
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight
})
相当于写
(state) => {
let routing = state.routing;
let userResults = state.userResults;
let searchInFlight = sate.searchInFlight;
return {
query: routing.locationBeforeTransitions.query.q,
results: userResults,
searchInFlight: searchInFlight
}
}
相当于写
(state) => ({
query: state.routing.locationBeforeTransitions.query.q,
results: state.userResults,
searchInFlight: state.searchInFlight
})
解构赋值只是提取所需值并将其分配给您可以使用的局部变量的一种简便方法。我没有看到性能问题。我能看到的唯一优势是,即使状态有 1000 个属性,我们也只检索我们需要的那些并使用它们。