前端面试-React专题

news2024/11/28 8:48:34

目录

    • 一.React
      • 1. React 的主要特性是什么
      • 2.React 的核心思想是
      • 3. 什么是jsx
      • 4. render()函数
      • 5. 函数组件和类组件的区别
      • 6. HTML和React中事件处理的区别
      • 7. React 中的合成事件
      • 8. 虚拟Dom?为什么使用?如何实现?
      • 9. 在 constructor 中给 super 函数传递 props 的目的是什么?
      • 10.state和props之间的区别
      • 11. 什么是React生命周期
      • 12. React中如何使用Hooks
      • 13. React的单向数据绑定
      • 14.什么是flux
      • 15.React中如何控制组件的样式
      • 16.React中如何进行服务器渲染
      • 17.如何进行React性能优化
      • 18.React解决了什么问题
      • 19.React的协议
      • 20.shouldComponentUpdate生命周期
      • 22.怎么阻止组件的渲染
    • 二、react-router相关
      • 1.路由跳转
      • 2.路由模式
      • 3. Link、NavLink和Navigate
      • 4.router中的路由钩子函数
      • 5.路由懒加载
    • 三.Redux相关
      • 1.使用
      • 2.state管理
      • 3.单向数据流

一.React

1. React 的主要特性是什么

  • 虚拟 DOM(VirtualDOM) 替代了真实 DOM(RealDOM)
  • 支持服务端渲染
  • 遵循单向数据流或数据绑定
  • 使用可复用 / 可组合的 UI 组件来进行视图开发

2.React 的核心思想是

封装组件,各个组件维护自己的状态和UI,当状态变更,自动重新渲染整个组件

3. 什么是jsx

(JavaScript XML)实际上,它只是为 React.createElement() 函数提供语法糖,为我们提供了在 JavaScript 中使用类 HTML 模板语法的能力。

原理:jsx语法最终会被babel编译成为React.createElement()方法,createElement方法会生成虚拟的DOM节点对象,再由ReactDOM.render()函数生成真实DOM,插入到对应节点中去

//jsx
<div className="wang.haoyu">hello</div>

经过bale编译之后的:

React.createElement("div", {
    className:'wang.haoyu'
}, "hello");

render()生成真实Dom

ReactDOM.render(<App />, document.getElementById('root'));

4. render()函数

  1. 一个虚拟节点就是一个对象:
    下面输出的对象就是createElement()方法的返回值
    在这里插入图片描述
  2. 转化为真实Dom:
    // 真正渲染方法
    function render(vDom, el) {
      const newDom = createDom(vDom);
      el.appendChild(newDom);
    }
    
    // 先不考虑自定义组件
    function createDom(vDom) {
      const { type, props } = vDom;
      let dom;
      // 文本节点
      if (type === REACT_TEXT) {
        dom = document.createTextNode(props.content);
      } else {
        dom = document.createElement(type);
      }
      // 更新属性
      if (props) {
        // 更新跟节点Dom属性
        ....
      }
      // 记录挂载节点
      vDom.__dom = dom;
      return dom;
    }
    

5. 函数组件和类组件的区别

  1. 语法上: 类组件需要去继承 React.Component需要更多的代码;
  2. 状态管理: 函数组件是一个纯函数,无状态组件;类组件可以直接使用setSate()
  3. 生命周期钩子: 函数组件中不能使用生命周期钩子,所有的生命周期钩子都来自于继承的 React.Component 中;
  4. 调用方式: 函数组件可以直接调用;如果是一个类组件,需要先用 new操作符将其实例化,然后调用 render 方法
// 函数组件
function SayHi() { 
    return <p>Hello, React</p> 
} 
// React 内部 
const result = SayHi(props) // » <p>Hello, React</p>

// 类组件 
class SayHi extends React.Component { 
    render() { 
        return <p>Hello, React</p> 
    } 
} 
// React 内部 
const instance = new SayHi(props) // » SayHi {} 
const result = instance.render() 

6. HTML和React中事件处理的区别

HTMLREACT
写法全小写onclick小驼峰onClick
阻止默认行为可以直接 return false必须用 event.preventDefault();
方法调用οnclick=“activateLasers()”onClick={activateLasers}
传参activateLasers(abc)onClick={(e)=>this.handleClick(e, ‘aa’)} / onClick={this.handleClick.bind(this, ‘aa’)}

