Javascript 错误-操作必须是普通对象。使用自定义中间件进行异步操作
我正在尝试实现redux,并将和对象抛出到存储中。我在调用操作时得到了正确的对象,但在调用store.dispatch()时,存储永远不会更新。它只包含初始状态。我想我什么都试过了,但我错过了一些小东西。任何帮助都将不胜感激! signUp.jsJavascript 错误-操作必须是普通对象。使用自定义中间件进行异步操作,javascript,reactjs,react-redux,redux-thunk,Javascript,Reactjs,React Redux,Redux Thunk,我正在尝试实现redux,并将和对象抛出到存储中。我在调用操作时得到了正确的对象,但在调用store.dispatch()时,存储永远不会更新。它只包含初始状态。我想我什么都试过了,但我错过了一些小东西。任何帮助都将不胜感激! signUp.js import {getUsers} from "../actions/getUsersActions"; import {bindActionCreators} from "redux"; import {connect} from "react-r
import {getUsers} from "../actions/getUsersActions";
import {bindActionCreators} from "redux";
import {connect} from "react-redux";
import store from '../store';
class SignMo extends Component {
constructor(props) {
super(props);
this.state = {
users: [],
firstName: '',
lastName: '',
email: '',
username: '',
password: ''
}
}
async getUsers () {
await this.props.getUsers()
.then(response => {
this.setState({users: response.users.users});
})
.catch(function (error) {
console.log(error);
});
console.log('store =>', store.getState())
};
componentDidMount() {
this.getUsers = this.getUsers.bind(this);
this.getUsers();
}
render(){
return(
<stuff/>
)
}
const mapStateToProps = state => {
const { users } = state;
return {
users: users,
};
};
const mapDispatchToProps = dispatch => ({
getUsers: () => store.dispatch( getUsers() )
})
export default connect(
mapStateToProps,
mapDispatchToProps
)(SignMo);
getUsersReducer
import axios from "axios";
const url = "http://localhost:3333";
export const USERS_SUCCESS = "USERS_SUCCESS";
export const USERS_FAILURE = "USERS_FAILURE";
export const usersSuccess = users => {
return {
type: USERS_SUCCESS,
users
};
};
export const usersFailure = error => {
return {
type: USERS_FAILURE,
error
};
};
export const getUsers = () => {
return dispatch => {
return axios
.get(`${url}/users`)
.then(response => {
console.log('success', JSON.stringify(response));
return dispatch(usersSuccess(response.data));
})
.catch(error => {
console.log('err', error.response.data.message);
return dispatch(usersFailure(error.response.data));
});
};
};
store.js
import { composeWithDevTools } from "redux-devtools-extension";
import createSagaMiddleware from "redux-saga";
import thunk from "redux-thunk";
import reducer from "./reducer";
const sagaMiddleware = createSagaMiddleware();
const store = createStore(
reducer,
composeWithDevTools(applyMiddleware(sagaMiddleware, thunk))
);
export default store;
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render((
<BrowserRouter>
<App />
</BrowserRouter>
), document.getElementById('root'));
serviceWorker.unregister();
从“React”导入React;
从“react dom”导入react dom;
从“./App”导入应用程序;
将*作为serviceWorker从“/serviceWorker”导入;
从“react router dom”导入{BrowserRouter};
ReactDOM.render((
),document.getElementById('root');
serviceWorker.unregister();
App.js
import {
BrowserRouter as Router,
Switch,
Route
} from "react-router-dom";
import { Provider } from 'react-redux'
import store from "./store";
export default function App() {
return (
<Provider store={store}>
<Router>
<div>
<Switch>
<Route path="/login">
<Login />
</Route>
<Route path="/home">
<div className='primaryContainer'>
<EngagementBar/>
<Home />
</div>
</Route>
<Route path="/SignUp">
<SignUp className="centerSignUp" />
</Route>
<Route path="/Tags">
<Tags />
</Route>
<Route path="/signMo">
<SignMo />
</Route>
<Route path="/search">
<div className="primaryContainer"><Search /></div>
</Route>
<Route path="/profile">
<Profile />
</Route>
<Route path="/upload">
<Upload />
</Route>
<Route path="/notifications">
<Notifications />
</Route>
<Route path="/information">
< Information />
</Route>
<Route path="/"> {/*must be last !!!*/}
<Load />
</Route>
</Switch>
</div>
</Router>
</Provider>
);
}
导入{
BrowserRouter作为路由器,
转换
路线
}从“反应路由器dom”;
从“react redux”导入{Provider}
从“/store”导入存储;
导出默认函数App(){
返回(
{/*必须是最后一个!!!*/}
);
}
您有
throwInStore=()=>{
仓库调度(
this.props.getUsers()
);
};
但是你为什么派来这里this.props.getUsers()
已经是按照mapDispatchToProps
中的定义分派到存储的操作。所以它就像说dispatch(dispatch(getUsers())
这也可能是一个问题:
const mapDispatchToProps=dispatch=>
bindActionCreators(
{
getUsers,
},
派遣
);
我不明白你为什么需要bindActionCreators
。我想这样重写:
const mapDispatchToProps=dispatch=>({
getUsers:()=>store.dispatch(getUsers())
})
另外,现在使用mapDispatchToProps
中的dispatch
,您可以从getUser
函数中删除所有return dispatch
。每个操作实际上应该只有一个dispatch
关键字:
export const getUsers=()=>{
返回轴
.get(`${url}/users`)
。然后(响应=>{
log('success',JSON.stringify(response));
store.dispatch(userssaccess(response.data));
})
.catch(错误=>{
日志('err',error.response.data.message);
store.dispatch(usersFailure(error.response.data));
});
};
我一直遇到这个错误。这是您编写的大量代码。你能把它放进一个或一些功能性的例子中,这样我们就可以玩它了吗?我编辑了以匹配更改,但我的strore仍然只包含初始状态,并且从未更新。你是否仍然收到初始错误,或者现在只是存储区未更新的问题?您的实际getUsers
函数中有许多dispatch
语句。我编辑了我的答案…看看这些新的编辑是否有效。我得到的分派没有定义--在代码中,并且没有编译。。。我需要导入一些东西吗?我把它改成了store.dispatch
…试试看。但是您必须导入存储
。我从来没有用过沙箱,但我把它扔了进去。我可以让你成为一个快速的服务器,如果你需要/想要它,我只会返回一个用户。错误是否告诉你是哪个功能导致了问题?通常当我得到这个错误时,它会说问题是在代码中的什么地方产生的…?上述错误发生在组件中:在SignMo(由ConnectFunction创建)在ConnectFunction(在App.js:49)在Route(在App.js:48)在Switch(在App.js:32)在div(在App.js:31)在Router(由BrowserRouter创建)中在BrowserRouter中(在App.js:30)在Provider中(在App.js:29)在App中(在src/index.js:9)在BrowserRouter中(在src/index.js:8)在Router中(由BrowserRouter创建)
import {
BrowserRouter as Router,
Switch,
Route
} from "react-router-dom";
import { Provider } from 'react-redux'
import store from "./store";
export default function App() {
return (
<Provider store={store}>
<Router>
<div>
<Switch>
<Route path="/login">
<Login />
</Route>
<Route path="/home">
<div className='primaryContainer'>
<EngagementBar/>
<Home />
</div>
</Route>
<Route path="/SignUp">
<SignUp className="centerSignUp" />
</Route>
<Route path="/Tags">
<Tags />
</Route>
<Route path="/signMo">
<SignMo />
</Route>
<Route path="/search">
<div className="primaryContainer"><Search /></div>
</Route>
<Route path="/profile">
<Profile />
</Route>
<Route path="/upload">
<Upload />
</Route>
<Route path="/notifications">
<Notifications />
</Route>
<Route path="/information">
< Information />
</Route>
<Route path="/"> {/*must be last !!!*/}
<Load />
</Route>
</Switch>
</div>
</Router>
</Provider>
);
}