如何在类组件中使用 react-redux useSelector?

Posted

技术标签:

【中文标题】如何在类组件中使用 react-redux useSelector?【英文标题】:How can I use react-redux useSelector in class component? 【发布时间】:2019-11-29 19:54:39 【问题描述】:

我是 react 新手,正在尝试学习 redux。我想访问类内的商店,但它给了我一个错误,我不能在类中使用钩子。

当我在函数中使用此代码时(正如我在 YouTube 教程中看到的那样),它可以正常工作。在这里我可以访问商店的柜台。

 function App() 
      const counter = useSelector(state => state.counter);
    
      return <div>counter</div>;
    

但是当我想在课堂上这样做时,它给了我一个错误,我不能在课堂上使用钩子。

那么如何在类组件中访问我的商店 useSelector 或 useDispatch?

【问题讨论】:

你为什么要在课堂上使用它 假设你想使用 didMount 调用 fetch 从服务器获取数据。现在在这种情况下有什么解决方案? 已经内置在钩子中 reactjs.org/docs/hooks-effect.html 在函数组件中使用 useEffect() 钩子来获得副作用,所以如果你想在 didMount 中调用函数,请在 useEffect 中调用它。 【参考方案1】:

正如@Ying Zuo 所说,您的方法仅适用于功能组件。解决这个问题:

代替这一行:

const counter = useSelector(state => state.counter);

您可以这样定义计数器状态:

const mapStateToProps = state => (
    counter: state.counter
);

那么对于调度,你应该像这样使用它:

const mapDispatchToProps = () => ( 
    increment, 
    decrement
);

最后你像这样组合所有东西:

export default connect(
    mapStateToProps,
    mapDispatchToProps()
)(App);

不要忘记从action 导入incrementdecrement,从react-redux 模块导入connect

【讨论】:

这个答案没有回答作者的问题。 @Medanko 你在什么范围内定义mapDispatchToProps【参考方案2】:

class App extends Component 
    constructor(props)
        super(props)
        this.state = 
            reduxState : 
        
    
    DummyView = () => 
        const reducer = useSelector(state => state.reducer)
        useEffect(() => 
            this.setState(
                reduxState : reducer
            )
        , [])
        return null
    
    render()
        return(
            <this.DummyView/>
        )
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

【讨论】:

【参考方案3】:

useSelectoruseDispatch 是 React Hooks,只能在函数组件中工作。

https://reactjs.org/docs/hooks-overview.html#but-what-is-a-hook

使用 React Hooks,大多数组件都可以并且应该使用函数组件来编写。如果你必须写一个基于类的组件,你可以使用 react-redux 中的connect

https://blog.logrocket.com/react-redux-connect-when-and-how-to-use-it-f2a1edab2013/

【讨论】:

以上是关于如何在类组件中使用 react-redux useSelector?的主要内容,如果未能解决你的问题,请参考以下文章

React-Redux 中同一组件的多个实例

如何对 React-Redux 连接组件进行单元测试?

如何访问组件外部的 react-redux 存储

React-redux mapStateToProps,mapDispatchToProps 如何使用

如何使用 React-Router 和 React-Redux 将道具发送到子路由组件?

Jest/Enzyme 单元测试:如何将存储传递给使用 redux 4 和 react-redux 6 连接功能的浅层组件