Eva*_*n B 58 javascript redux redux-toolkit
因此,createStore()Redux 现已弃用,并由@reduxjs/toolkitconfigureStore()推荐。
我很确定这与无法在我的操作中userInfo使用状态有关getState()。
getState()的userLogin回报undefined。但是当我删除 时getState(),该操作就起作用了。
店铺:
import { configureStore } from '@reduxjs/toolkit'
import thunk from 'redux-thunk'
import {
productAddReducer,
productDeleteReducer,
productDetailsReducer,
productListReducer,
productUpdateReducer,
} from './reducers/productReducers'
import { composeWithDevTools } from 'redux-devtools-extension'
import {
userLoginReducer,
userRegisterReducer,
userDetailsReducer,
userListReducer,
userDeleteReducer,
userUpdateReducer,
} from './reducers/userReducers'
const reducer = {
// User
userLogin: userLoginReducer,
userRegister: userRegisterReducer,
userDetails: userDetailsReducer,
userList: userListReducer,
userDelete: userDeleteReducer,
userUpdate: userUpdateReducer,
// Product
productAdd: productAddReducer,
productList: productListReducer,
productDetails: productDetailsReducer,
productUpdate: productUpdateReducer,
productDelete: productDeleteReducer,
}
const userInfoFromStorage = localStorage.getItem('userInfo')
? JSON.parse(localStorage.getItem('userInfo'))
: null
const preLoadedState = {
userLogin: { userInfo: userInfoFromStorage },
}
const middleware = [thunk]
const store = configureStore({
reducer,
preLoadedState,
middleware,
})
export default store
Run Code Online (Sandbox Code Playgroud)
行动:
import axios from 'axios'
import {
PRODUCT_ADD_FAIL,
PRODUCT_ADD_REQUEST,
PRODUCT_ADD_SUCCESS,
PRODUCT_DELETE_FAIL,
PRODUCT_DELETE_REQUEST,
PRODUCT_DELETE_SUCCESS,
PRODUCT_DETAILS_FAIL,
PRODUCT_DETAILS_REQUEST,
PRODUCT_DETAILS_SUCCESS,
PRODUCT_LIST_FAIL,
PRODUCT_LIST_REQUEST,
PRODUCT_LIST_SUCCESS,
PRODUCT_UPDATE_FAIL,
PRODUCT_UPDATE_REQUEST,
PRODUCT_UPDATE_SUCCESS,
} from '../constants/productConstants'
export const addProduct = product => async (dispatch, getState) => {
try {
dispatch({ type: PRODUCT_ADD_REQUEST })
const {
userLogin: { userInfo },
} = getState()
// USER INFO IS 'UNDEFINED' - ERROR: CANNOT READ PROPERTY OF DATA
// ACTION WORKS WHEN REMOVING USERINFO FROM THE ACTION
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${userInfo.token}`,
},
}
const { data } = await axios.post('/product', product, config)
dispatch({
type: PRODUCT_ADD_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_ADD_FAIL,
payload:
error.message && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
export const listProducts = () => async dispatch => {
try {
dispatch({ type: PRODUCT_LIST_REQUEST })
const { data } = await axios.get('/product')
dispatch({
type: PRODUCT_LIST_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_LIST_FAIL,
payload:
error.message && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
export const listProductDetails = id => async dispatch => {
try {
dispatch({ type: PRODUCT_DETAILS_REQUEST })
const { data } = await axios.get(`/product/${id}`)
dispatch({
type: PRODUCT_DETAILS_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_DETAILS_FAIL,
payload:
error.message && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
export const updateProduct = product => async (dispatch, getState) => {
try {
dispatch({ type: PRODUCT_UPDATE_REQUEST })
const {
userLogin: { userInfo },
} = getState()
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${userInfo.token}`,
},
}
const { data } = await axios.put(`/product/${product._id}`, product, config)
dispatch({
type: PRODUCT_UPDATE_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_UPDATE_FAIL,
payload:
error.message && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
export const deleteProduct = id => async (dispatch, getState) => {
try {
dispatch({ type: PRODUCT_DELETE_REQUEST })
const {
userLogin: { userInfo },
} = getState()
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${userInfo.token}`,
},
}
const { data } = await axios.delete(`/product/${id}`, config)
dispatch({
type: PRODUCT_DELETE_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_DELETE_FAIL,
payload:
error.message && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
Run Code Online (Sandbox Code Playgroud)
mar*_*son 201
我是 Redux 维护者,添加“createStore已弃用”消息的人:)
根据记录,这与您的实际应用程序代码无关。这是专门向像您这样使用“plain Redux”的用户传达的消息 - 它试图告诉您,您正在遵循更难使用的模式,我们希望您改用 Redux Toolkit,因为它会让您的生活变得更好容易得多:)
您会注意到,这甚至不是在控制台中打印的运行时警告 - 它实际上只是编辑器中的视觉指示器,例如。createStore
请参阅这些 Redux 文档页面,了解更多关于为什么我们希望人们使用 Redux Toolkit 编写 Redux 代码以及如何这样做的详细信息:
小智 50
您也可以像这样使用导入:
import { legacy_createStore as createStore } from 'redux';
Run Code Online (Sandbox Code Playgroud)
我收到了同样的警告,我按照 VS code 的指示做了。我导入了legacy_createStore。
import {legacy_createStore} from 'redux'
Run Code Online (Sandbox Code Playgroud)
或者您可以使用别名,以便您的代码保持不变。
import {legacy_createStore as createStore} from 'redux'
Run Code Online (Sandbox Code Playgroud)