7. React 中的合成事件

SyntheticEvent是基于浏览器本地事件的跨浏览器包装。它的 API 与浏览器的本地事件相同,包括 stopPropagation() preventDefault(),但事件在所有浏览器中的表现均一致

8. 虚拟Dom?为什么使用?如何实现?

虚拟dom: 数据发生更改时,会计算旧的 DOM 与新的 DOM 之间的差异,更新真正改变的那部分到真实的 DOM。

作用: 虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom 操作,从而提高性能。

实现步骤:

1. 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中;
2. 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异;
3. 把新旧Dom树之间差异,应用到真正的 DOM 树上,视图就更新了。

9. 在 constructor 中给 super 函数传递 props 的目的是什么?

在constructor 方法中,您可以对组件进行初始化,为属性设置默认值,并绑定事件处理程序
调用 super() 时传递 props 主要是为了拿到 this 的引用,在子类的构造器中访问 this.props

class MyComponent extends React.Component {
  constructor(props) {
  	//1.
    super(props);
    console.log(this.props); // 打印 { name: 'John', age: 42 }
    
    // 2.但是 props 参数依然可以访问
    super();
    console.log(this.props); // 打印 undefined
    console.log(props); // 打印 { name: 'John', age: 42 }
  }
  //3.在 constructor 之外没有影响
  render() {
    console.log(this.props); // 打印 { name: 'John', age: 42 }
  }
}

10.state和props之间的区别

  • state是一种数据结构,用于组件挂载时所需数据的默认值。state是可变的,可以被修改,多数时候作为用户时间行为的结果。
  • props是组件的配置,由父组件传递给子组件,props是不可变的,不能被修改

11. 什么是React生命周期

在这里插入图片描述

钩子函数触发时机作用
constructor ()创建组件时1,初始化state; 2.为事件处理程序绑定this
render ()每次组件渲染都会触发渲染UI( 注意不能调用setState() )
componentDidMount ()组件挂载(完成DOM渲染)后1.发送网络请求; 2.DOM操作
render()每次组件渲染都会触发渲染UI
componetDidUpdate()组件更新(完成Dom渲染)后1.发送网络请求;2.Dom操作
componentWillUnMount()组件卸载之前完成组件的卸载和数据的销毁

其他钩子:
shouldCompontentUpdate(nextProps, nextState) 是否要更新组件时触发的函数。
父组件的重新渲染会导致组件重新渲染,可以通过此钩子函数限制子组件是否需要更新,return false可以阻止组件更新

12. React中如何使用Hooks

  1. useState 状态管理
  2. useEffect 生命周期管理(函数组件Didmount、DidUpdate、WillUnmount时会触发;也可以监听某个state)
  3. useContext共享状态数据
  4. useMemo缓存值
  5. useRef 获取Dom 操作
  6. seCallback 缓存函数
  7. useReducer redux 相似
  8. useImperativeHandle 子组件暴露值/方法
  9. useLayoutEffect 完成副作用操作,会阻塞浏览器绘制
// 1.状态钩子 useState
const [data, setData] = useState('微信公众号: 前端自学社区')

// 2.生命周期钩子 useEffect
useEffect(() => {
	//默认会执行  
    // 这块相当于 class 组件 生命周期的 compoentDidmount compoentDidUpdate
    console.log(`num: ${num}`)
    console.log(`count: ${count}`)
    // 组件在卸载时,将会执行 return 中内容
    return () => {
        // 相当于 class 组件生命周期的 componentWillUnMount 
        console.log('测试')
    }
}, [num])

// 3.传值钩子-数据共享 useContext
// Context.js
import React from 'react';
export const MyContext = React.createContext();
// index.js
const Son = () => {
    const res = useContext(MyContext)
    return (<h1>{res.code}</h1>)
}
export default () => {
    return (
        <MyContext.Provider value={{code:200,title:'添加数据成功'}}>
           <Son/>
        </MyContext.Provider>
    )
}

// 4.useMemo

13. React的单向数据绑定

14.什么是flux

flux最大的特点就是单向数据流

