Reactjs 使用React-Redux挂钩和React-Redux Connect()之间的主要区别是什么?
我即将开始一个与React Redux的项目。对于API引用,有hook和connect()。因为,钩子是连接API的替代品。使用钩子或连接到我的React Redux项目有什么区别。钩子使您可以直接访问Reactjs 使用React-Redux挂钩和React-Redux Connect()之间的主要区别是什么?,reactjs,react-redux,react-hooks,Reactjs,React Redux,React Hooks,我即将开始一个与React Redux的项目。对于API引用,有hook和connect()。因为,钩子是连接API的替代品。使用钩子或连接到我的React Redux项目有什么区别。钩子使您可以直接访问分派和Redux状态,而无需使用连接连接组件,钩子只能在功能组件中使用 function Test() { return ( <> <p>{this.props.count}</p> <button onClick={
分派和Redux状态,而无需使用连接连接组件,钩子只能在功能组件中使用
function Test() {
return (
<>
<p>{this.props.count}</p>
<button onClick={() => {this.props.increaseCounter(this.props.count+1)}}>Click Me!</button>
</>
);
}
const mapStateToProps = state => {
return {
count: state.counter
};
};
const mapDispatchToProps = dispatch => {
return bindActionCreators({ increaseCounter }, dispatch);
};
export default connect(mapStateToProps, mapDispatchToProps)(Test)
Connect
使我们能够将我们的组件(类或功能)链接到redux存储
您可以参考链接中的react redux
hooks文档
它给出了不同的钩子,比如
使用选择器
我们可以使用它访问redux存储
useDispatch
返回dispatch
函数,我们可以使用该函数分派redux操作
组件的redux钩子示例用法如下(只能在功能组件中使用)
函数测试(){
const dispatch=usedpatch()
const count=useSelector(state=>state.counter)
//如果您想使用钩子分派redux操作,那么
//假设一个名为increaseCounter的redux操作
返回(
{count}
{分派(递增计数器(计数+1))}>
点击我!
)
}
如果您希望使用connect实现相同的功能,那么(您可以在类或功能组件中使用此功能)
功能测试(){
返回(
{this.props.count}
{this.props.increaseCounter(this.props.count+1)}>单击我!
);
}
常量mapStateToProps=状态=>{
返回{
计数:state.counter
};
};
const mapDispatchToProps=调度=>{
返回bindActionCreators({increaseCounter},dispatch);
};
导出默认连接(MapStateTrops、mapDispatchToProps)(测试)
React Redux内部用于将组件连接到存储
connect()
函数将您的组件包装到另一个连接到存储上下文的组件中,并将所选状态作为道具转发给您的组件
如果你打电话
const YourConnectedComponent = connect(mapStateToProps)(YourComponent)`
…您可以想象包装器大致如下所示:
const YourConnectedComponent = props => (
<StoreContext.Consumer>
{state => <YourComponent {...props} {...mapStateToProps(state, props)} />}
</StoreContext.Consumer>
);
const YourConnectedComponent=props=>(
{state=>}
);
mapstatetops
在本例中是您提供给connect()
的函数。
这是非常简单的,由于各种性能原因,它实际上看起来并不完全像这样,但它适合演示一般概念
useSelector
hook也会使用存储上下文,但不会为此创建一个组件。它直接返回组件要使用的选定状态。它在内部使用useContext
,这是使用上下文的“挂钩方式”
useDispatch
只是将dispatch()
公开给您的组件,以便它使用它来调度操作
从技术上讲,无论您使用的是hook还是connect()
connect
都是一个高阶组件
,其工作是提供一种将Redux商店连接到组件的方法useSelector
和useDispatch
是等效的hooks
。这只是做同样事情的另一种技术
class Component extends React.Component{
componentDidMount(){
const { fetchApi, arg } = this.props
fetchApi(arg)
}
}
const mapDispatchToProps = dispatch =>({
fetchApi : arg => dispatch(fetchApi(arg))
})
const mapStateToProps = state =>({
arg : state.arg
})
export default connect(mapStateToProps, mapDispatchToProps)(Component)
现在使用hooks
const Component = () =>{
const dispatch = useDispatch()
const arg = useSelector(state => state.arg)
useEffect(() =>{
dispatch(fetchApi(arg))
},[dispatch, arg])
}
两者的作用完全相同,只是将redux
连接到组件
内部状态
的方法不同而已。两者都使用Redux的上下文来公开给定组件中的分派
和状态
使用hook和连接到我的React Redux项目之间有什么区别
有两个主要区别:
- 范围
connect
可以与React类组件和函数组件一起使用,而hook只能与函数组件一起使用
- 性能vs简单性
使用挂钩更简单。这种简单性是有代价的:与connect
相比,您可以使用的性能调整更少。哪一个更复杂:您将其称为传入配置选项(很少或很多),然后返回connect
的“配置风格”。这种风格就是您调用的HOC,它传入您的组件以使其重新包装。
主要配置选项之一是前面提到的MapStateTops
功能。你不必使用它,但在大多数情况下你会使用它。还有4个其他功能,它们仅为您提供各种机会来提高您将使用connect
来包装的组件的性能。这些函数被调用:
arestatequal
areStatePropsEqual
areOwnPropsEqual
aremergedropsequal
所有4个都是可选的。您可以将connect
配置选项作为none或部分或全部传入,并调整性能。值得注意的是,即使您不传入任何函数,这些函数的默认实现(实际上是性能帮助器)也将应用,因此,您将获得比使用对应函数的钩子更优化性能的包装组件
非常正确,我发现我的钩状组件比HOC组件慢一点。我想知道React是如何在钩子基础设施中解决这个问题的,还是React Redux的缺点更多?性能调整是否可以通过useSelector函数公开?@Eniola React的作者/维护人员会更清楚,我感觉他们接受现在挂钩提供的优化选择更少。connect()
的优点是它同时接受函数和类组件,因此可以始终将Redux与没有挂钩的函数组件一起使用。您将如何衡量性能差异?非常简洁
const Component = () =>{
const dispatch = useDispatch()
const arg = useSelector(state => state.arg)
useEffect(() =>{
dispatch(fetchApi(arg))
},[dispatch, arg])
}