React中的元素、组件、节点详解

本文主要和大家介绍了react中的元素、组件节点,也给大家做个参考,希望能帮助到大家。

React 中的元素、组件、实例和节点,是React中关系密切的4个概念,也是很容易让React 初学者迷惑的4个概念。现在,老干部就来详细地介绍这4个概念,以及它们之间的联系和区别,满足喜欢咬文嚼字、刨根问底的同学(老干部就是其中一员)的好奇心。

元素 (Element)

React 元素其实就是一个简单JavaScript对象,一个React 元素和界面上的一部分DOM对应,描述了这部分DOM的结构及渲染效果。一般我们通过JSX语法创建React 元素,例如:

const element = 

Hello, world

;

登录后复制

element是一个React 元素。在编译环节,JSX 语法会被编译成对React.createElement()的调用,从这个函数名上也可以看出,JSX语法返回的是一个React 元素。上面的例子编译后的结果为:

const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, world!');

登录后复制

最终,element的值是类似下面的一个简单JavaScript对象:

const element = { type: 'h1', props: {  className: 'greeting',  children: 'Hello, world' }}

登录后复制

React 元素可以分为两类:DOM类型的元素和组件类型的元素。DOM类型的元素使用像h1、p、p等DOM节点创建React 元素,前面的例子就是一个DOM类型的元素;组件类型的元素使用React 组件创建React 元素,例如:

const buttonElement = ;

登录后复制

buttonElement就是一个组件类型的元素,它的值是:

const buttonElement = { type: 'Button', props: {  color: 'red',  children: 'OK' }}

登录后复制

对于DOM类型的元素,因为和页面的DOM节点直接对应,所以React知道如何进行渲染。但是对于组件类型的元素,如buttonElement,React是无法直接知道应该把buttonElement渲染成哪种结构的页面DOM,这时就需要组件自身提供React能够识别的DOM节点信息,具体实现方式在介绍组件时会详细介绍。

有了React 元素,我们应该如何使用它呢?其实,绝大多数情况下,我们都不会直接使用React 元素,React 内部会自动根据React 元素,渲染出最终的页面DOM。更确切地说,React元素描述的是React虚拟DOM的结构,React会根据虚拟DOM渲染出页面的真实DOM。

组件 (Component)

React 组件,应该是大家最熟悉的React中的概念。React通过组件的思想,将界面拆分成一个个可以复用的模块,每一个模块就是一个React 组件。一个React 应用由若干组件组合而成,一个复杂组件也可以由若干简单组件组合而成。

React组件和React元素关系密切,React组件最核心的作用是返回React元素。这里你也许会有疑问:React元素不应该是由React.createElement() 返回的吗?但React.createElement()的调用本身也是需要有“人”负责的,React组件正是这个“责任人”。React组件负责调用React.createElement(),返回React元素,供React内部将其渲染成最终的页面DOM。

既然组件的核心作用是返回React元素,那么最简单的组件就是一个返回React元素的函数:

function Welcome(props) { return 

Hello, {props.name}

;}

登录后复制

Welcome是一个用函数定义的组件。如果使用类(class)定义组件,返回React元素的工作具体就由组件的render方法承担,例如:

class Welcome extends React.Component { render() {  return 

Hello, {this.props.name}

; }}

登录后复制

其实,使用类定义的组件,render方法是唯一必需的方法,其他组件的生命周期方法都只不过是为render服务而已,都不是必需的。

现在来考虑下面这个例子:

class Home extends React.Component { render() {  return (   

        

Anything you like

     ) }}

登录后复制

Home 组件使用了Welcome组件,返回的React元素为:

{ type: 'p', props: {  children: [   {    type: 'Welcome',    props: {     name: '老干部'    }   },   {    type: 'p',    props: {     children: 'Anything you like'    }   },  ] }}

登录后复制

对于这个结构,React 知道如何渲染type = ‘p’ 和 type = ‘p’ 的节点,但不知道如何渲染type=’Welcome’的节点,当React 发现Welcome 是一个React 组件时(判断依据是Welcome首字母为大写),会根据Welcome组件返回的React 元素决定如何渲染Welcome节点。Welcome组件返回的React 元素为:

{ type: 'h1', props: {  children: 'Hello, 老干部' }}

登录后复制

这个结构中只包含DOM节点,React是知道如何渲染的。如果这个结构中还包含其他组件节点,React 会重复上面的过程,继续解析对应组件返回的React 元素,直到返回的React 元素中只包含DOM节点为止。这样的递归过程,让React 获取到页面的完整DOM结构信息,渲染的工作自然就水到渠成了。

另外,如果仔细思考的话,可以发现,React 组件的复用,本质上是为了复用这个组件返回的React 元素,React 元素是React 应用的最基础组成单位。

实例 (Instance)