1. 用户访问view
2. view发出用户的action
3. dispatcher收到action,更新store
4. store更新后,触发change事件
5. view收到change事件后,更新页面

15.React中如何控制组件的样式

16.React中如何进行服务器渲染

17.如何进行React性能优化

  1. 重写 shouldComponentUpdate来避免不必要的 dom 操作。
  2. 使用 production 版本的 React.js。
  3. 使用 key 来帮助 React 识别列表中所有子组件的最小变化

18.React解决了什么问题

组件复用问题、性能问题、兼容性问题

19.React的协议

React遵循的协议是“BSD许可证 + 专利开源协议”,是否可以自由的使用React,取决于你的产品与FaceBook是否有竞争关系

20.shouldComponentUpdate生命周期

在比较新旧虚拟Dom时,如果我们不希望某个组件刷新,或者刷后和之前的一样,可以用这个函数直接告诉React,省去Diff操作,进一步提高效率 。

22.怎么阻止组件的渲染

在组件的render方法中返回null。(不会影响触发生命周期方法)

二、react-router相关

npm install react-router-dom 安装后,直接引入,并用路由组件包裹根组件

// index.js
import ReactDOM from 'react-dom/client'
// 1. 从 react-router-dom 中引入 HashRouter
import {HashRouter} from 'react-router-dom'
import App from './App'
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  // 2. 包裹根组件,给整个应用开启路由功能,就能监听路径的改变,并且将相应的路径传递给子组件
  <HashRouter>
    <App />
  </HashRouter>
)

1.路由跳转

//js传参
this.props.history.push('/discover/playlist');
this.props.match.params.xxx(此处为id)
this.props.location.query

//umi
import { history } from 'umi';
history.push('/' + e.key);

//标签
<Routes><Route path='/about' element={<About/>} /></Routes>
<Link to='/about'>关于</Link>
<NavLink to='/about' className='about-link'>关于</NavLink>
<Navigate to='/home' /> //重定向

2.路由模式

  • history模式:<BrowserRouter>
  • hash模式:<HasRouter>

PS:两种模式的区别

  • hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件。
  • history利用了 H5 中新增的 pushState()replaceState() 方法。
  • 除了外观上;hash模式#后面的变化并不会导致浏览器向服务器发出请求,不会刷新请求、重新加载页面; history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致
  • hash兼容性会比history 模式好,因为history 模式是依赖HTML5 Web History API,特定浏览器才会支持;
  • hash模式不利SEO,爬虫不会读取到#后的内容,因为会把 # 当作是锚点,这也导致会与网站里的锚点功能产生冲突
  • hash模式,页面刷新后会导致路由state参数丢失
    在这里插入图片描述

3. Link、NavLink和Navigate

  • <NavLink><Link> 的用法相似,都用于设置路径的跳转,最终会被渲染成 <a> 元素.
  • <NavLink> 是在 <Link> 的基础上增加了一些样式属性,被选中时会自动添加上 class='active'
  • <Navigate> 用于路由的重定向。只要这个组件一显示,就会自动跳转到 to 属性指定的路径中。

4.router中的路由钩子函数

useNavigate():用于在函数组件中进行手动跳转
useParams():用于在函数组件中获取动态路由的参数
useSearchParams():用于在函数组件中获取路径中的search(?号后面的)参数
useLocation():用于在函数组件中获取 location。
useRoutes():用于在函数组件中通过配置的方式使用路由 {useRoutes(routers)}

5.路由懒加载

路由懒加载不是 React Router 提供的功能,而是借助 React 提供的 React.lazy() 来实现。 React.lazy() 需要传入一个函数作为参数,在函数内部可以使用 import() 来异步加载文件。

const About = React.lazy(() => import('./components/About'))

function App() {
  return (
    <div>
      <div>
        <Link to='/home'>首页</Link>
        <Link to='/about?userId=123'>关于</Link>
      </div>
      <Routes>
        <Route path='/home' element={<Home />} />
        <Route path='/about' element={<About />} />
      </Routes>
    </div>
  )
}

export default App

React Router 基础、组件、钩子函数

三.Redux相关

1.使用

访问:useSelector钩子函数
调用:在Redux Toolkitreducers中写计算逻辑,在组件中用useDispatch()钩子函数调用

