React 循环数据 点赞的实现

我自己在鼓捣一个小功能的时候遇到一些问题,我并不是一个专业的前端开发人员,所以做起来有些吃力,分享一下个人思路:

我想做一个如图的点赞小功能:

如图

遇到的问题;

123

1 reducers 是个嵌套的json数据,如上图所示,修改state数据容易,但是修改state中嵌套数据的某一项却很困难。

我想了一撮头发的时间  大概思路:

首先在钩子函数componentDidMount() 中 设置 sessionStorage,存入每一项和总的数组

var storage = window.sessionStorage;

export const getList = () => {
    return (dispatch) => {
        axios.get(global.constants.recommended).then((res)=>{
            const data = res.data.items
            data.map((item)=>(
                storage.setItem(item.id, JSON.stringify(item))
            ))
            storage.setItem('praiseItems', JSON.stringify(data))
            dispatch(changeList(data));
        }).catch (()=>{
            console.log('Error')
        })
    }
};

然后 点赞onclick事件中要将点击的数据和storage 数据进行 diff 对比,修改parse状态然后,组成一个新的列表更新state

const addPraise = (data) =>({
    type: constants.HOME_ADD_PRAISE_DATA,
    data: data
})

export const addPraiseHandel = (id) => {
    return (dispatch) => {
        axios.get(global.constants.PraiseAdd).then((res)=>{
            // const result = res.data;
            const newsItems = []
            let data = JSON.parse(storage.getItem(id));
            let praiseItems = JSON.parse(storage.getItem('praiseItems'))
            allPraise.push(id)
            praiseItems.map((itm)=>{
                if (itm.id === data.id){
                    itm.praise = true
                    newsItems.push(itm)
                }else{
                    if(allPraise.includes(itm.id)){
                        itm.praise = true
                        newsItems.push(itm)
                    }else{
                    newsItems.push(itm)
                    }
                }
            })
            dispatch(addPraise(newsItems));
        }).catch (()=>{
            console.log('Error')
        })
    }
};

reducers

import { fromJS } from 'immutable';
import update from 'immutability-helper';
import * as constants from './constants';
// import { act } from 'react-dom/test-utils';

const defaultState = fromJS({
    WriterList: [],
    praiseData: false,
    praiseStatus: []
});

const reducer = (prevState = defaultState, action) => {
    switch (action.type) {
        case constants.HOME_ADD_PRAISE_DATA:
            // const addNewCollection = update(prevState.get('WriterList').toJS(), {[action.data - 1]:{$merge: {praise: true,}}});
            return prevState.set('WriterList', fromJS(action.data))
        
    default:
            return prevState;
    }

}
export default reducer;

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值