什么是JSXjsx是javascriptML的缩写,react使用的一种文件,利用了JavaScript的表现力和类似HTML的模板语法,使得HTML文件非常容易理解。该文件可以使应用程序非常可靠并提高其性能。定义虚拟DOM时,定义虚拟DOM时不需要写引号。在jsx中写标签的类名时需要使用{}。当className替换类内联样式时,style={{key:value}}标签必须关闭。如果是小写字母,将jsx转为html中的同名元素。如果html中没有这个标签对应的同名元素就会报错。如果是大写字母,react会渲染对应的组件。如果没有定义组件,会报错。当根据数据遍历生成标签时,必须为标签设置单独的key。否则会报错。当你要配置webpack或babel预设时,什么原因会提示你离开create-react-app依赖。跨层组件如何通信?父组件与子组件的子组件通信,与更深层的子组件通信:使用props,使用中间组件逐层传递,但如果父组件结构较深,则每一个中间组件必须传递props,增加了复杂度,而且中间组件本身不需要这些props。使用context,context相当于一个大容器,可以将要交流的内容放在这个容器中,这样无论嵌套多深,都可以随意访问,也可以跨多个层的全局数据使用上下文实现。//context方法实现了跨层级的组件通信//context的目的是共享对组件树来说是“全局”的数据constBatteryContext=createContext();//子组件subcomponentclassGrandChildextendsComponent{render(){return({color=>Iamred:{color}})}}//子组件constChild=()=>{return()}//父组件类ParentextendsComponent{state={color:"red"}render(){const{color}=this.statereturn()}}什么是状态提升使用react经常会遇到几个组件需要共享状态数据的情况。在这种情况下,我们最好将这部分共享状态提升到离它们最近的父组件中进行管理。让我们看看它是如何工作的。importReactfrom'react'classChild_1extendsReact.Component{constructor(props){super(props)}render(){return({this.props.value+2}
复制代码div>)}}classChild_2扩展React.Component{constructor(props){super(props)}render(){return(
{this.props.value+1}
)}}classThreeextendsReact.Component{constructor(props){super(props)this.state={txt:"牛逼"}this.handleChange=this.handleChange.bind(this)}handleChange(e){this.setState({txt:e.target.value})}render(){return(
)}}exportdefault三时调用setState时会发生什么?**当调用setState时,React做的第一件事是将传递给setState的对象合并到组件的当前状态中,这会启动一个称为协调的过程。协调的最终目标是根据这个新状态以最有效的方式更新DOM。为此,React将构建一个新的React虚拟DOM树(将其视为页面DOM元素的对象表示)。一旦你有了这棵DOM树,React就会将这棵新树与之前的虚拟DOM树进行比较,以确定DOM如何响应新状态而发生变化。通过这样做,React可以准确地知道发生了什么变化,并且可以在知道发生了什么变化后在绝对必要时通过更新DOM来最小化操作DOM所占用的空间。React中的Portal是什么?门户提供了一种很好的方式来将子节点呈现给DOM节点而不是父组件。第一个参数(child)是任何可渲染的React子元素,例如元素、字符串或片段。第二个参数(容器)是一个DOM元素。ReactDOM.createPortal(child,container)参考前端高级面试题详解React组件中如何做事件代理?它的原理是什么?React基于VirtualDOM实现了一个SyntheticEvent层(合成事件层)。定义的事件处理器会接收一个合成事件对象的实例,该对象符合W3C标准,与浏览器原生事件具有相同的接口,支持冒泡机制,所有事件自动绑定到最外层。在React底层,对于合成事件主要做了两件事:事件委托:React会将所有的事件绑定到结构的最外层,使用一个统一的事件监听器,它维护一个映射来保存所有组件内部的事件监听和处理功能。自动绑定:在React组件中,每个方法的上下文都会指向组件的实例,即this自动绑定到当前组件。你理解这句话“在React中,一切都是组件”。组件是React应用程序UI的构建块。这些组件将整个UI划分为独立且可重用的小部分。每个组件相互独立,不会影响UI的其余部分。在使用jsx的组件中看不到react,为什么还要引入react?本质上,JSX是React.createElement(component,props,...children)方法的语法糖。在React17之前,如果你使用JSX,你实际上是在使用React,babel会将组件转换为CreateElement形式。React17之后就不需要导入了,因为babel可以自动帮我们导入react。如何比较diff算法?仅用于同级比较,跨级dom不会被复用。不同类型的节点生成的dom树是不一样的。此时会直接销毁旧节点和后代节点,新创建的节点可以使用key对元素进行diff的过程提供线索以供重用。Single-nodediff单点diff有以下几种情况:相同的key和type表示如果key不同则节点可以复用,直接标记为删除节点,然后新建的节点有相同的key和不同的类型,节点和兄弟节点被标记为删除。,然后新建一个节点ReactHooks正常开发中需要注意的问题和原因(1)不要在循环、条件或嵌套函数中调用Hooks,必须始终在React函数的顶层使用Hooks这是因为React需要利用调用顺序来正确更新相应的状态,并调用相应的钩子函数。Hook一旦在循环或条件分支语句中被调用,很容易造成调用顺序不一致,造成不可预知的后果。(2)使用useState时,使用push、pop、splice等方式直接改变数组对象的坑。使用push直接改变数组是获取不到新值的。应该使用析构方法,但是在类中不会出现这个问题。代码示例:functionIndicatorfilter(){let[num,setNums]=useState([0,1,2,3])consttest=()=>{//这里的陷阱是直接使用push更新num//setNums(num)不能更新num//必须使用num=[...num,1]num.push(1)//num=[...num,1]setNums(num)}return(
测试{num.map((item,index)=>(
{item} ))}