react 面试markdown 自用

news/2024/7/15 17:14:57 标签: react.js, 前端, javascript

React 面试

1. 什么是HOC高阶组件

比如 react-redux 中的 connect 组件,接受一个组件,返回一个新的组件,给新的组件添加新的组件
缺点 : 容易形成嵌套地狱
现在主要用hook 使用状态

2. 函数/类 组件中如何使用state

组件内部state,适合在本组件使用。有点灵活,缺点难以实现组件共享
函数组件 用useState useReducer
类组件 this.state 修改this.setState
组件外的state ,用状态管理库。redux dva umi

3. redux 原理

修改状态,使用subscribe订阅刷新页面,后有了hook,usedDispatch之类的hook
将订阅页面更新放到了页面里面
redux 中的subscribe返回值是取消订阅 (想想源码的return

4. 常见组件性能优化手段

4-1. 复用组件

复用的前提必须满足三个条件:同一层级下,同一类型,同一个key值,所以我们尽量保证这三者的稳定性

常见错误比如key=Match.random() 做key值 这样就会每次卸载旧的组件 生成新的组件
不规范写法 用key = index 但是组件如果发生拖拽啥的就寄了

4-2. 尽量减少组件的重新render

  1. 在类组件中 通过shouldcomponentupdate生命周期判断
    this.props.item !==nextPpropsitem 就return false 不更新

  2. 类组件中 使用purcomponent 内置了通过shouldcomponentupdate,通过判断props是否有变化

  3. 函数组件中 使用memo 其实HOC高阶组件,memo会检查属性是否发生变化,来选择是否重新渲染,源码会进行浅比较会直接进入bailout,也可以自定义函数,放进去一个callback函数

            const a = memo(function Home() {
                return(<>
                    home page
                </>)
            },(pre,current)=>{
                return pre.item !== current.item
            })
    
  4. useMemo 把返回值返回到filber节点上

    export default const a =({item}) =>{ //这里child组件并不依赖item的变化重新更新
        return useMemo (() => {
            <div>
                {item}
                <Child/>
            </div>
        })
    }
  1. useCallback 可以缓存函数
    使用useCallback(fn,deep) == useMemp (() => fn,deep)

  2. context value 只要发生变化 消费这个组件的后代consumer都要更新 所以要尽量的精简实用 比如项目里页面初次加载就把所有的dymanic数据和static数据全请求出来
    比如拆分不想管的context 比如俩个不想关联的context 拆开 这样就不用修改某个的时候 全部渲染了

5. hook解决了什么问题

  1. 组件之间状态难以复用,比如最早的redux ,如果想用store里面的值,只能每个组件页面进来订阅,页面销毁取消订阅。最好的方式就是些一个HOC高阶组件,让所有组件进来就订阅, 但是也会形成
    嵌套地狱,后面几个括号,不方便阅读
    有了hook之后就是一个自定义hook,函数组件之间的状态服用,直接useSelector
  2. 复杂组件难以理解
    一个生命周期里写了好几个组件的逻辑,臃肿,hook 可以写几个副作用,方便阅读,甚至可以写自定义hook
  3. 类组件的this

6. 什么是自定义hook

就是自己封装的hook 最经典的就是alibaba/ahooks 里面的一些定时器,forceupdate

7,为什么hook出现之后 就可以定义state了 或者说为什么之前函数组件不能有自己的状态

之前函数组件不能保存状态是因为当状态改变的时候 页面就要重新渲染 这样定义在函数里面的变量就会重新生成复制,肯定不行,如果定义在函数外面全局污染 直接傻杯
所以hook出现后 封装了useState 和 useReducer方法 把state状态保存到了filber上

柯利化

记住这个柯利化

javascript">function addware(...arg) {
    return (params) => (arg1) => {
        console.log('ageOutSide',arg)
        console.log('inside1', arg1)
        console.log('inside2', params)

    }
}
const useEnhancer = (enhancer) => {
    return  enhancer('params1')('params2')
}
addware('addwareparams')

useEnhancer(addware('addwareparams'))

http://www.niftyadmin.cn/n/332177.html

相关文章

厦大凭什么和清北复一起入选首批国家集成电路产教融合创新平台?对台区位优势吗

最近&#xff0c;有网友提出这样一个问题&#xff0c;众所周知&#xff0c;中国集成电路研究主要集中在北京和上海&#xff0c;清北可以和北京合作&#xff0c;复旦可以和上海合作&#xff0c;那么厦大和谁合作&#xff0c;厦大又凭什么和清北复一起入选了首批国家集成电路产教…

密码学基本原理和发展——古典密码学

密码技术最早起源于公元前404年的希腊&#xff0c;此后密码大致经历了古典密码、近代密码和现代密码三个阶段。 1.古典密码 古典密码&#xff08;公元前五世纪&#xff5e;19世纪末&#xff09;代表性的是滚桶密码、棋盘密码和凯撒密码。 1.1滚筒密码 滚筒密码原理为信息发送…

DataStore入门及在项目中的使用

首先给个官网的的地址&#xff1a;应用架构&#xff1a;数据层 - DataStore - Android 开发者 | Android Developers 小伙伴们可以直接看官网的资料&#xff0c;本篇文章是对官网的部分细节进行补充 一、为什么要使用DataStore 代替SharedPreferences SharedPreferences&a…

相位?相位差?全局相位和局部相位的数学逻辑是什么?

在量子力学中&#xff0c;全局相位和局部相位都是关于特定量子态的特性。对于单量子比特的量子态&#xff0c;我们通常表示为 ∣ ψ ⟩ α ∣ 0 ⟩ β ∣ 1 ⟩ |\psi\rangle \alpha|0\rangle \beta|1\rangle ∣ψ⟩α∣0⟩β∣1⟩&#xff0c;其中 α \alpha α 和 β \…

DHCP

定义 DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。 DHCP客户端 通常为网络中的PC、打印机等终端设备,使用从…

springBoot中使用redis实现分布式锁实例demo

首先 RedisLockUtils工具类 package com.example.demo.utils;import org.junit.platform.commons.util.StringUtils; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.red…

疏通B2B物流支付“堵点”,iPayLinks持续完善全球数字贸易服务生态

iPayLinks针对国际物流出海企业制定一站式收付款解决方案&#xff0c;让国际物流收款不再难。 商务部5月9日发布数据显示&#xff0c;一季度&#xff0c;我国服务进出口总额15840.1亿元&#xff0c;同比增长8.7%。商务部服贸司负责人称&#xff0c;服务贸易继续保持增长态势。 …

线程池下载4K壁纸

学习记录 学习记录 一、目标 aHR0cHM6Ly9waWMubmV0Ymlhbi5jb20vDQo 拿到每张图片的href 和 标题&#xff0c;跳转到详情页进行图片下载地址的提取并请求实现图片本地下载 二、代码实现 """ CSDN: 抄代码抄错的小牛马 mailbox&#xff1a;yxhlhm2002163.com…