前端react面试基础知识(II)

这些问题涵盖了 React 的很多核心概念和实际应用场景。下面是针对每个问题的详细回答:

1. **React 项目中,如何动态改变组件的 class 来切换样式?**

   可以通过条件判断或者状态(state)来动态改变组件的 class。例如,使用 `className` 属性与 JavaScript 表达式结合:

   ```jsx
   function MyComponent({ isActive }) {
     return <div className={isActive ? 'active-class' : 'inactive-class'}>Hello</div>;
   }
   ```

2. **如果 React 的 Consumer 组件在上下文树中找不到 Provider,如何处理?**

   React 的 Context API 中,如果 Consumer 组件在上下文树中找不到匹配的 Provider,Consumer 会接收到 Context 的默认值(如果设置了的话)。如果没有设置默认值,则会接收到 `undefined`。

3. **React Router 中的 Link 标签和 HTML 的 a 标签有什么区别?**

   - `Link` 标签是 React Router 提供的组件,用于在单页应用(SPA)中导航,不会导致页面重新加载。
   - HTML 的 `a` 标签会导致浏览器进行完整的页面请求和重新加载。

4. **如何使用 React 的 useState?请举例说明**

   `useState` 是 React Hooks 之一,用于在函数组件中添加状态。

   ```jsx
   import React, { useState } from 'react';

   function Counter() {
     const [count, setCount] = useState(0);

     return (
       <div>
         <p>You clicked {count} times</p>
         <button onClick={() => setCount(count + 1)}>
           Click me
         </button>
       </div>
     );
   }
   ```

5. **React 框架的核心思想有哪些?**

   - 组件化:将 UI 拆分成可复用的组件。
   - 单向数据流:状态的变化单向流动,使得数据变化更加可预测。
   - 虚拟 DOM:提高渲染效率,通过比较和差异计算最小化的真实 DOM 更新。

6. **React Jsx 怎么进行内联条件渲染?请举例说明**

   可以使用 JavaScript 的三元运算符或逻辑运算符来进行内联条件渲染。

   ```jsx
   {condition ? <ComponentA /> : <ComponentB />}
   ```

7. **React 是否必须使用 JSX?为什么?**

   不是必须的。React 可以用纯 JavaScript 编写,但 JSX 使代码更直观、更接近 HTML,易于阅读和编写。

8. **React 中,父子组件如何进行通信?**

   - 父组件通过 props 向子组件传递数据。
   - 子组件通过回调函数(props 传递的函数)向父组件发送数据或事件。

9. **使用 ES6 或 ES5 语法来编写 React 代码有什么区别?**

   - ES6 提供了类(class)、箭头函数、解构赋值等特性,使代码更简洁、更易于维护。
   - ES5 则需要更多的样板代码,如使用 `React.createClass` 来创建组件。

10. **什么是 React 的 getDefaultProps? 它有什么作用?**

    `getDefaultProps` 是一个用于为组件提供默认 props 的方法(注意:在 ES6 类组件中不使用,而在通过 `React.createClass` 创建的组件中使用)。

    ```javascript
    MyComponent.getDefaultProps = function() {
      return {
        defaultProp: 'defaultValue'
      };
    };
    ```

11. **React 的 displayName 属性有什么作用?**

    `displayName` 属性用于调试目的,可以帮助开发者在开发工具中更容易地识别组件。

12. **React 中如何为非受控组件设置默认值?**

    非受控组件(如 `<input type="file">`)的值由 DOM 本身维护,可以使用 `defaultValue` 或 `defaultChecked` 属性来设置初始值。

13. **React 中有几种构建组件的方式?它们的区别是什么?**

    - 函数组件:简单的、无状态的组件,用于呈现 UI。
    - 类组件:可以使用状态和生命周期方法,提供更强大的功能。
    - 函数式组件(使用 Hooks):结合了函数组件的简洁性和类组件的状态管理功能。

14. **React 组件的构造函数有什么作用?**

    构造函数用于初始化 state 和绑定方法(在类组件中)。在函数组件中不需要构造函数。

