【发布时间】:2021-11-10 07:28:07
【问题描述】:
Redux 状态在第一次渲染中未定义,我在 reducer 中返回了 initilizedState = {}
store.js
const store = createStore(
rootReducer,
compose(
applyMiddleware(thunk),
window.devToolsExtension ? window.devToolsExtension() : (f) => f
)
)
export default store
rootReducer.js
const rootReducer = combineReducers({
search: searchReducer,
product: productReducer,
})
export default rootReducer
reducer.js
const initialState = {}
const productReducer = (state = initialState, action) => {
const { type, payload } = action
switch (type) {
case PRODUCTS_ALL:
console.log('reducer')
return { ...state, items: payload }
default:
return state
}
}
export default productReducer
action.js
const products = axios.create({
baseURL: 'http://localhost:8001/api/products',
})
export const allProducts = () => async (dispatch) => {
console.log('fetching')
await products.get('/').then((res) => {
dispatch({
type: PRODUCTS_ALL,
payload: res.data,
})
})
}
虽然我在提要容器中使用了 connect()
Feed.js
function Feed({ allProducts, product }) {
const [productItems, setProductItems] = useState()
const [loading, setLoading] = useState(false)
React.useEffect(() => {
allProducts()
console.log(product)
}, [])
return (
<div className='feed__content'>
{loading ? (
<Loader
type='Oval'
color='#212121'
height={100}
width={100}
/>
) : (
<div className='feed__products'>
<div className='feed__productsList'>
{product.map((product) => {
return (
<Product
name={product.name}
image={product.image}
price={product.price}
/>
)
})}
</div>
</div>
)}
</div>
)
}
const mapStateToProps = (state) => ({
product: state.product.items,
})
const mapDispatchToProps = (dispatch) => {
return {
allProducts: () => dispatch(allProducts()),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Feed)
如果您查看控制台上的数据,您将看到 undefined 但如果我添加 useEffect 依赖项,它将创建一个循环,其中第一个是未定义的,其余的是我想要的数据。 因为这个问题,当我想用 map 渲染产品时,它会抛出一个错误,说 can't map undefiend 。
我该如何解决这个问题
【问题讨论】:
-
你真的定义了初始状态吗?
(state = initialState, action) -
@Nectos 是的,我添加了 initialState
-
你能告诉我们你是如何初始化 redux 存储的吗?您的
createStore函数调用是什么样的?您是否添加了预加载状态? -
@Andrew 我添加了我的 store.js 文件先生我应该怎么做
-
好吧,如果我理解正确的话,第一次渲染实际上比状态变化发生得更快,导致
undefined部分,所以第二次渲染它将填充数据(product?.map也可以提供帮助)。您可以添加保护子句以防止在没有数据时进行渲染。因为它在reducer store,你实际上可以使用useSelector。我也看不到loading被设置为true的位置。
标签: javascript reactjs react-redux axios