当前位置: 首页 > 面试题库 >

使用已绑定的方法来对此未定义进行反应

东郭鹤龄
2023-03-14
问题内容

我有一个React应用程序,我正在尝试使用来自javascript文件的数据来构建Navbar组件。

我的NavbarData.js文件如下所示:

const NavbarData = [
    {
        id: 1, 
        text: "Typography"
    },
    {
        id: 2,
        text: "Buttons"
    },
    {
        id: 3,
        text: "icons"
    }
]

export default NavbarData

我正在.map()遍历此数据并NavbarItem在App.js文件中创建组件。

// Build navmenu items
const navbarItems = this.state.navbarData.map(function(item){
  return <NavbarItem key={item.id} text={item.text} id={item.id}></NavbarItem>
});

这是我的NavbarItem.js文件

从’react’导入React,{组件};

class NavbarItem extends Component{
    render(){
        return(
            <>
                <li key={this.props.id} id={this.props.id}>{this.props.text}</li>
            </>
        )
    }
}

export default NavbarItem

所有这些使我看起来像这样。太好了

图片1

但我想为每个按钮添加一个监听器。由于这是一个单页应用程序,因此我想呈现一个版式,按钮或图标组件。为此,我需要一个函数来更新父组件的状态,在我的情况下,该组件只是App.js。

所以我将以下函数放入App.js中

  //This function changes the state so that different components can render
  navClick(id) {
    console.log('changed', id);
  }

而且我确保将其绑定到App.js的构造函数中

this.navClick = this.navClick.bind(this);

我的整个App.js文件现在看起来像这样

//React stuff
import React, { Component } from 'react';

//Bootstrap stuff
import { Container, Row, Col } from 'reactstrap';

//Layout
import NavbarItem from './layout/NavbarItem'
import NavbarData from './layout/NavbarData'

//Components
import Typography from './components/Typography/Typography'
import Buttons from './components/Buttons/Buttons'

//Styles
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';

class App extends Component {
  constructor(){
    super();

    // State determines what component is active and loads navbar data
    this.state = {
      navbarData: NavbarData,
      typography: true,
      buttons: false,
      icons: false
    }

    this.navClick = this.navClick.bind(this);
  }
  //This function changes the state so that different components can render
  navClick(id) {
    console.log('changed', id);
  }

  render() {

    // Build navmenu items
    const navbarItems = this.state.navbarData.map(function(item){
      return <NavbarItem key={item.id} text={item.text} id={item.id}></NavbarItem>
    });


    // Determine what component to display in main area using state
    let elementToDisplay;
    if(this.state.typography){
      elementToDisplay = <Typography></Typography>
    }
    else if(this.state.buttons){
      elementToDisplay = <Buttons></Buttons>
    }

    ////////////////////////////////////////////////////


    return (
      <Container fluid={true}>
        <Row>
          <Col>Header</Col>
        </Row>
        <Row>
          <Col xs="12" sm="12" md="1" lg="1" xl="1">
            <ul>
              {navbarItems}
            </ul>
          </Col>
          <Col xs="12" sm="12" md="11" lg="11" xl="11">
            {elementToDisplay}
          </Col>
        </Row>
        <Row>
          <Col>Footer</Col>
        </Row>
      </Container>
    );
  }
}

export default App;

当我尝试将navClick函数附加到映射的NavbarItem时,就会出现问题。

// Build navmenu items
const navbarItems = this.state.navbarData.map(function(item){
  return <NavbarItem navigationWhenClicked={this.navClick} key={item.id} text={item.text} id={item.id}></NavbarItem>
});

我收到的错误如下:

TypeError:这是未定义的

TypeError

但这不是我的问题,因为我要确保绑定我的函数。

我真的不知道我在做什么错。任何帮助,将不胜感激。


问题答案:

您传递给的函数.map也具有其自己的this绑定。最简单的解决方案是将this
第二个参数.map传递给:

const navbarItems = this.state.navbarData.map(function(item) {
  ...
}, this);

this 函数内部将设置为您作为第二个参数传递的任何参数,在本例中为组件实例

或者,您可以使用箭头函数代替函数表达式,因为this箭头函数内部是按词法解析的(例如,像其他变量一样):

const navbarItems = this.state.navbarData.map(
  item => <NavbarItem navigationWhenClicked={this.navClick} key={item.id} text={item.text} id={item.id} />
});


 类似资料:
  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • 我之前问过这个问题,它与这个问题相关(如何从异步调用返回响应?),但它并没有解决我的问题 我是node.js的新手,我遇到了一些我无法处理的错误,或者找不到任何我理解的帮助。我使用express generator初始化应用程序。我试图通过一个api调用将我得到的对象发送到前端。我编写了一个类“StockClass.js”,其中包含一个函数makeApiCall(),该函数进行调用并返回对象。但当

  • 本文向大家介绍vue在自定义组件中使用v-model进行数据绑定的方法,包括了vue在自定义组件中使用v-model进行数据绑定的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍了vue v-model进行数据绑定,分享给大家,具体如下 官方例子https://vuefe.cn/v2/api/#model 有这么一句话: 默认情况下,一个组件上的 v-model 会把 value 用作 pr

  • 问题内容: 我正在尝试在python3中编写一个简单的递归函数。在学习OO Java时,我还想编写涉及对象的Python代码。这是我的下面的代码。我提示用户输入一个数字,屏幕应该显示每个小到5的整数。 但是,当我在终端上运行它时,它说:“ NameError:未定义名称’recursive’”。错误如下所示: 是什么导致问题出在这里?我知道如何编写递归函数,给它一个参数,然后使其在终端上运行。但是

  • 本文向大家介绍Python中绑定与未绑定的类方法用法分析,包括了Python中绑定与未绑定的类方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下: 像函数一样,Python中的类方法也是一种对象。由于既可以通过实例也可以通过类来访问方法,所以在Python里有两种风格: 未绑定的类方法:没有self 通过类来引用方

  • 我试图在不使用预定义方法或数组列表的情况下对2d数组进行排序。 我想把这个定为 我尝试了很多方法,成功地订购了第一个元素,但添加第二个元素没有成功。我不张贴我的工作,因为它是不成功的任何建议将不胜感激