【问题标题】:How can I use react-redux useSelector in class component?如何在类组件中使用 react-redux useSelector?
【发布时间】: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 中调用它。

标签: reactjs react-redux react-hooks


【解决方案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/

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 1970-01-01
      • 2022-11-14
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2019-12-19
      • 2022-12-01
      相关资源
      最近更新 更多