Javascript 映射函数多次插入相同数据(React Redux)

Javascript 映射函数多次插入相同数据(React Redux),javascript,reactjs,react-redux,accordion,Javascript,Reactjs,React Redux,Accordion,我正在尝试使用React Redux实现React Accordion项目 这是我的Reducer代码,其中我有一个map函数,可以对每个id逐个执行操作: import*作为“../actions/actions”中的ActionType; 常量初始状态={ 活动:[ {id:1,状态:false}, {id:2,状态:false}, {id:3,状态:false}, {id:4,状态:false} ] } const reducer=(state=initialState,action)=

我正在尝试使用React Redux实现React Accordion项目

这是我的Reducer代码,其中我有一个map函数,可以对每个id逐个执行操作:

import*作为“../actions/actions”中的ActionType;
常量初始状态={
活动:[
{id:1,状态:false},
{id:2,状态:false},
{id:3,状态:false},
{id:4,状态:false}
]
}
const reducer=(state=initialState,action)=>{
开关(动作类型){
案例actionTypes.ACTIVE\u状态:
返回{
……国家,
活动:state.active.map((acdnobj)=>{
const panel=document.querySelector(`.panel-${acdnobj.id}`);
返回{
…acdnobj,
acdnobj:acdnobj.id==parseInt(action.id)(
acdnobj.status=true,
panel.style.maxHeight=panel.scrollHeight+“px”
) : (
acdnobj.status=false,
panel.style.maxHeight='0px'
)
}
}) 
}
违约:
}
返回状态;
}
导出默认减速机

这可能是Javascript上的数组可变问题,因此您可以使用上面的代码或尝试使用

是否可以共享您获得的结果活动状态?谢谢,如果我单击accordion 1,活动状态索引为“0”,当单击accordion 2时,活动状态索引也为“1”,依此类推。您知道您在减速器中进行状态突变,并且直接DOM操作是一个副作用(在其他纯函数中)还有一个非常重要的反模式呢?我还认为在reducer中操纵DOM元素不是一个合适的方法。你能把你的问题复制到一个运行的codesandbox中进行实时调试吗?更清楚地解释问题?很难理解您所说的“问题是,在运行时,我有多个手风琴用于相同的数据”是什么意思。我尝试了您的方法,但仍然返回多个手风琴,而且openReducer无法完美工作。我想问题出在map函数上,我已经用过很多次了。不知道该解决什么this@MuzamilHussain你能告诉我redux值(我是指多个值)的结果吗?>4[{…},{…},{…},{…},{…}],4[{…},{…},{…},{…}等等相同的值。
import * as actionTypes from '../actions/actions';

const initialState = {
    active: [
        { id: 1, status: false },
        { id: 2, status: false },
        { id: 3, status: false },
        { id: 4, status: false }
    ]
}
const reducer = (state = initialState, action) => {
    switch(action.type) {
        case actionTypes.ACTIVE_STATE:
            let newActive = [...state.active];
            newActive = newActive.map((acdnobj) => {
                  const panel = document.querySelector(`.panel-${acdnobj.id}`);
                  panel.style.maxHeight = (acdnobj.id === parseInt(action.id)) ? panel.scrollHeight + "px" : '0px';
                  return {
                      ...acdnobj,
                      status: acdnobj.id === parseInt(action.id)
                  }
            }) 
            
            return {
                ...state,
                active: newActive
            }
        default:
    }
    return state; 
}
export default reducer;