【问题标题】:this.state is undefined inside function - React JS [duplicate]this.state 在函数内部未定义 - React JS [重复]
【发布时间】:2018-05-12 19:17:29
【问题描述】:

为什么我在这里得到状态未定义?我尝试了各种解决方案,但没有一个对我有用。有人可以指出这里做错了什么

编辑:

组件的完整代码

  class Sidebar extends React.Component {
    constructor (props) {
      super(props)
      this.state = {
        menuSelected: menuOptions.menuItems[0].title,
      }
      this.createMenuListItem = this.createMenuListItem.bind(this)
    }
    render () {
      console.log(this.state.menuSelected)
      function getChildItems (child) {
        let childItems = child.children.map(function (menuItem, index) {
          return createMenuListItem(menuItem)
        })
        return (
          <li key={child.title} className='dropdown'>
            <i className={child.iconName} />
            <span className='dropdown-toggle'>{child.title}</span>
            <ul className=''>
              {childItems}
            </ul>
          </li>
        )
      }
      function createMenuListItem (menuItem) {
        if (menuItem.hasChild === 'N') {
          console.log(this.state.menuSelected)
          return (
            <li key={menuItem.title}>
              <a href='#'>
                <i className={menuItem.iconName} />
                <span>{menuItem.title}</span>
              </a>
            </li>
          )
        } else {
          return getChildItems(menuItem)
        }
      }

      let menuItemsLoaded = menuOptions.menuItems.map((menuItem, index) => {
        return createMenuListItem(menuItem)
      })
      return (
        <nav id='sidebar'>
          <ul className='list-unstyled'>
            {menuItemsLoaded}
          </ul>
        </nav>
      )
    }
  }

  export default Sidebar

当侧边栏内容从服务器动态加载时,有人可能会提出更好的选择

【问题讨论】:

  • 因为需要将函数createMenuListItemthis绑定。
  • 我尝试在构造函数 this.createMenuListItem = this.createMenuListItem.bind() 中添加它,但出现以下错误“无法读取未定义的属性‘绑定’”
  • 这是错误的`this.createMenuListItem.bind()`应该是this.createMenuListItem = this.createMenuListItem.bind(this)
  • 我仍然收到同样的错误“无法读取未定义的属性‘绑定’”

标签: reactjs ecmascript-6


【解决方案1】:

通过使用function,您会失去上下文,而this 不是您所期望的。

在这种情况下,要么使用箭头函数:

render() {
  createMenuItems = (items) => {
    console.log(this.state.menuSelected)
    ...
  }
}

或者,我的建议来了,将createMenuItems移到render方法之外:

createMenuItems = (items) => {
  console.log(this.state.menuSelected)
}

render() {
  return (
    <nav id='sidebar'>
      <ul className='list-unstyled'>
        {menumenuOptions.menuItems.map((menuItem, index) =>
          this.createMenuListItem(menuItem)
        )}
      </ul>
    </nav>
  )
}

在构造函数中绑定也是可能的:

class YourComponent extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      menuSelected: '',
    }

    this.createMenuListItem = this.createMenuListItem.bind(this)
  }

  createMenuListItem() {
    console.log(this.state.menuSelected)
  }

  render() {
    return (
      <nav id='sidebar'>
        <ul className='list-unstyled'>
          {menumenuOptions.menuItems.map((menuItem, index) =>
            this.createMenuListItem(menuItem)
          )}
        </ul>
      </nav>
    )
  }
}

【讨论】:

  • createMenuListItem 调用另一个函数。当我将这两个函数移到渲染方法之外时。我得到函数未定义错误
  • @Mr.Noob 所以也许可以分享更多你的代码:)
  • 添加完整代码
  • 工作感谢....不得不将函数内部的 map 方法转换为箭头
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多