React面向组件编程(二)

简介: 【8月更文挑战第14天】React面向组件编程(二)

react是面向组件编程的一种模式,它包含两种组件类型:函数式组件类式组件

函数式组件

一个基本的函数组件长这个样子

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>hello_react</title>
  </head>
  <body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <!-- 引入react核心库 -->
    <script type="text/javascript" src="./js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="./js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="./js/babel.min.js"></script>
    <script type="text/babel">
      // 1、创建函数式组件
      function Demo() {
   
   
        return <h1>函数式组件</h1>;
      }
      // 2、渲染组件
      ReactDOM.render(<Demo />, document.getElementById("test"));
    </script>
  </body>
</html>

页面效果如下:
image.png

函数名的注意事项

注意,渲染组件时,函数名称需要写成html标签的形式。此外,函数名称不能使用小写的形式:

// 1、创建函数式组件
function demo() {
   
   
  return <h1>函数式组件</h1>;
}
// 2、渲染组件
ReactDOM.render(<demo />, document.getElementById("test"));

如上,如果写成小写的形式,控制台会报错image.png
这和Jsx的语法规则有关

  • 遇到 <开头的代码, 以标签的语法解析: html同名标签转换为html同名元素, 其它标签需要特别解析

    函数的执行者

    上述代码中,我们并没有执行Demo函数,但当我们将它作为标签使用时,react帮我们执行了这个函数。

    函数内的this指向

    正常情况下,一个函数内的this应该指向window,但下面的示例中,this会是undefined
    <script type="text/babel">
    // 1、创建函数式组件
    function Demo() {
         
         
      console.log("this", this);
      return <h1>函数式组件</h1>;
    }
    // 2、渲染组件
    ReactDOM.render(<Demo />, document.getElementById("test"));
    </script>
    
    image.png
    原因很简单,我们的代码是在babel环境下执行的,bable会开启严格模式,让我们this的指向不是window。

我们可以验证一下,打开bable官网,
image.png复制上述代码进去
image.png
可以看到,我们函数式组件最终会被编译成一个普通函数(这印证了JSX是语法糖)。

类式组件

一个基本的类式组件长这个样子

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>hello_react</title>
  </head>
  <body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <!-- 引入react核心库 -->
    <script type="text/javascript" src="./js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="./js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="./js/babel.min.js"></script>
    <script type="text/babel">
      // 1、创建类组件
      class MyComponent extends React.Component {
   
   
        render() {
   
   
          return <h1>这是一个类组件</h1>;
        }
      }
      // 渲染组件
      ReactDOM.render(<MyComponent />, document.getElementById("test"));
    </script>
  </body>
</html>

页面效果
image.png

类式组件的写法

类式组件必须继承React.Component这个父类,且函数内部必须调用render函数

class MyComponent extends React.Component {
   
   
  render() {
   
   
    return <h1>这是一个类组件</h1>;
  }
}

我们知道,类的使用必须使用new关键词,但是上述代码我们并没有使用,那么MyComponent的实例是什么时候创建的?
在渲染组件时,react帮我们执行的。

ReactDOM.render(<MyComponent />, document.getElementById("test"));

执行代码后:

  • react解析组件标签,找到了MyComponent组件
  • 发现组件是使用类定义的,随后new出类的实例,并通过实例调用原型上的render方法
  • 将render返回的虚拟Dom转换为真实Dom,随后呈现在页面中

    render函数

    render函数定义位置

    根据类的知识,render函数是定义在MyComponent类 的原型上的,我们打开控制台验证下
    GIF 2023-5-10 8-15-13.gif

    render函数中的this指向

    根据类的知识,我们知道render中的this应该是MyComponent的实例对象
    我们打印下
    // 1、创建类组件
    class MyComponent extends React.Component {
         
         
    render() {
         
         
      console.log("render中的this", this);
      return <h1>这是一个类组件</h1>;
    }
    }
    
    GIF 2023-5-10 8-20-34.gif
    可以看出,this确实是MyComponent的实例对象,同时也可以验证实例对象的prototype上的存在MyComponen的render方法

    组件中的属性

    观察打印出来的实例对象,我们可以发现实例对象上存在很多属性方法,如context、props等
    image.png
    这些方法我们没有在MyComponent类中定义,那它必然来源于继承的父类React.Component。这些组件上的属性方法,接下来是我们需要熟知的。
相关文章
|
JavaScript 前端开发 开发者
React 和 Vue 的不同编程模型
React 和 Vue 的不同编程模型
83 0
|
JavaScript 前端开发
Vue与React编程式路由导航
Vue与React编程式路由导航
|
存储 设计模式 资源调度
我是这样在 React 中实践 TDD 编程的
我是这样在 React 中实践 TDD 编程的
181 0
React-36:编程式路由导航
React-36:编程式路由导航
119 0
React-36:编程式路由导航
|
前端开发 JavaScript API
|
2月前
|
前端开发 JavaScript 开发者
深入理解React Hooks:提升前端开发效率的关键
【10月更文挑战第5天】深入理解React Hooks:提升前端开发效率的关键
|
22天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
59 9
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
2月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
|
2月前
|
前端开发 数据管理 编译器
引领前端未来:React 19的重大更新与实战指南🚀
React 19 即将发布,带来一系列革命性的新功能,旨在简化开发过程并显著提升性能。本文介绍了 React 19 的核心功能,如自动优化重新渲染的 React 编译器、加速初始加载的服务器组件、简化表单处理的 Actions、无缝集成的 Web 组件,以及文档元数据的直接管理。这些新功能通过自动化、优化和增强用户体验,帮助开发者构建更高效的 Web 应用程序。
133 1
引领前端未来:React 19的重大更新与实战指南🚀