15. **如果 React 的 render 函数中的 return 没有使用圆括号,会出现什么问题?**

    如果返回的是 JSX 表达式而不是单个元素或 null,并且不使用圆括号包围,会导致语法错误。

16. **在 React 自定义组件中,render 函数是可选的吗?为什么?**

    不是可选的。React 组件必须有某种形式的 `render` 方法(或在函数组件中直接返回 JSX)。

17. **为什么 React 不推荐直接修改 state?如果需要修改 state, 应该如何操作?**

    直接修改 state 会绕过 React 的更新机制,导致组件可能不会重新渲染。应该使用 `setState` 方法来更新 state。

18. **在 React 中,如何判断点击的元素属于哪个组件?**

    可以通过事件冒泡和事件处理函数中的 `event.target` 或 `event.currentTarget` 来判断。

19. **什么是 React 受控组件和非受控组件?它们有什么区别?**

    - 受控组件:其值由 React 的 state 控制,并通过 props 传递给 DOM 元素。
    - 非受控组件:其值由 DOM 本身维护,React 只能通过 DOM 访问其值。

20. **为什么在 React 中使用 className 而不是 class?**

    因为 `class` 是 JavaScript 的保留字,为了避免冲突和保持一致性,React 使用 `className` 属性。

21. **React.createClass和extends Component 有哪些区别?**

    - `React.createClass` 是 ES5 的写法,使用对象字面量来定义组件。
    - `extends Component` 是 ES6 的写法,使用类(class)语法来定义组件,支持更多的现代 JavaScript 特性。

22. **React中key的作用是什么?**

   React中,Key是一个重要的概念,特别是在处理列表时。Key是React中用于帮助识别哪些元素在变化、添加或删除的标识符。它是一个字符串或数字,通常被用作在数组中对元素进行唯一标识。在React进行元素的比较时,Key可以帮助识别哪些元素是新的、哪些是旧的,以及哪些需要更新。正确使用Key可以显著提升应用的性能和可维护性。

23. **如何在React中阻止事件的默认行为?**

   在React中阻止事件的默认行为,可以使用事件对象(e)的`preventDefault()`方法。例如,在一个链接(`<a>`标签)的点击事件中,如果想要阻止链接的默认跳转行为,可以这样做:

   ```jsx
   <a href="#" onClick={(e) => {
     e.preventDefault();
     console.log("阻止跳转");
   }}>点击</a>
   ```

24. **React生命周期有哪些阶段?每个阶段对应的函数是什么?**

   React生命周期主要包括三个阶段:创建阶段(Mounting)、更新阶段(Updating)和销毁阶段(Unmounting)。每个阶段对应的函数如下:

   * **创建阶段**:

     * `constructor()`:组件被实例化时触发,用于初始化state和绑定事件处理函数等。
     * `static getDerivedStateFromProps(nextProps, prevState)`:在调用`render`方法之前调用,用于根据新的props更新state。
     * `render()`:类组件中唯一必须实现的方法,返回组件的JSX结构。
     * `componentDidMount()`:组件挂载后立即调用,常用于发送网络请求、启用事件监听等。

   * **更新阶段**:

     * `static getDerivedStateFromProps()`:同上,也会在更新阶段调用。
     * `shouldComponentUpdate(nextProps, nextState)`:在组件更新之前调用,用于控制组件是否应该更新。
     * `render()`:同上。
     * `getSnapshotBeforeUpdate(prevProps, prevState)`:在最近一次渲染输出被提交之前调用,用于获取DOM改变前的信息。
     * `componentDidUpdate(prevProps, prevState, snapshot)`:更新后被立即调用,用于执行更新后的操作,如DOM操作、状态更新等。

   * **销毁阶段**:

     * `componentWillUnmount()`:组件卸载及销毁之前调用,常用于执行清理操作,如清除定时器、取消网络请求等。

25. **React的触摸事件有哪些?**

   React中的触摸事件主要包括:

   * `onTouchStart`:按下屏幕时触发。
   * `onTouchMove`:移动手指时触发。
   * `onTouchEnd`:手指离开屏幕触摸结束时触发。
   * `onScrollBeginDrag`:一个子view滑动开始拖动时触发。
   * `onScrollEndDrag`:一个子view滚动结束拖拽时触发。
   * `onMomentumScrollBegin`:当一帧滚动开始时调用。
   * `onMomentumScrollEnd`:当一帧滚动完毕时调用。

   这些事件在处理滚动和触摸交互时非常有用。

