我是反应新手,正在尝试学习 redux。我想访问类内的存储,但它给了我一个错误,我不能在类中使用钩子。
当我在函数中使用此代码时(正如我在 YouTube 教程中看到的那样(,它可以毫无问题地工作。在这里,我可以访问商店中的柜台。
function App() {
const counter = useSelector(state => state.counter);
return <div>{counter}</div>;
}
但是当我想在课堂上这样做时,它给了我一个错误,我不能在课堂上使用钩子。
那么,如何在类组件中访问我的商店useSelector或useDispatch呢?
正如@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
导入increment
和decrement
,并从react-redux
模块导入connect
。
useSelector
和useDispatch
是 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/
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>