// 访问
const count = useSelector(state => state.counter.value)

// 调用
// 1.在Redux Toolkit中配置
export const counterSlice = createSlice({
  name: 'counter',
  initialState: {value: 0},
  reducers: {
    increment: (state, action) => {
      state.value += 1
    },
  }
})
//2.全局注册 store
import {configureStore} from '@reduxjs/toolkit'
import counterReducer from '../features/counter/counterSlice'
export default configureStore({
  reducer: {
    counter: counterReducer
  }
})
// 3.引入 调用dispatch方法,并传入一个action对象
import {increment} from './counterSlice'
onClick={
	() => dispatch(increment({ name: '参数' }))
}

2.state管理

  • view:基于当前状态的视图声明性描述
  • state:驱动应用的真实数据源头
  • actions:根据用户输入在应用程序中发生的事件,并触发状态更新
  • reducer: reducer 是一个函数,可以将 reducer 视为一个事件监听器,它根据接收到的 action(事件)类型处理事件。

3.单向数据流

  1. State 描述了应用程序在特定时间点的状况
  2. 基于 state 来渲染视图
  3. 当发生某些事情时(例如用户单击按钮),state 会根据发生的事情进行更新
  4. 基于新的 state 重新渲染视图

Redux 中文官网

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel - 如何给单元格加上下拉框

当你使用下拉列表来限制人们在单元格中的输入时&#xff0c;数据输入会更快、更准确。当有人选择一个单元格时&#xff0c;下拉列表的向下箭头就会出现&#xff0c;可以点击它并进行选择。 创建一个下拉列表 / Create a drop-down list 你可以通过提供下拉列表使工作表更有效率…

基于微信小程序的教学质量评价系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ubuntu下编译esp32 micropython固件编译(可自行增加模块)

目录 0. 前言1. 安装ESP-IDF2. 初始化Micropython仓库3. 选择ESP-IDF相应版本情况&#xff11;情况2 4. 开始编译5.烧录固件 0. 前言 为ESP32编译Micropython固件 操作系统&#xff1a;ubuntu22.04 1. 安装ESP-IDF 本节需要ESP-IDF环境&#xff0c;安装开发环境是必要的。 …

FPGA之手把手教你做多路信号发生器(STM32与FPGA数据互传控制波形生成)

文章目录 博主的念叨一、任务介绍1、本文目标2、设计思路3、设计注意事项 二、设计代码1.顶层文件代码2.波形生成模块3.ROM例化4.PLL例化5.引脚分配 总结 博主的念叨 博主建了一个技术资源分享的群&#xff0c;开源免费&#xff0c;欢迎进来唠嗑280730348 最近趁热打铁做了一…

pandas库的常用操作介绍

目录 1.1.Pandas概述2.Pandas索引结构3.groupby学习5.Pandas数值运算二元统计6.对象操作7.merge合并显示设置9.pivot操作10. 时间操作11.常用操作12.groupby操作13.字符串操作14.索引操作15.pandas绘图操作 1.1.Pandas概述 Python的pandas库是一个数据处理和数据分析库&#x…

javascript基础七:说说你对Javascript中作用域的理解?

一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个粟子 function myFunction(){let name小爱同学 } undef…

6.2:荷兰国旗问题

文章目录 实现key前面的数都小于等key&#xff0c;key后面的数都大于等于key1&#xff1a;前后指针法&#xff1a;2&#xff1a;挖坑法3&#xff1a;单指针法&#xff08;左神&#xff09; 辗转相除法求最大公约数 实现key前面的数都小于等key&#xff0c;key后面的数都大于等于…

【leetCode:剑指 Offer】20. 表示数值的字符串

1.题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格 一个 小数 或者 整数 &#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 …

深入篇【C++】类与对象:详解内部类+匿名对象+编译器对拷贝的优化

这里写目录标题 Ⅰ.内部类【特点】1.天生友元2.直接访问static成员3.访问限制符限制4.外部类的大小 Ⅱ.匿名对象【特点】1.一行生命域2.对象具有常性3.可强行续命 Ⅲ.拷贝对象时编译器的优化 Ⅰ.内部类 概念&#xff1a;一个类定义在另一个类内部&#xff0c;这个内部的类就叫做…

