【问题标题】:React/Redux Multiple components activatated on clickReact/Redux 点击时激活多个组件
【发布时间】:2020-11-10 10:18:14
【问题描述】:

我正在学习 React/Redux,除了课程之外,我还尝试自己做一些事情。所以我从我玩的名为“流放之路”的游戏中复制了一个地图集,但有一些变化。例如,我试图“解决”的主要问题是单击地图并突出显示地图,显示地图已完成,如果再次单击该地图将不完整。就像imgs中的例子:

Completed Maps

Uncompleted Maps

我的问题是,当我点击一张地图时,所有其他地图都标记为已完成。图片上只有 2 张地图,但有 156 张地图,显然我不想点击地图 X 并突出显示所有其他地图。

这是我加载每个地图的组件:

export default props => (
    <div className="regions">
        <Region region="haewark_hamlet">
            <Map
                map_title="Bog"
                map_name="bog"
                white_map={maps.haewark.bog.white}
                yellow_map={maps.haewark.bog.yellow}
                red_map={maps.haewark.bog.red}
                map_tier="3"
            />
            <Map
                map_title="Vaal Pyramid"
                map_name="vaal_pyramid"
                white_map={maps.haewark.vaal_pyramid.white}
                yellow_map={maps.haewark.vaal_pyramid.yellow}
                red_map={maps.haewark.vaal_pyramid.red}
                map_tier="3"
            />
        </Region>
        <Region region="tirns_end" />
        <Region region="glennach_cairns" />
        <Region region="new_vastir" />
        <Region region="lex_ejoris" />
        <Region region="lex_proxima" />
        <Region region="valdos_rest" />
        <Region region="lira_arthain" />
    </div>
);

这是我的地图组件:

const Map = props => {
    const { completed } = props;

    const toggleComplete = function () {
        completed ? props.mapUncomplete() : props.mapComplete();
    };

    return (
        <div className={`map ${props.map_name}`} id={props.map_name}>
            <div className="map-name">{props.map_title}</div>
            <img className="map-size" src={base_map} alt="base map" />
            <div className="map-tier-color">
                <img
                    className={`map-size ${props.map_name}-white`}
                    src={props.white_map}
                    alt={`${props.map_name} white map`}
                />
                <img
                    className={`map-size ${props.map_name}-yellow`}
                    src={props.yellow_map}
                    alt={`${props.map_name} yellow map`}
                />
                <img
                    className={`map-size ${props.map_name}-red`}
                    src={props.red_map}
                    alt={`${props.map_name} red map`}
                />
            </div>
            <div className="map-tier-number">Tier {props.map_tier}</div>

            <div
                className={`toggle-completed ${completed ? "completed-map" : ""}`}
                onClick={() => toggleComplete()}
            ></div>
        </div>
    );
};

const mapStateToProps = state => ({
    completed: state.poeapp.completed,
});

const mapDispatchToProps = dispatch =>
    bindActionCreators(
        {
            mapComplete,
            mapUncomplete,
        },
        dispatch,
    );

export default connect(mapStateToProps, mapDispatchToProps)(Map);

这是我的地图操作:

export const mapComplete = () => ({
    type: "MAP_COMPLETE",
    payload: true,
});

export const mapUncomplete = () => ({
    type: "MAP_UNCOMPLETE",
    payload: false,
});

这是我的 Map Reducer:

const INITIAL_STATE = {
    completed: false,
};

export default (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case "MAP_COMPLETE":
            return { ...state, completed: action.payload };
        case "MAP_UNCOMPLETE":
            return { ...state, completed: action.payload };
        default:
            return state;
    }
};

正如我所说,我还在学习,我确定我做错了什么,我只是不知道是什么!如果我的疑问不够清楚,请告诉我,我会尝试重写它!谢谢!

【问题讨论】:

    标签: javascript reactjs redux action reducers


    【解决方案1】:

    如果您只想将一些地图标记为已完成/未完成,则应在 redux 中保留一个结构以了解哪些已完成,哪些未完成。

    例如,您的商店应如下所示:

    {
       ...
       completed: [0,2,3,...,78,90],
    }
    

    您可以假设,如果地图 ID 不在该数组中,则地图未完成。在这种情况下,您的动作创建者也应该更改。您必须提供您所引用的地图的标识符,而不是仅仅传递地图是否完成。

    显然,这只是一个示例,并不是解决您的问题的最佳实施方式。由您决定找到适合您问题的那个。 但是,基本思想仍然是相同的:您必须向您的组件、动作创建者以及您的减速器提供您想要应用您的动作的地图的标识符。

    【讨论】:

    • 嘿,谢谢你的回复,你说的商店是指本地商店吗?因为这就是我要问的,它与 localstore 合作得好吗?因为我想让它为每个人单独工作,所以我认为 localstore 会解决这个问题,对吗?
    • 实际上我做到了,谢谢你。我的“问题”是我不认为这是一个问题,但一个不好的做法是我有两个几乎完全相同的操作,例如: export const mapCompleted = id => ({ type: "MAP_COMPLETED", payload: id, } ); export const mapUncompleted = id => ({ type: "MAP_UNCOMPLETED", payload: id, });这里唯一改变的是类型,我可以做些什么来使它正确吗?还是让它这样工作没关系?
    • 我不认为有动作创建者做大部分相同的事情是一种不好的做法......只要它使代码更具可读性。但是,也许您可​​以让动作创建者创建相同的动作,但方向相反。或者,更好的是,您可以尝试使用“toggleMapComplete”操作,因为您似乎只需将每个地图的状态更改为相反的状态。关于您之前的评论,我试图用 store 来表示 Redux 商店。
    • 好的,谢谢你的回复和帮助人,帮我抢了!在您的帮助下,我遇到的问题得到了解决,现在我会先尝试让它工作,然后我会重构我的代码,使其 100% 正确和可读,最好的问候!
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多