useEffect 派发问题(可能需要添加中间件)
useEffect dispatch problem (you may need to add middleware)
API
import axios from "axios"
const url = "http://localhost:5000/posts"
export const fetchPosts = () => async () => await axios.get(url)
export const createPost = async (post) => await axios.post(url, post)
动作
export const fetchPosts = async (dispatch) => {
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
商店
import { createStore, applyMiddleware } from 'redux'
import rootReducer from './index'
import thunk from 'redux-thunk'
export default function configureStore() {
return createStore(rootReducer, applyMiddleware(thunk))
}
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Provider } from 'react-redux'
import configureStore from './Redux/store/configureStore'
const store = configureStore();
ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
我想通过 axios 向我的 post 发出获取请求。 post 请求没有问题,但我无法获得。
useEffect(() => {
dispatch(fetchPosts())
}, [dispatch])
当我使用这个方法时它抛出这个错误:
错误:操作必须是普通对象。相反,实际类型是:'Promise'。您可能需要将中间件添加到您的商店设置中以处理调度其他值,例如 'redux-thunk' 来处理调度功能。
没有任何语法或import/export错误。
为什么即使我插入 redux thunk 来存储它也会抛出这个中间件错误?
export const fetchPosts = () => async () => await axios.get(url)
上面的函数returns一个承诺
尝试
export const fetchPosts = async () => {
let res = await axios.get(url)
return res;
}
您需要更新fetchPosts
return一个函数
export const fetchPosts = () => async (dispatch) => {
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
你的操作有点问题。 Action creators 是 return 操作的函数。您想 return 来自动作创建者的动作(在本例中为函数)。
所以你的行动应该是:
export const fetchPosts = () => async (dispatch) => {
// Added this part ^^^^^^
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
或者,您可以对代码进行以下更改:
useEffect(() => {
dispatch(fetchPosts)
// Removed the () ^
}, [dispatch])
API
import axios from "axios"
const url = "http://localhost:5000/posts"
export const fetchPosts = () => async () => await axios.get(url)
export const createPost = async (post) => await axios.post(url, post)
动作
export const fetchPosts = async (dispatch) => {
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
商店
import { createStore, applyMiddleware } from 'redux'
import rootReducer from './index'
import thunk from 'redux-thunk'
export default function configureStore() {
return createStore(rootReducer, applyMiddleware(thunk))
}
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Provider } from 'react-redux'
import configureStore from './Redux/store/configureStore'
const store = configureStore();
ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
我想通过 axios 向我的 post 发出获取请求。 post 请求没有问题,但我无法获得。
useEffect(() => {
dispatch(fetchPosts())
}, [dispatch])
当我使用这个方法时它抛出这个错误:
错误:操作必须是普通对象。相反,实际类型是:'Promise'。您可能需要将中间件添加到您的商店设置中以处理调度其他值,例如 'redux-thunk' 来处理调度功能。
没有任何语法或import/export错误。
为什么即使我插入 redux thunk 来存储它也会抛出这个中间件错误?
export const fetchPosts = () => async () => await axios.get(url)
上面的函数returns一个承诺
尝试
export const fetchPosts = async () => {
let res = await axios.get(url)
return res;
}
您需要更新fetchPosts
return一个函数
export const fetchPosts = () => async (dispatch) => {
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
你的操作有点问题。 Action creators 是 return 操作的函数。您想 return 来自动作创建者的动作(在本例中为函数)。
所以你的行动应该是:
export const fetchPosts = () => async (dispatch) => {
// Added this part ^^^^^^
try {
const {data} = await api.fetchPosts()
dispatch({
type: types.FETCH_POSTS,
payload: data
})
} catch (err) {
console.error(err)
}
}
或者,您可以对代码进行以下更改:
useEffect(() => {
dispatch(fetchPosts)
// Removed the () ^
}, [dispatch])