这里的实例特指React组件的实例。React 组件是一个函数或类,实际工作时,发挥作用的是React 组件的实例对象。只有组件实例化后,每一个组件实例才有了自己的props和state,才持有对它的DOM节点和子组件实例的引用。在传统的面向对象的开发方式中,实例化的工作是由开发者自己手动完成的,但在React中,组件的实例化工作是由React自动完成的,组件实例也是直接由React管理的。换句话说,开发者完全不必关心组件实例的创建、更新和销毁。

节点 (Node)

在使用PropTypes校验组件属性时,有这样一种类型:

MyComponent.propTypes = {  optionalNode: PropTypes.node,}

登录后复制

PropTypes.node又是什么类型呢?这表明optionalNode是一个React 节点。React 节点是指可以被React渲染的数据类型,包括数字、字符串、React 元素,或者是一个包含这些类型数据的数组。例如:

// 数字类型的节点function MyComponent(props) { return 1;}// 字符串类型的节点function MyComponent(props) { return 'MyComponent';}// React元素类型的节点function MyComponent(props) { return 

React Element

;}// 数组类型的节点,数组的元素只能是其他合法的React节点function MyComponent(props) { const element = 

React Element

; const arr = [1, 'MyComponent', element]; return arr;}// 错误,不是合法的React节点function MyComponent(props) { const obj = { a : 1} return obj;}

登录后复制

最后总结一下,React 元素和组件的概念最重要,也最容易混淆;React 组件实例的概念大家了解即可,几乎使用不到;React 节点有一定使用场景,但看过本文后应该也就不存在理解问题了。

相关推荐:

React中组件间抽象实例讲解

React中组件的写法有哪些

简单搭建一个react项目

以上就是React中的元素、组件、节点详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2785515.html

(0)
上一篇 2025年3月8日 17:27:10
下一篇 2025年3月4日 20:17:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • React组件性能优化方法解答

    不要将性能优化的精力浪费在对整体性能提高不大的代码上,而对性能有关键影响的部分,优化并不嫌早。因为,对性能影响最关键的部分,往往涉及解决方案核心,决定整体的架构,将来要改变的时候牵扯更大。 1. 单个React组件的性能优化 React利用…

    编程技术 2025年3月8日
    200
  • React Native如何实现图片查看组件

    react native 图片查看组件:react-native-image-viewer,纯js组件,小巧快速的图标查看组件。支持图片放大缩小,支持图片加载失败设置替代图片,支持将图片保存到本地等功能。本文主要和大家介绍了react na…

    2025年3月8日
    200
  • 关于React组件项目实践

    开始前: 我们使用ES6、ES7语法如果你不是很清楚展示组件和容器组件的区别,建议您从阅读这篇文章开始如果您有任何的建议、疑问都清在评论里留言 基于类的组件。 现在开发React组件一般都用的是基于类的组件。下面我们就来一行一样的编写我们的…

    编程技术 2025年3月8日
    200
  • React组件的性能优化方法

    1. 单个react组件的性能优化 React利用Virtual DOM来提升渲染性能,虽然每一次页面更新都是最组件的从新渲染,但是并不是将之前的渲染内容全部抛弃重来,借助Virtual DOM,React能够计算出对DOM树的最少修改,这…

    编程技术 2025年3月8日
    200
  • React Native如何使用fetch实现图片上传

    本文介绍了react native使用fetch实现图片上传的示例代码,分享给大家,具体如下:普通网络请求参数是json对象 图片上传的请求参数使用的是formdata对象 使用fetch上传图片代码封装如下: let common_url…

    编程技术 2025年3月8日
    200
  • 基于jquery的一个懒加载组件

    这次给大家带来基于jquery的一个懒加载组件,基于jquery的懒加载组件的注意事项有哪些,下面就是实战案例,一起来看一下。 #home { background: rgba(245, 245, 245, .8); width: 1000…

    编程技术 2025年3月8日
    200
  • vue子组件与父组件通信详解

    这次给大家带来vue子组件与父组件通信详解,使用vue子组件与父组件通信详解的注意事项有哪些,下面就是实战案例,一起来看一下。 一、父组件与子组件通信,1、在插入的子组件的标签传入属性值如图: 2、在子组件用props接收,如图: zhij…

    2025年3月8日 编程技术
    200
  • Vue的2.0组件注册详解

    这次给大家带来vue的2.0组件注册详解,vue的2.0的组件注册的注意事项有哪些,下面就是实战案例,一起来看一下。 //全局注册: Vue.component(“my-component”,{template:’A custom comp…

    编程技术 2025年3月8日
    200
  • Vue如何添加element UI的组件

    这次给大家带来vue如何添加element ui的组件,vue添加element ui的组件的注意事项有哪些,下面就是实战案例,一起来看一下。 根据文档.按需加载模块需要配置(若不是按需加载则不用改这个文件) .babelrc文件; er1…

    编程技术 2025年3月8日
    200
  • H5如何做图片上传预览组件

    这次给大家带来h5如何做图片上传预览组件,h5做出图片上传预览组件的注意事项有哪些,下面就是实战案例,一起来看一下。 本人开发环境是windows10测试浏览器是chrome 和火狐如遇不兼容浏览器的可尝试升级浏览器或Google一下 (~…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论