【发布时间】:2021-10-30 01:59:40
【问题描述】:
我明白了:
store.js
import {productListReducer,productDetailsReducer,} from './reducers/productReducers'
const reducer = combineReducers({ productList: productListReducer, productDetails: productDetailsReducer,})
const initialState = {}
const middleware = [thunk]
const store = createStore(
reducer,
initialState,
composeWithDevTools(applyMiddleware(...middleware))
)
export default store
productListReducer.js
export const productListReducer = (state = { products: [] }, action) => {
switch (action.type) {
case PRODUCT_LIST_REQUEST:
return { loading: true, products: [] }
case PRODUCT_LIST_SUCCESS:
return {
loading: false,
products: action.payload.products,
pages: action.payload.pages,
page: action.payload.page,
}
case PRODUCT_LIST_FAIL:
return { loading: false, error: action.payload }
default:
return state
}
}
productActions.js
export const listProducts = (keyword = '', pageNumber = '') => async (
dispatch
) => {
try {
dispatch({ type: PRODUCT_LIST_REQUEST })
const { data } = await axios.get(
`/api/products?keyword=${keyword}&pageNumber=${pageNumber}`
)
console.log(data) //data has items
dispatch({
type: PRODUCT_LIST_SUCCESS,
payload: data,
})
} catch (error) {
dispatch({
type: PRODUCT_LIST_FAIL,
payload:
error.response && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
HomeScreen.js
import { listProducts } from '../action/productActions'
const HomeScreen = ({match}) => {
const keyword = match.params.keyword
const pageNumber = match.params.pageNumber || 1
const dispatch = useDispatch()
const productList = useSelector((state) => state.productList)
const { loading, error, products, page, pages } = productList
useEffect(() => {
dispatch(listProducts(keyword, pageNumber))
console.log(productList) //empty
console.log(products) //empty
}, [dispatch, keyword, pageNumber])
我看到我的数据可以正常获取(productActions.js),但是我没有看到任何products into HomeScreen.js
--添加 HomeScreen.js => 返回
return (
<>
<h1>Latest Products</h1>
{loading ? (
<Loader />
) : error ? (
<Message variant='danger'>{error}</Message>
) : (
<>
<Row>
{products > 0 && products.map((product) => (
<Col key={product._id} sm={12} md={6} lg={4} xl={3}>
<Product product={product} />
</Col>
))}
</Row>
</>
)}
</>
)
--更新 => index.js
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
---Redux
进入PRODUCT_LIST_SUCCESS我看到payload有数据,
不知怎的,它没有通过......
有时也会显示:
GET http://localhost:3000/api/products 500 (Internal Server Error)
---来自PRODUCT_LIST_REQUEST & PRODUCT_LIST_SUCCESS的日志
-动作-
-状态-
===开发工具/网络
另外,在“响应”选项卡中,我看到了我的数据
【问题讨论】:
-
在调用
dispatch后立即记录productList和products将记录旧值。组件在重新渲染之前无法看到更新的状态。使用useEffect挂钩记录更新的值:useEffect(() => { console.log(productList, products); }, [productList, productst]) -
检查了这个:
{products: Array(0)}products: [][[Prototype]]: Object [] -
如何在
HomeScreen中渲染products? -
更新我的问题(把我的回报放在那里)
-
您是否在应用的根目录中包含了 Redux Provider?
标签: reactjs redux react-redux react-hooks use-effect