26. **在React Router中如何获取历史对象?**

   在React Router中,可以通过以下两种方式获取历史对象:

   * 如果React版本大于等于16.8,可以使用React Router中提供的Hooks,如`useHistory`:

     ```jsx
     import { useHistory } from "react-router-dom";
     let history = useHistory();
     ```

   * 在类组件中,可以通过`this.props.history`获取历史对象:

     ```jsx
     let history = this.props.history;
     ```

27. **为什么在React项目标签中使用htmlFor而不是for?**

   在React中,当需要为一个表单元素设置标签时,可以使用`htmlFor`属性而不是`for`属性。这是因为`for`是JavaScript的保留字,为了避免冲突和提高代码的可读性,React使用`htmlFor`来替代HTML中的`for`属性。`htmlFor`的作用是将标签与相应的表单元素关联起来,从而使浏览器知道该标签与哪个输入框匹配。

28. **React中如何获取组件对应的DOM元素?**

   在React中,可以通过使用refs来获取组件对应的DOM元素。Refs是一种方式,让我们能够直接访问DOM元素或类组件的实例。在类组件中,可以使用`React.createRef()`来创建一个ref,并将其赋给DOM元素。在函数组件中,可以使用`useRef`钩子来创建refs。此外,还可以使用回调refs,它是一个函数,该函数接收DOM元素作为参数,并可以在组件的生命周期中动态更新。

29. **如何将事件传递给React子组件?**

   在React中,可以通过将事件处理函数作为props传递给子组件来将事件传递给子组件。例如,在父组件中定义一个事件处理函数,并将其作为prop传递给子组件:

   ```jsx
   class ParentComponent extends React.Component {
     handleClick = () => {
       console.log("Parent component clicked!");
     };

     render() {
       return <ChildComponent onClick={this.handleClick} />;
     }
   }

   function ChildComponent({ onClick }) {
     return <button onClick={onClick}>Click me</button>;
   }
   ```

   在这个例子中,当用户点击子组件中的按钮时,会触发父组件中定义的事件处理函数。

30. **React的事件与普通HTML事件有什么区别?**

   React事件与普通HTML事件有以下区别:

   * **事件处理函数命名**:React事件的命名习惯采用驼峰式(camelCase),例如`onClick`而不是`onclick`。
   * **事件传播机制**:React使用合成事件(SyntheticEvent)系统来模拟原生DOM事件。这意味着React会在浏览器原生事件的基础上进行一些封装和优化,以提高性能和跨浏览器兼容性。
   * **事件对象**:React事件对象与原生DOM事件对象不同,它是React对原生事件对象的包装。但是,React事件对象包含了原生事件对象的所有属性和方法,因此你可以使用它们来访问事件的相关信息。

31. **React处理表单输入的方法有哪些?**

   React处理表单输入的方法主要包括受控组件(Controlled Components)和非受控组件(Uncontrolled Components)两种方式。

   * **受控组件**:在受控组件中,表单数据由React组件的状态(state)管理。这意味着每当表单的输入值发生变化时,都会更新组件的状态。这种方式使得表单数据在组件内部是可预测和可控的。
   * **非受控组件**:与非受控组件相比,受控组件更常见。但在非受控组件中,表单数据不由React组件的状态管理,而是直接由DOM元素管理。这种方式通常用于简单的表单或当你不希望将表单数据存储在组件状态时。然而,这种方式可能会导致表单数据在组件内部不可预测和难以管理。

32. **什么是React中的类组件和函数组件?它们有什么区别?**

   * **类组件**:类组件是使用ES6类语法定义的React组件。它们可以拥有自己的状态和生命周期方法,并且可以通过`this`关键字来访问组件的属性和方法。类组件通常用于需要复杂状态管理或生命周期方法的场景。
   * **函数组件**:函数组件是使用函数定义的React组件。它们是无状态的,并且不能拥有自己的生命周期方法。函数组件通常用于表示简单的UI元素或展示数据。然而,随着React Hooks的引入,函数组件现在也可以使用状态和其他React特性,这使得它们变得更加灵活和强大。

   主要区别在于:类组件具有更复杂的结构和更多的功能(如状态和生命周期方法),而函数组件则更加简单和轻量级。在现代React开发中,函数组件和Hooks的组合变得越来越流行,因为它们提供了更简洁和可维护的代码。

