问题描述
我的减速器具有以下结构:
{
"id": 8,"location_name": "Some place","lat": "nn.nnnnnn","lng": "-nn.nnnnn","review_count": 3,"score_avg": 3.00,"reviews": [
{
"id": 14,"userId": 1,"userName": "JohnDoe","body": "Lorem Ipsum.","score": null,"likes": 2,"liked": true,"review_pic": null
},{
"id": 15,"likes": 0,"liked": false,{
"id": 13,"userId": 4,"review_pic": null
}
]
}
另一方面,我有一个返回ID的动作创建者。我正在尝试获取此ID,以将Likes更改为true并设置likes + 1,但是该reducer状态的嵌套性质使我感到震惊。
编辑:这是我一直在尝试使用我的减速器的运气:
import {GET_REVIEWS,CLEAR_REVIEWS,LIKE} from './reviewTypes';
const initialState = [];
const reviewReducer = (state = initialState,action) => {
switch(action.type) {
case GET_REVIEWS:
return action.payload;
case LIKE:
const reviews = state.reviews.map(review => {
if(review.id === action.payload) {
return {
...review,liked: true,likes: review.likes++
}
} else {
return review;
}
});
return {
...state,reviews
}
case CLEAR_REVIEWS:
return [];
default:
return state;
}
}
export default reviewReducer;
解决方法
我使用Array#some遍历array.reviews以查找具有所需ID的评论。如果找到的话,我会增加点赞并将喜欢设置为true,
function updateLike(id,array) {
array.reviews.some(review => {
if (review.id==id) {
review.likes++;
review.liked = true;
return true;
}
});
}
let array = {
"id": 8,"location_name": "Some place","lat": "nn.nnnnnn","lng": "-nn.nnnnn","review_count": 3,"score_avg": 3.00,"reviews": [
{
"id": 14,"userId": 1,"userName": "JohnDoe","body": "Lorem Ipsum.","score": null,"likes": 2,"liked": true,"review_pic": null
},{
"id": 15,"likes": 0,"liked": false,{
"id": 13,"userId": 4,"review_pic": null
}
]
};
updateLike(15,array);
console.log(array);
,
您可以使用https://artsy.github.io/blog/2018/11/21/conditional-types-in-typescript/来获取具有特定id
的元素。
const data = { "id": 8,"reviews": [ { "id": 14,"review_pic": null },{ "id": 15,{ "id": 13,"review_pic": null } ] };
let id = 13;
let obj = data.reviews.find(x => x.id === id);
if(obj) obj.liked = true;
console.log(data);
,
您不必在那一个上使用reducer,因为您只有一个数组,并且useState应该很好,所以这段代码应该对您有用。
const onItemLike = (itemID) => {
setState(state.map(x => {
if(reviews.id === itemID)
return {...x,liked: true,likes: state.reviews[x].likes+1}
}))
}