React this 与已经绑定的方法未定义[重复]

2024-05-26

我有一个反应应用程序,我正在尝试使用 JavaScript 文件中的数据构建一个导航栏组件。

我的 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, { Component };

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

export default NavbarItem

所有这些给了我看起来像这样的东西。这太棒了。

但我想为每个添加一个点击侦听器。由于这是一个单页应用程序,我想渲染版式、按钮或图标组件。为此,我需要一个函数来更新父组件的状态,在我的例子中,父组件只是 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>
});

我收到的错误如下:

类型错误:这是未定义的

当谷歌搜索这个问题时,这是最上面的帖子。React:“this”在组件函数中未定义 https://stackoverflow.com/questions/33973648/react-this-is-undefined-inside-a-component-function

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

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


您传递给的函数.map也有自己的this捆绑。最简单的解决方案是通过this 作为第二个参数.map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Parameters:

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} />
});

也可以看看:如何在回调中访问正确的“this”? https://stackoverflow.com/q/20279484/218196

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React this 与已经绑定的方法未定义[重复] 的相关文章

  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • React onClick 事件仅在渲染组件时触发

    动态渲染组件的 onClick 函数应通过 useState 设置所选日期 imgs 上的 onClicks 完全按照您的预期工作 没有任何问题 即使只是在其位置放置一个带有 onClick 属性的 div 也是行不通的 当组件渲染时 on
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 如何渲染变量(或 prop)内部的 jsx/html?

    const Footer gt let a b Hey b return div Some bold text a div 这只会呈现为Some bold text b Hey b 如何将粗体文本渲染为粗体 变量内容是我自己的 所以我不必担
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 使用 ApolloClient 从 useContext 挂钩导入一个简单变量

    我的反应相对较新 似乎无法导入client来自上下文的变量 我有一个名为 federation tsx 的文件 其中包含一些代码 我相信这应该是相关部分 const link createHttpLink uri process env U
  • 使用 Vite 和 React 进行生产构建时出错:Uncaught TypeError 中的错误:_ 不是函数

    我在我的网站上使用 Vite React React Router 和 TypeScript 我在运行生产构建时遇到问题 在开发模式下一切正常 使用生产版本时 我的浏览器显示白色背景 并且在浏览器控制台中出现以下错误 上面的链接将我带到第
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz

随机推荐

  • Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合

    我正在使用 Doctrine 和这三个 相关 实体运行 Symfony 2 3 出版物 Author and 作者发表 Both Author and 出版物具有多对一关系作者发表 所以它基本上是一个多对多关系Author and 出版物但
  • 使用 C# 恢复数据库

    我正在尝试使用 Microsoft SqlServer Management Smo 将数据库从一台服务器恢复到另一台服务器 问题是我不断收到错误消息 指出找不到 MDF 文件 原因是它试图在 SQL 实例名称的数据文件夹中查找它的来源 而
  • Eclipse 不从目标平台下载相同版本的最新 jar

    我在 Eclipse IDE Indigo V3 7 2 中遇到一个奇怪的问题 我们使用托管在服务器上的目标平台 该服务器是使用 b3 聚合过程构建的 p2 存储库 我们从不同的团队获得某些组件和功能 每次他们提供插件时 版本号都保持不变
  • iOS CoreBluetooth:状态保存和恢复

    希望在这里得到一些意见 在我当前的 iOS 项目中 我使用 CoreBluetooth 和 swift 该应用程序可以在后台使用 CoreBluetooth 进行通信 这基本上可以工作 外设需要与 iOS 设备建立有效连接才能按预期工作 每
  • padStart 有什么替代方案[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 javascript 中使用 padStart 但它不适用于 Internet Explorer
  • {PHP} 致命错误:不在对象上下文中时使用 $this (Joomla)

    我真的不了解 php 并且碰壁了 问题是我的网站显示以下错误 Fatal error Using this when not in object context in hermes web07 b2350 pow thefoodie htd
  • Objective-c 截断字符串并在末尾添加省略号

    如何在 Objective C 中截断字符串 然后在末尾添加省略号 NSString origString A very long string blah blah blah const int clipLength 18 if origS
  • 按年月分组并在 Python 中查找前 N 个最小值列

    基于来自的输出数据帧这个链接 https stackoverflow com questions 69931611 resample by month and find certain number of columns which hav
  • Spring boot如何自定义HttpMessageConverter

    后端 Spring boot项目 v1 3 0 发布 向前端提供Rest JSON Api 刚才遇到错误 Infinite recursion StackOverflowError 我决定改变习惯FastJsonHttpMessageCon
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 线程“main”中出现异常 java.lang.NoClassDefFoundError: junit/textui/ResultPrinter 更新到 Yosemite 后

    我最近将系统从 Mavericks OSX 更新到 Yosemite 我过去可以右键单击测试并运行它 现在我得到了例外 Library Java JavaVirtualMachines jdk1 7 0 71 jdk Contents Ho
  • 仅为两个控制器分配不同的域

    我使用的是旧的 Yii v1 我只需要为两个控制器分配不同的域 所以我有一堆控制器 HomeController php CategoryController php GuestbookController php ShopControll
  • 等待进程直到所有子进程完成? [复制]

    这个问题在这里已经有答案了 我有一个创建两个或更多子进程的主进程 我希望主进程等待所有子进程完成其操作并退出 main script py p1 subprocess Popen python script1 py p2 subproces
  • 使用 AForge.Net 进行车牌识别

    我目前正在做一个项目 自动车牌检测和 识别 我正在使用 AForge Net 我使用了一个简单的算法 虽然效率不是很高 但是可以满足我的要求 我计算出高度 宽度和高宽比 高度 宽度 超过 40辆汽车的车牌号 我搜索了图像中位于范围内的矩形
  • 为什么可以让属性的名称与其返回类型相同?

    在C 中 为什么可以这样做 public Int32 Int32 get set 但不是这个 public int int get set 我的问题应该更清楚 属性的返回类型是否可以与属性具有相同的名称 变量的命名不得与 C 中的语言关键字
  • 如何禁用Spring Boot参数分割

    我们有许多 RestController 接收用户编写的通用语言短语 短语可以很长并且包含标点符号 例如句号 当然还有逗号 简化控制器示例 RequestMapping value countphrases method RequestMe
  • JMeter 为子功能添加 Think Time

    在 JMeter 中 当我右键单击 线程 控制器 时 我有一个选项 Add Think Time to children功能 当我点击它时 我会看到每个采样器Test Action暂停与Uniform Random Timer随机延迟 10
  • 如何向 Django 表单添加表单控件?

    我尝试将表单控件添加到我为 Django 制作的表单应用程序中 我已经创建了该应用程序 并希望将表单添加到引导程序模板中 但是我不知道如何为我的电子邮件字段添加引导程序的更时尚的文本框 我希望最终得到类似于此引导模板一角的登录字段的内容 尽
  • Android ConstraintLayout:如何在另一个视图下面添加动态视图

    我正在尝试在运行时在约束布局中将 TextView 添加到另一个下面 但我最终总是只有一个文本视图 其余的都隐藏在它后面 我尝试了几种方法 包括链接视图 但似乎没有任何效果 private void method int position
  • React this 与已经绑定的方法未定义[重复]

    这个问题在这里已经有答案了 我有一个反应应用程序 我正在尝试使用 JavaScript 文件中的数据构建一个导航栏组件 我的 NavbarData js 文件如下所示 const NavbarData id 1 text Typograph