33. **React的代码编写规范有哪些?**

   React的代码编写规范通常包括以下几个方面:

   * **组件命名**:组件名称应该使用大写字母开头,并使用驼峰式命名法(PascalCase)。例如,`MyComponent`而不是`myComponent`。
   * **文件命名**:文件名应该与组件名称匹配,并使用小写字母和点分隔符(例如,`MyComponent.jsx`)。
   * **JSX语法**:在JSX中,应该使用双花括号`{}`来插入JavaScript表达式,并使用单引号`'`来定义字符串。
   * **状态管理**:应该尽量将状态提升到最近的公共祖先组件中,以减少组件之间的直接通信和依赖。
   * **事件处理**:事件处理函数应该作为组件的方法定义,并通过props传递给子组件(如果需要在子组件中触发父组件的事件处理函数)。
   * **样式和布局**:应该使用CSS-in-JS解决方案(如styled-components)或CSS模块来管理样式,以保持样式的局部性和可维护性。
   * **代码复用**:应该使用高阶组件(HOC)、自定义Hooks或渲染道具(Render Props)等模式来复用代码和逻辑。
   * **代码格式化**:应该使用Prettier或ESLint等工具来自动格式化代码和检查代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025浙江省考报名流程详细教程

2025年浙江省考报名马上就要开始了&#xff0c;有想要参加浙江省考的同学&#xff0c;可以提前看一下报名流程&#xff0c;和报名照要求。 报名时间&#xff1a;11月6日9时一11月11日17时 南核时间&#xff1a;11月6日9时一11月13日17时 缴费时间&#xff1a;11月14日9时一11月…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(一)

刚开始接触HarmonyOS的开发&#xff0c;希望不会太晚。在我学习的过程中&#xff0c;我会将我学到的内容&#xff0c;通过写博客的形式&#xff0c;来进行回忆和复习。同时也希望能够遇到志同道合的朋友&#xff0c;我们一起学习&#xff0c;一起进步&#xff0c;文章中有什么不…

shell脚本案例:创建用户和组

使用场景 在部署程序时&#xff0c;往往首要任务是创建用户和组。有的程序可能用到的组、用户比较多&#xff1b;且不知道服务器环境是否已经有了所需的组和用户。所以针对这个情况&#xff0c;根据Oracle RAC部署时的实际情况写了个脚本。 Linux版本 脚本代码 #!/bin/bash …

【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式 1.适配器模式&#xff08;Adapter&#xff09;2.装饰器模式&#xff08;Decorator&#xff09;2.1 主要特点2.2 组成部分2.3 示例代码2.3.1 Component 组件2.3.2 ConcreteComponent 具体组件2.3.3 Dec…

交换机的基本配置

交换机的基本配置 实验题目实验目的实验任务实验设备实验环境实验步骤VLAN 的简单配置跨交换机 vlan 的配置主机配置信息表解释&#xff1a; vlan 间路由 实验题目 交换机的基本配置。 实验目的 1) 理解交换机的原理和应用场景&#xff1b; 2) 交换机的基本指令系统&#xf…

QFrameWork学习指南

QFramework官网地址&#xff1a;Wiki - 木兰确实 1、界面设计 &#xff08;1&#xff09;CounterAppController的界面 BtnAdd和BtnSub为Button组件&#xff0c;CountText为Text组件&#xff0c;后续的脚本挂载Canvas上。 &#xff08;2&#xff09;OnGUI OnGUI是Unity中通过…

黄金价格下跌,原油价格激增,小麦价格面临阻力

黄金价格回落 现货黄金价格达到每金衡盎司 $2,790.00 的新纪录高点&#xff0c;接近心理关口 $2,800.00&#xff0c;随后在部分交易员在周五美国非农就业数据&#xff08;NFPs&#xff09;公布前以及下周美国选举前套现利润的回撤中下跌至 $2,732.00。 在 $2,732.00 以下是 10…

