react基础语法学习

129 阅读4分钟

一、条件渲染,列表渲染

  1. 单一元素的条件渲染,语法{ bol && <jsx /> } , 相当于V-if
  2. 两个元素的条件渲染,语法 { bol ? <jsx1 /> : <jsx2 /> } , 相当于V-if/V-else
  3. 多个元素的条件渲染,建议封装自定义渲染函数,比如 function renderSomething (...arg) {return (<jsx/>)} , 相当于V-if/V-else/if/V-else
  4. 使用display:none来实现元素的显示与隐藏,语法<style={{display:(bol?'block':'none')}} jsx />

二、表单绑定,列表渲染

  1. 表单绑定:在React中表单取值是需要手动取值的。具体做法是,给表单的value/checked属性添加一个声明式绑定,再添加onChange事件处理器,并再事件处理器中手动取值来改变这个声明式变量。这种玩法再React中称之为“受控表单”
  2. 什么是受控表单?
  • 一个表单的value属性或者checked属性由state申明是变量所控制着,这种表单就是受控表单
  1. 什么是受控组件?
  • 一个组件的自定义属性的值由state声明式变量所控制着,有且仅有当state变量发生变化时,这个组件才能更新
  1. 列表渲染:再React中推荐使用map()来实现,为什么推荐使用map()呢?因为他接受一个数据源数据作为参数,返回一个新的数据,像这样 list.map(ele,idx)=>())

三、生命周期,响应式原理(Fiber架构)

  1. 只有类组件才有生命周期钩子函数,函数式组件没有生命周期钩子函数
  2. 生命周期(3-2-1)
  • 装载阶段(3) constructor() / render() / componentDidMount()
  • 更新阶段(2) render() / componentDidUpdate() / [shouldComponentUpdate()开头]
  • 卸载阶段(2) componentWillUnmount()
  1. 面试题:showldComponentUpdate()
  • 返回 true 时,正常执行更新阶段;返回 false 时,不执行更新阶段。
  • this.$forceUpdate()这个方法调用,会绕过showldComponentUpdate()
  • showldComponentUpdate(),一般用于性能调优,阻塞掉那些不参与视图渲染的变量更新导致的Fiber生成
  • showldComponentUpdate(),只有在类组件 Component 中才有,在PureComponent中没有。
  • 无论是 showldComponentUpdate(),还是 PureComponent ,都在解决相似的性能问题
  1. React 组件的渲染(更新)流程,由两个阶段构成,一个是render阶段,一个是commit阶段
  • render阶段,目标是生成Fiber树,这个过程是异步的,可中断的,并且不执行任何副作用,是否中断看浏览器主线程的脸色。
  • commit阶段,目标是把协调运算的结果,一次性提交渲染或更新成真实的DOM。这个过程在React(V17)中是不可中断的,在React(V18)中可以人为中断(由startTransition进行中断)
  1. 谈一谈React响应式原理(Fiber架构)
  • 什么是Fiber单元?每一个JSX元素节点都是一个Fiber单元(React.creatElemnt()的返回值)
  • 这些独立的Fiber单元,是怎么串联成Fiber树?给每个Fiber单元添加三个指针(child、sibling、parent)
  • 为什么React要把构建这个复杂的Fiber树?为了让协调运算、commit阶段可以循环执行,而不是递归
  • 怎么执行协调运算?每个Fiber单元上,还有一个 alternate 质真,指向旧 Fiber 中的自己。
  • 如果新Fiber树种存在,但旧Fiber树不存在,说明新增节点;如果新Fiber树种不存在,但旧Fiber树存在,说明这个节点是要删除的节点;如果在新旧Fiber树中都存在这个节点,进一步遍历新旧节点的属性,对比他们的变化情况。

四、状态提升(相当于Vue中的父子组件通信)

  1. 在React中一般不谈论自定义属性和自定义事件,所有用在组件上的属性都叫做props。props可以是基本数据类型、还可以是对象和数据,还可以是函数,Jsx元素

2。当props是事件函数时,props名字建议以 on开头。如果props不是事件函数,是渲染函数时,建议不要以 on开头,

  • 例如:<Model footer={()=>(<footer />)},onConfirm={()=>{}}>
  1. 什么是状态提升?当两个组件需要共享一个状态变量时,我们要找到他们最近的父组件,把这个需要共享的状态变量定义在这个父组件中它的语法基础就是props(父子组件通信)