react项目的Component需导入React

react实践 专栏收录该内容
3 篇文章 0 订阅

项目场景:

最近在学react框架,打算从零开始实现一个react项目,状态管理结合redux实现。在此,通过博客记录一下这一过程所遇到的问题及解决方案。
目前项目刚启动,确定了程序目录结构。
在这里插入图片描述


问题描述:

在新建的第一个展示组件文件中,出现了这样的问题:

Uncaught ReferenceError: React is not defined
    at Profile.render (profile.jsx:9)
    at finishClassComponent (react-dom.development.js:17485)
    at updateClassComponent (react-dom.development.js:17435)
    at beginWork (react-dom.development.js:19073)
    at HTMLUnknownElement.callCallback (react-dom.development.js:3945)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:3994)
    at invokeGuardedCallback (react-dom.development.js:4056)
    at beginWork$1 (react-dom.development.js:23964)
    at performUnitOfWork (react-dom.development.js:22779)
    at workLoopSync (react-dom.development.js:22707)

在这一jsx文件中,我并未使用React,但是控制台却显示错误“React is not defined”。


原因分析:

根据错误提示可知,这一问题是没有在文件中导入“React”。接下来就来分析一下为什么要导入React。
这一展示组件的文件类型是jsx,使用的构建代码类似这样:

class Profile extends Component {
  render() {
    return (<button>点我</button>)
  }
}

这段代码在js代码中使用了html片段,并不是合法的js代码,它是一种被称为jsx的语法扩展。而这样的代码,浏览器是无法识别的。这时,就需要Babel发挥光芒了。
Babel主要是一个JavaScript转换器,它可以转换各种ES*代码为浏览器可识别的ES代码。在JSX文件中,Babel会把html片段转换为使用React.createElement()类的ES5的语句,以使得其能被现今的浏览器引擎识别。
转化后,变成了这样:

class Profile extends Component {
  render() {
    return React.createElement(
      'button',
      null,
      '点我'
    );
  }
}

由此得知,使用Babel转化jsx,就必须要使用React的createElement方法。所以,需要在文件开头导入React。


解决方案:

这里有两种解决方案:
(1)在文件头导入React

import React from 'react'

(2)不在文件中使用jsx语法,而使用纯的js语句。只不过这样,会让代码变得难以理解和修改。既然有造好的轮子,为什么不用呢?

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

斡_lmy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值