Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 使用React-Redux挂钩和React-Redux Connect()之间的主要区别是什么?_Reactjs_React Redux_React Hooks - Fatal编程技术网

Reactjs 使用React-Redux挂钩和React-Redux Connect()之间的主要区别是什么?

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={

我即将开始一个与React Redux的项目。对于API引用,有hook和connect()。因为,钩子是连接API的替代品。使用钩子或连接到我的React Redux项目有什么区别。

钩子使您可以直接访问
分派
和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])
}