【发布时间】:2020-04-21 02:57:35
【问题描述】:
我正在尝试在我的 React 应用程序中的组件之间交换一些数据,并尝试使用 Redux。
我真的在寻找简单的功能(存储 accesstoken,检索 accesstoken)。
我在文件夹 src/reducers/currenttokenreducer.js 中有一个文件:
const currentTokenReducer = (state, action) => {
switch(action.type){
case 'SETTOKEN':
return action.payload
case 'GETTOKEN':
return state
default: return null
}
}
export default currentTokenReducer;
然后我在 src/reducers/ 中有一个 index.js:
import currentUserReducer from './currentuser.js'
import currentTokenReducer from'./currenttoken.js'
import {combineReducers} from 'redux'
const allReducers = combineReducers({
currentUserReducer, currentTokenReducer
})
export default allReducers
终于在 index.js 中我有了:
import React from 'react';
import b2cauth from 'react-azure-adb2c';
import ReactDOM from 'react-dom';
import jwt from 'jwt-decode'
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {createStore} from 'redux';
import allReducers from './reducers';
import {Provider} from 'react-redux'
const store = createStore(allReducers);
我猜 App/ 与 Provider 的正确封装:
b2cauth.run(() => {
ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
serviceWorker.unregister();
在 App.js 中,我触发了一个 gettoken 函数,并希望将它存储在本地状态和 redux 存储中:
componentDidMount (){
this.gettoken();
}
async gettoken(){
const dispatch = useDispatch();
let apiurl = 'https://get.....azurewebsites.net……'
var token = await Axios.get(apiurl,{headers: { 'Content-Type': 'application/x-www-form-urlencoded' }});
this.setState({accesstoken: token.data});
dispatch (settoken(token.data));
}
settoken 定义在 src/actions/:
export const settoken = (token) => {
return {
type: 'SETTOKEN',
payload: token
};
};
当我部署它时,我得到:
未处理的拒绝(错误):无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本同一个应用 请参阅 ... 了解有关如何调试和解决此问题的提示。
它指向 App.js 中的这一行:
const dispatch = useDispatch();
我做错了什么?
【问题讨论】:
-
看起来你在类组件中调用
useDispatch。useSelector和useDispatch是 React Hooks,只在函数组件中起作用。
标签: reactjs redux react-redux