DiskGenius一键修复磁盘损坏

下午外接磁盘和U盘都出现扇区损坏&#xff0c;估计就是在开着电脑&#xff0c;可能是电脑运行的软件还在对磁盘进行读写&#xff0c;不小心按到笔记本关机键&#xff0c;重新开机读写磁盘分区变得异常卡顿&#xff0c;估摸就是这个原因导致扇区损坏。在进行读写时&#xff0c;整…

智慧国土空间规划方法探索与实践应用

在数字化时代背景下&#xff0c;国土空间规划正经历着一场深刻的变革。智慧国土空间规划作为一种新兴的规划理念和方法&#xff0c;其核心在于利用现代信息技术&#xff0c;提高规划的科学性、精准性和动态适应性。本文将探讨智慧国土空间规划的方法探索与实践应用。 1. 智慧国…

从零开发操作系统-为什么磁盘的扇区为 512 byte

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

一文了解Android SELinux

在Android系统中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个增强的安全机制&#xff0c;用于对系统进行强制访问控制&#xff08;Mandatory Access Control&#xff0c;MAC&#xff09;。它限制了应用程序和进程的访问权限&#xff0c;提供了更…

Redis-持久化(增量模式和全量模式)

文章目录 一、持久化和Redis持久化概念持久化介绍Redis持久化的介绍全量模式持久化技术——RDB增量模式持久化技术——AOF使用RDB还是AOF? 二、RDB配置以及数据恢复的简单实现RDB快照的工作方式如何关闭RDB持久化功能如何模拟Redis服务器数据丢失&#xff1f;然后再如何具体使…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库&#xff1b; 进入某个数据库&#xff1b; 展示表&#xff1a; 展示某个表 desc 查询整个表&#xff1a; 查询特定列&#xff1a; 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

MFC图形函数学习05——画椭圆函数

MFC中有一个专门绘制椭圆的函数&#xff0c;其参数与绘制矩形参数相同&#xff0c;实际上所绘制的椭圆就是矩形的内切圆椭圆。 一、绘制椭圆函数 原型&#xff1a;BOOL Ellipse (int x1,int y1,int x2,int y2); 参数&#xff1a;椭圆内切矩形的左上角&#xff08…

Spring3(代理模式 Spring1案例补充 Aop 面试题)

Spring3 代理模式概述介绍什么是代理模式&#xff1f;为什么要使用代理模式&#xff1f;有哪几种代理模式&#xff1f;静态代理基于接口实现的动态代理(JDK自带)基于子类的动态代理 Spring_AOP_01案例补充(添加事务管理)实现完整代码&#xff1a;常规实现&#xff1a;代理实现 …

开源模型应用落地-Qwen2.5-7B-Instruct与TGI实现推理加速

一、前言 目前&#xff0c;大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型&#xff0c;均在大规模多语言和多模态数据上进行预训练&#xff0c;并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中&#xff0c;将集成 Hugging Face的TGI框架实现模型推理…

Android 使用ninja加速编译的方法

ninja的简介 随着Android版本的更迭&#xff0c;makefile体系逐渐增多&#xff0c;导致make单编模块的时间越来越长&#xff0c;每次都需要半个小时甚至更长时间&#xff0c;其原因为每次make都会重新加载所有mk文件&#xff0c;再生成ninja编译&#xff0c;此完整过程十分耗时…

javaNIO核心知识.中

Channel&#xff08;通道&#xff09; Channel 是一个通道&#xff0c;它建立了与数据源&#xff08;如文件、网络套接字等&#xff09;之间的连接。我们可以利用它来读取和写入数据&#xff0c;就像打开了一条自来水管&#xff0c;让数据在 Channel 中自由流动。 BIO 中的流…

缓存、注解、分页

一.缓存 作用&#xff1a;应用查询上&#xff0c;内存中的块区域。 缓存查询结果&#xff0c;减少与数据库的交互&#xff0c;从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存&#xff0c;mybatis自动开启。 2. 作用范围&#xff1a;同一…