如何使用 useSelector 显示对象数组?
How to show array of objects with useSelector?
我应该用什么代替 useSelector
或 mapStateToProps
?那些 运行 多次(array.lenght
)并将所有值更改为最后一个值。
我有一个电子商务应用程序,
ProductDetails
组件包含产品评论,我将它们映射到 ProductReview
组件以获取从用户 ID 获取的用户信息。
ProductDetails.js
import React, { useEffect } from "react";
import ProductReview from "../components/ProductReview";
import { useSelector, useDispatch } from 'react-redux';
import { getProductDetailsById } from "../Store/actions/productActions";
export default function ProductDetails(props) {
const dispatch = useDispatch()
const product = useSelector((state) => state.product)
useEffect(() => {
const { id } = props.match.params;
const payload = {
params: {
id,
},
};
dispatch(getProductDetailsById(payload));
},[dispatch, props.match.params]);
return (
<div>
{product.productDetails.reviews &&
product.productDetails.reviews.map((item , index) =>
(
<li key={item.userId}>
<ProductReview key={item.userId} userId={item.userId}
review={item.review}/>
</li> )
)}
)}
</div>
);
}
ProductReview.js
import React,{ useState, useEffect } from 'react';
import { getUSerById } from '../Store/actions/userAction';
import {useDispatch , useSelector} from 'react-redux';
export default function ProductReview(props) {
const dispatch = useDispatch()
const user = useSelector(state => state.user)
const {userId} = props;
useEffect(() => {
const payload = {
params : {
userId
}
}
dispatch(getUSerById(payload))
},[userId]);
return (
<div>
{user && user.user.firstName} : {props.review}
</div>
)
}
这部分代码 运行s 多次并且
将所有用户信息值(用户名)更改为最后一个。
**所有产品评论 firstName
更改为最后一个 ** 全部同名
const user = useSelector(state => state.user)
有什么办法可以解决这个问题吗??
运行 目前在 ProductReview
组件中使用 Axios 和 useState()
,但我想使用 redux。
userReducer.js
import { userConstants } from "../actions/Types";
const initState = {
user: {},
loading: false,
error: null
};
export default (state = initState, action) => {
console.log(action.payload)
switch(action.type){
case userConstants.GET_USER_BY_ID_SUCCESS:
return state = {
...state,
user : action.payload.user,
loading: false,
error: null
}
case userConstants.GET_USER_BY_ID_FAILURE:
return state = {
state,
error: action.payload.error
}
default:
return state
}
}
根据我在评论中的理解,您需要以某种方式将所有用户存储在您的 redux 存储中。
例如,您可以执行以下操作:
将 initState
更改为:
const initState = {
users: {},
loading: false,
error: null
};
改变GET_USER_BY_ID_SUCCESS
减速机
(请注意,我使用的是user.id
,但也许你的id存储在其他属性):
case userConstants.GET_USER_BY_ID_SUCCESS:
return state = {
...state,
users: { ...state.users, [action.payload.user.id]: action.payload.user },
loading: false,
error: null
}
将 useSelector 更改为:
const users = useSelector(state => state.users)
添加:
const user = users[props.userId]
这样你应该有正确的用户。如果我遗漏了什么,请告诉我。
还有一个选择。但是像那两个一样,这也会 运行 多次。但我还是要分享它:
var client;
store.subscribe(() => {
client = store.getState().client;
});
将这段代码放在您的组件之上,赋予它全局作用域,可以在您的组件中访问此客户端变量。每次 store 发生变化时,subscribe 方法都会读入它并导致其中的函数呈现,这导致 getState() 函数获取存储在 store 中的状态的客户端部分。现在您有一个要在您的组件中使用的变量,该变量将在商店更改时更新。
我应该用什么代替 useSelector
或 mapStateToProps
?那些 运行 多次(array.lenght
)并将所有值更改为最后一个值。
我有一个电子商务应用程序,
ProductDetails
组件包含产品评论,我将它们映射到 ProductReview
组件以获取从用户 ID 获取的用户信息。
ProductDetails.js
import React, { useEffect } from "react";
import ProductReview from "../components/ProductReview";
import { useSelector, useDispatch } from 'react-redux';
import { getProductDetailsById } from "../Store/actions/productActions";
export default function ProductDetails(props) {
const dispatch = useDispatch()
const product = useSelector((state) => state.product)
useEffect(() => {
const { id } = props.match.params;
const payload = {
params: {
id,
},
};
dispatch(getProductDetailsById(payload));
},[dispatch, props.match.params]);
return (
<div>
{product.productDetails.reviews &&
product.productDetails.reviews.map((item , index) =>
(
<li key={item.userId}>
<ProductReview key={item.userId} userId={item.userId}
review={item.review}/>
</li> )
)}
)}
</div>
);
}
ProductReview.js
import React,{ useState, useEffect } from 'react';
import { getUSerById } from '../Store/actions/userAction';
import {useDispatch , useSelector} from 'react-redux';
export default function ProductReview(props) {
const dispatch = useDispatch()
const user = useSelector(state => state.user)
const {userId} = props;
useEffect(() => {
const payload = {
params : {
userId
}
}
dispatch(getUSerById(payload))
},[userId]);
return (
<div>
{user && user.user.firstName} : {props.review}
</div>
)
}
这部分代码 运行s 多次并且
将所有用户信息值(用户名)更改为最后一个。
**所有产品评论 firstName
更改为最后一个 ** 全部同名
const user = useSelector(state => state.user)
有什么办法可以解决这个问题吗??
运行 目前在 ProductReview
组件中使用 Axios 和 useState()
,但我想使用 redux。
userReducer.js
import { userConstants } from "../actions/Types";
const initState = {
user: {},
loading: false,
error: null
};
export default (state = initState, action) => {
console.log(action.payload)
switch(action.type){
case userConstants.GET_USER_BY_ID_SUCCESS:
return state = {
...state,
user : action.payload.user,
loading: false,
error: null
}
case userConstants.GET_USER_BY_ID_FAILURE:
return state = {
state,
error: action.payload.error
}
default:
return state
}
}
根据我在评论中的理解,您需要以某种方式将所有用户存储在您的 redux 存储中。 例如,您可以执行以下操作:
将
initState
更改为:const initState = { users: {}, loading: false, error: null };
改变
GET_USER_BY_ID_SUCCESS
减速机 (请注意,我使用的是user.id
,但也许你的id存储在其他属性):case userConstants.GET_USER_BY_ID_SUCCESS: return state = { ...state, users: { ...state.users, [action.payload.user.id]: action.payload.user }, loading: false, error: null }
将 useSelector 更改为:
const users = useSelector(state => state.users)
添加:
const user = users[props.userId]
这样你应该有正确的用户。如果我遗漏了什么,请告诉我。
还有一个选择。但是像那两个一样,这也会 运行 多次。但我还是要分享它:
var client;
store.subscribe(() => {
client = store.getState().client;
});
将这段代码放在您的组件之上,赋予它全局作用域,可以在您的组件中访问此客户端变量。每次 store 发生变化时,subscribe 方法都会读入它并导致其中的函数呈现,这导致 getState() 函数获取存储在 store 中的状态的客户端部分。现在您有一个要在您的组件中使用的变量,该变量将在商店更改时更新。