首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Items.map不是一个函数

Items.map不是一个函数
EN

Stack Overflow用户
提问于 2019-03-13 08:10:39
回答 4查看 2.9K关注 0票数 1

我使用下移,以创建一个下拉显示一些菜单选项。我创建了一个具有下移的可重用的React组件,但是现在我得到了这个错误:

代码语言:javascript
复制
Uncaught TypeError: items.map is not a function
    at IconDropdown.react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement.react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement (index.jsx:29)

以下是此错误引用的代码:

代码语言:javascript
复制
{isOpen ? (
              <div className="dropdown-menu">
                {items.map(item => ( // Specifically this map
                  <button
                    type="button"
                    {...getItemProps({ item })}
                    key={item}
                    className="dropdown-item"
                  >
                    <Icon icon={item.icon} /> {item.name}
                  </button>
                ))}
              </div>
            ) : null}

我在主屏幕组件中使用它,如下所示:

代码语言:javascript
复制
 items = {
  editUser: {
    name: 'Edit Info',
    icon: 'pencil-square-o'
  },
  changePassword: {
    name: 'Change Password',
    icon: 'lock'
  },
  deleteUsed: {
    name: 'Delete user',
    icon: 'trash-o'
  }
};

render() {
 return (
  <IconDropdown items={this.items} />
)}

预期行为:呈现一个菜单项列表,并显示相应的图标。

当前行为:I得到上述错误。我不知道这个代码有什么问题。在我看来,这是正确的。

如果你想要的话,我可以把整个组件都贴出来,让我知道。

更新,整个下拉组件:

代码语言:javascript
复制
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';

import Downshift from 'downshift';

import Icon from 'lenses/common/components/Icon';

import './styles.scss';

const IconDropdown = ({ items, ...otherProps }) => (
  <Fragment>
    <Downshift {...otherProps}>
      {({ getItemProps, isOpen, toggleMenu }) => (
        <div>
          <div className="btn-group">
            <button
              id="my-select"
              type="button"
              className="btn btn-primary dropdown-toggle dropdown-toggle-split"
              onClick={toggleMenu}
              data-toggle="dropdown"
              aria-haspopup="true"
              aria-expanded={isOpen}
            >
              <span className="sr-only">Toggle Dropdown</span>
            </button>
            {isOpen ? (
              <div className="dropdown-menu">
                {items.map(item => (
                  <button
                    type="button"
                    {...getItemProps({ item })}
                    key={item}
                    className="dropdown-item"
                  >
                    <Icon icon={item.icon} /> {item.name}
                  </button>
                ))}
              </div>
            ) : null}
          </div>
        </div>
      )}
    </Downshift>
  </Fragment>
);

IconDropdown.propTypes = {
  items: PropTypes.shape({
    name: PropTypes.string.isRequired,
    icon: PropTypes.string
  })
};

export default IconDropdown;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-13 08:16:19

.map不存在于对象{},它只存在于数组[]。您可以:

  • 将对象更改为数组
  • 使用Object.keys(items).map(...)
  • 使用lodash.map
票数 4
EN

Stack Overflow用户

发布于 2019-03-13 08:15:59

尝试将Object.keys(objectname)放在数组映射之前。

map函数需要一个数组才能工作,使用Object.keys(objectname),您将把一个对象{}转换为一个有效的映射数组[]

代码语言:javascript
复制
Object.keys(items).map(item => ...
票数 1
EN

Stack Overflow用户

发布于 2019-03-13 08:16:14

object上迭代--这应该是array --只需更改

代码语言:javascript
复制
items = {
  editUser: {
    name: 'Edit Info',
    icon: 'pencil-square-o'
  },
  changePassword: {
    name: 'Change Password',
    icon: 'lock'
  },
  deleteUsed: {
    name: 'Delete user',
    icon: 'trash-o'
  }
};

代码语言:javascript
复制
items = [{
    name: 'Edit Info',
    icon: 'pencil-square-o'
  },{
    name: 'Change Password',
    icon: 'lock'
  },{
    name: 'Delete user',
    icon: 'trash-o'
  }
];

也可以使用items.enteries.map迭代对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55137072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档