【问题标题】:React dynamic context menu/submenu反应动态上下文菜单/子菜单
【发布时间】:2019-08-16 06:05:46
【问题描述】:

使用 React 上下文菜单,在应用时动态创建带有子菜单的菜单,我能够成功呈现菜单,但我无法让子菜单工作。

import React, { Component } from 'react';
import ContextMenuTrigger from 'src/ContextMenuTrigger';
import ContextMenu from 'src/ContextMenu';
import MenuItem from 'src/MenuItem';
import SubMenu from 'src/SubMenu';

const MENU_TYPE = 'SIMPLE';

const targets= [
{
    name: 'Banana', 
}, 
{
    name: 'Apple', 
    subname: [
        {
        value: 'Red Apple', 
        description: 'description for red apple'
        },
        {
        value: 'Green Apple', 
        description: 'description for green apple'
        }
    ]
},
{
    name: 'Grapes', 
},
{
    name: 'Orange', 
    subname: [
        {
        value: 'Orange Juice', 
        description: 'description for Orange'
        },
        {
        value: 'Orange Color', 
        description: 'description for Orange'
        }
    ]
}
];



export default class SimpleMenu extends Component {
  constructor(props) {
    super(props);
}

render() {
    return (
        <div>
            <ContextMenuTrigger id={MENU_TYPE}>
                <div className='well'>right click menu</div>
            </ContextMenuTrigger>

            <ContextMenu id={MENU_TYPE}>                    
                {targets.map((item) => {
                            return (
                                <MenuItem>
                                    {item.name}
                                    <SubMenu>
                                    {item.subname.map(action => {
                                        {action.value}
                                    })}
                                    </SubMenu>
                                </MenuItem>
                            )
                        })}
            </ContextMenu>
        </div>
    );
 }
}

我遇到了错误:

 targets.subname.map(action => {{action.value}})}                                                   

错误:TypeError:item.subname 未定义

有没有更好的映射抛出嵌套对象的方法?

目标是从对象动态构建菜单和子菜单。

【问题讨论】:

    标签: javascript reactjs contextmenu submenu


    【解决方案1】:

    我认为您想要item.subname(而不是targets.subname),然后您想要添加存在检查,因为并非所有项目都有subname 字段。

    更新存在检查:

    {item.subname && item.subname.map()}
    

    【讨论】:

    • 我将代码更新为 item.subname 因为这是我正在测试的代码,但仍然出现“TypeError:item.subname is undefined”,子菜单只需要显示嵌套对象的子菜单,所以这是我被卡住的令人困惑的部分,我怎样才能进行存在检查并仍然显示带有和不带有子菜单的菜单。
    【解决方案2】:

    添加到 Colin 的回复中(他说您确实在该上下文中寻找 item.subname,这看起来比您的 target.subname.map 更合适,因为您在一个包含 item 范围内的函数中),请确保您的组件处理未定义 item.subname 的情况;你可以这样做

    item.subname != undefined ? 'render submenu items if any' : 'do nothing if undefined';
    

    【讨论】:

    • 我最终将targets.subname粘贴为错字,我也在使用item.subname,但我到达了如果我的对象没有任何嵌套的对象它会中断的部分,TypeError:item。 subname is undefined 你提到的检查underfined的这部分代码有点混乱,这是在map函数中吗?
    • @bernlt 很抱歉让您感到困惑。只需在尝试映射之前添加对未定义子名的检查。我现在正在打电话,所以为了让您更简单,只需在 {item.subname.map(action => { {action.value} })} 周围添加一个 if(item.subname) /SubMenu> 因为您的代码现在的编写方式会尝试在 item.subname 上为没有 .subname 的项目执行 .map,因此 TypeError item.subname 未定义。让我知道是否仍然损坏,我会在我的计算机上进一步帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多