【Unity100个实用小技巧】如何修改UI上材质的Shader

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…

mysql基本操作1

库的基本操作 1.show variables like character_set_database 查看系统默认的字符集&#xff0c;若是指定数据库下使用该SQL&#xff0c;则查看的是该数据库对应的字符集。 2.show variables like collation_database 查看系统默认的字符集校验规则&#xff0c;指定数据库下使用…

Java 集合 - List 接口

文章目录 1.List 接口介绍2.List 接口常用 API3.ListIterator 迭代器4.ArrayList - 动态数组4.1 ArrayList 概述4.2 手撸动态数组 5.Vector - 动态数组6.LinkedList - 双向链表6.1 链表概述6.2 手撸双链表6.3 链表与动态数组的区别 7.Stack - 栈8.总结 1.List 接口介绍 在 Jav…

Linux:查看主机运行状态的一系列命令:top、df、iostat、sar

Linux&#xff1a;查看主机运行状态的一系列命令&#xff1a;top、df、iostat、sar 命令top监控系统资源&#xff1a; 使用top(回车)命令后&#xff0c;整个控制台会变成任务管理器的形式&#xff1a; 退出可以使用&#xff1a;ctrlc 或 q 第一行补充&#xff1a;表示正在执行的…

高程复习 欧几里得算法和扩展欧几里得算法考试前冲刺简约版

gcd(m,n)gcd(n,m%n) gcd欧几里得算法标准代码求最大公约数 #include <iostream>using namespace std;typedef long long LL; LL gcd(int a,int b) {if(b0)return a;return gcd(b,a%b); } int main() {LL a,b;cin>>a>>b;cout<<gcd(a,b)<<endl;re…

Linux基础:文件权限详细说明(全)

一、前提 我们要知道&#xff0c;Linux系统&#xff0c;一切皆文件的含义。 对于Linux来说&#xff0c;一切皆文件。 我们常涉及到的概念是目录和文件。 权限主要有三种&#xff1a;r(读)w(写)x(执行)。 二、正文 1、修改文件或者目录所属用户和所属组 chown [用户名[:组名…

规则网络构建

规则网络构建 文章目录 规则网络构建[toc]1 规则网络定义2 规则网络的构建3 代码实现 1 规则网络定义 常见规则网络包包括全局耦合网络、最近邻耦合网络和星型耦合网络&#xff0c;三种规则网络定义如下&#xff1a; (1)全局耦合网络&#xff1a;任意两个节点均存在连边的网络…

云原生 HTAP -- PolarDB-IMCI:A Cloud-Native HATP Database

文章目录 0 背景1 IMCI 架构1.1 架构演进的背景1.2 基本架构1.2 基本使用1.4 列索引存储 设计1.5 RW-RO 的数据同步实现1.5.1 CALS1.5.2 2P-COFFER 1.6 计算引擎实现1.7 性能 近期除了本职工作之外想要再跟进一下业界做讨论以及落地的事情&#xff0c;扩宽一下视野&#xff0c;…

算法7.从暴力递归到动态规划0

算法|7.从暴力递归到动态规划0 1.汉诺塔 题意&#xff1a;打印n层汉诺塔从最左边移动到最右边的全部过程 解题思路&#xff1a; 把字母抛掉&#xff0c;变成左中右三个盘子多个盘子能一下到吗&#xff1f;不能&#xff0c;把上边的拿走&#xff0c;最下边的才能放到指位置(…

java汉字转拼音pinyin4j-2.5.0.jar用法

要先下载哦&#xff0c; pinyin4j下载链接 可能会出现Cannot resolve symbol ‘net’&#xff0c;找到上面文件的下载路径&#xff0c;IDEA中File->Project Structure -> Modules->Dependencies import java.util.*; import net.sourceforge.pinyin4j.PinyinHelper;…

算法基础学习笔记——⑬质数\约数

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨质数 &#x1f353;&#xff08;1&#xff09;质数的判定——试除法 &#x1f353;&#xff08;2&#xff09;分解质因数——试除法 ✨约数 &#x1f353;&#xff08;1&#xff09;试除法求一个数的所…