setState方法的第二个参数有什么用?使用它的目的是什么?它是一个回调函数,在setState方法完成并重新呈现组件时调用。在工作中,更好的方法是使用React组件生命周期之一——“存在”生命周期方法,而不是依赖这个回调函数。导出类App扩展组件{constructor(props){super(props);this.state={username:"雨夜清河",};}render(){return
{this.state.username}
;}componentDidMount(){this.setstate({username:"友家前端网络",},()=>console.log("重新渲染成功。"));}}ReactsetState笔试题,下面WhatdoesthecodeoutputclassExampleextendsReact.Component{constructor(){super()this.state={val:0}}componentDidMount(){this.setState({val:this.state.val+1})console.log(this.state.val)//第一条日志this.setState({val:this.state.val+1})console.log(this.state.val)//第二条日志setTimeout(()=>{this.setState({val:this.state.val+1})console.log(this.state.val)//第三条日志this.setState({val:this.state.val+1})console.log(this.state.val)//第四条日志},0)}render(){returnnull}}//Answer:0,0,1,2react和vue的区别是一样的:数据驱动页面,提供响应式视图组件都有虚拟DOM,组件开发,父子组件之间通过props参数传递数据,都实现了webComponents标准数据流单向,都支持。服务器的渲染SSR有native方法,react有Reactnative,vue有wexx区别:数据绑定:Vue实现双向数据绑定,react数据流是单向数据渲染:大规模数据渲染,React更快使用适用场景:ReactwithRedux架构适合大型多人协作和复杂项目,Vue适合小快项目开发风格:React推荐jsx+inline风格,js中html和css都可以写。Vue采用webpack+Vue-loader单文件组件格式,在哪个生命周期对html、js、css中的同一个文件进行Ajax请求?为什么?Ajax请求应该写在组件创建期的第五阶段,即componentDidMount生命周期方法中,原因如下。在创建的其他阶段,组件尚未呈现。在存在期的五个阶段,不能保证生命周期方法一定会被执行(比如通过shouldComponentUpdate方法优化更新等)。销毁期间,组件即将销毁,请求数据变得无意义。所以在这些阶段发出Ajax请求显然不是最好的选择。在组件挂载之前,Ajax请求不会完成。如果这个时候再请求,就意味着在组件挂载之前更新状态(比如执行setState),这通常是行不通的。在componentDidMount方法中,执行Ajax可以保证组件已经挂载,组件可以正常更新。简单描述一下flux的思想Flux最大的特点就是数据的“单向流”。用户访问ViewView发出用户的ActionDispatcher接收Action,要求Store进行相应的更新。Store更新后,它会发送一个“change”事件。View收到“change”事件后,React更新页面中的StrictMode是什么??React的StrictMode是一个辅助组件,可以帮助我们写出更好的React组件。可以使用
包裹一组组件,可以帮助我们检查以下内容:验证内部组件是否遵循某些推荐的做法,如果不遵循,则会在控制台中给出警告。验证是否使用了已弃用的方法,如果是,将在控制台中给出警告。通过识别潜在风险来防止一些副作用。详见前端高级面试题答案。使用ReactHooks有什么好处?首先,Hooks通常可以提取和重用跨多个组件通用的有状态逻辑,而无需高阶组件或渲染道具的负担。钩子可以很容易地操纵功能组件的状态,而无需将它们转换为类组件。Hooks在类中不起作用,通过使用它们我们可以完全避免使用componentDidMount、componentDidUpdate、componentWillUnmount等生命周期方法。相反,使用像useEffect这样的内置钩子。使用ReactRouter时,如何获取当前页面的路由或浏览器地址栏中的地址?在当前组件的props中,包含了location属性对象,其中包含了当前页面的路由地址信息,存储了当前路由在match中的参数等数据信息。它们可以通过this.props直接使用。在React实现的移动应用中,如果出现卡顿,可以考虑哪些优化方案?添加shouldComponentUpdate钩子来比较新旧道具。如果值相同,则阻止更新以避免不必要的渲染,或者使用PureReactComponent代替Component,其内部已经封装了shouldComponentUpdate的浅层比较逻辑。对于列表或者其他结构相同的节点,为它们各自添加一个唯一的key属性,方便React的diff算法中节点的复用,减少节点的创建和删除。render函数减少onClick={()=>{doSomething()}}这样的写法,每次调用render函数都会创建一个新的函数,即使内容没有变化也会造成不必要的重新渲染节点的,建议将函数保存在组件的成员对象中,这样组件的props只会被创建一次。如果需要经过一系列的计算得到最终的结果,可以考虑使用reselect库来缓存结果。如果props值不变,则直接从缓存中取结果,避免高昂的计算成本。webpack-bundle-analyzer分析当前页面的依赖包,看有没有不合理的地方。如果是,找到优化点并优化。反应的优点是什么?方便提高应用性能在客户端和服务端使用jsx模板进行数据渲染。Reducer文件的可读性很好。返回结果需要注意哪些问题?在Reducer文件中,对于返回的结果,必须使用Object.assign()复制一个新的状态,否则页面不会随着数据刷新。返回Object.assign({},state,{type:action.type,shouldNotPaint:true,});createElement过程React.createElement():根据指定的第一个参数创建一个React元素React.createElement(type,[props],[...children])第一个参数必填,输入为类HTML标签name,eg:ul,li第二个参数可选,表示属性,eg:className第三个参数,可选,子节点,eg:要显示的文本内容//写一个:varchild1=React.createElement('li',null,'一个');varchild2=React.createElement('li',null,'two');varcontent=React.createElement('ul',{className:'teststyle'},child1,child2);//第三个参数可以单独写成数组ReactDOM.render(content,document.getElementById('example'));//写两个:varchild1=React.createElement('li',null,'one');varchild2=React.createElement('li',null,'two');varcontent=React.createElement('ul',{className:'teststyle'},[child1,child2]);ReactDOM.render(内容,document.getElementById('example'));受控组件它与不受控组件有何不同?在反应在t中,组件负责控制和管理自己的状态。如果在组件中加入HTML中的表单元素(input、select、textarea等),当用户与表单进行交互时,会涉及到表单数据存储的问题。根据表单数据的存储位置,组件分为常规组件和非常规组件。受控组件是受React控制的组件,也就是说,表单元素的数据存储在组件的内部状态中,表单呈现什么由组件决定。如下所示,用户名并未存储在DOM元素中,而是存储在组件的状态中。每次要更新用户名,都需要调用setState更新状态;每次要获取用户名的值,都需要获取组件状态值。classAppextendsComponent{//初始化状态constructor(props){super(props);this.state={username:"友家前端网络",};}//查看结果showResult(){//获取数据就是获取Status值console.log(this.state.username);}changeUsername(e){//Native方法获取varvalue=e.target.value;//更新前可以进行脏值检测//更新状态this.setState({username:value,});}//渲染组件render(){//返回虚拟DOMreturn(
);}}非受控组件是指表单元素的数据由元素自己存储和处理,而不是通过React组件。表单如何呈现由表单元素本身决定。如下所示,表单的值并没有存储在组件的状态中,而是存储在表单元素中。当要修改表单数据时,直接进入表单即可。有时也可以获取一个元素并手动修改它的值。获取表单数据时,先获取表单元素,再通过表单元素获取元素的值。注意:为了方便获取组件中的表单元素,通常会为元素设置ref属性,通过组件内部的refs属性获取对应的DOM元素。classAppextendsComponent{//查看结果showResult(){//获取值console.log(this.refs.username.value);//修改值,即修改元素本身的值this.refs.username.value="专业前端学习平台";//渲染组件//返回虚拟DOMreturn(
{/*在非绑定组件中,表单元素定义为defaultvalue*/}
查看结果
);}}虽然非约束组件通常更容易实现,可以直接通过refs获取DOM元素并获取其值,但React推荐使用约束组件。主要原因是动态组件支持即时字段验证,允许有条件地禁用/启用按钮,强制输入格式等。根据下面定义的代码,您能找出存在的两个问题吗?请看下面代码:【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-uQNeKIKh-1677540809335)(https://segmentfault.com/img/…"图片描述")]答:1.构造函数中没有给super传props,应该包括下面一行constructor(props){super(props);//...}2.事件监听(通过addEventListener()在分配时的范围不正确,因为ES6不提供自动绑定。因此,开发人员可以在构造函数中重新分配clickHandler以包含正确的绑定:constructor(props){super(props);this.clickHandler=this.浏览器,必须使用babel、webpack等工具转成传统的JS,很多开发者可以在没有意识到的情况下使用JSX,因为它已经与React集成。MyComponent类扩展了React。Component{render(){让props=this.道具;return(
{props.name} );}}什么是React的生命周期方法?componentWillMount:在渲染之前执行,用于根组件中App级的配置。componentDidMount:在第一次渲染后执行,在这里可以进行AJAX请求、DOM操作或状态更新,并设置事件监听器。componentWillReceiveProps:在render初始化的时候不会执行。当组件接收到新状态(Props)时,它将被触发。一般用于父组件状态更新时重新渲染子组件。shouldComponentUpdate:判断是否更新组件。默认情况下它返回true。如果你确定组件在state或props更新后不需要重新渲染,你可以返回false,这是一种提高性能的方法。componentWillUpdate:在shouldComponentUpdate返回true之前执行,保证组件更新。componentDidUpdate:主要用于更新DOM以响应props或状态变化。componentWillUnmount:它用于取消任何网络请求,或删除与该组件关联的所有事件侦听器。React组件生命周期的不同阶段是什么?组件生命周期中有四个不同的阶段:初始化:在此阶段,组件准备好设置其初始化状态和默认属性。挂载:react组件已准备好挂载到浏览器DOM中。此阶段包括componentWillMount和componentDidMount生命周期方法。更新:在这个阶段,组件以两种方式更新,发送新的道具和状态。此阶段包括shouldComponentUpdate、componentWillUpdate和componentDidUpdate生命周期方法。卸载:在这个阶段,不再需要该组件并将其从浏览器DOM中卸载。此阶段包含componentWillUnmount生命周期方法。除了上面常用的四种生命周期,还有一个错误处理阶段:发生时,该组件将被调用。此阶段包含componentDidCatch生命周期方法。【外链图片传输失败,源站可能有防盗链接机制,建议保存图片直接上传(img-OvxpYW5c-1677540809337)(https://segmentfault.com/img/..."clipboard.png")]React是如何实现组件/逻辑复用的?除了官方弃用的Mixin,目前主流的组件抽象技术有以下三种:高层组件:propertyproxy反向继承渲染属性react-hooksRedux如何获取中间件store和action?那怎么处理呢?Redux中间件本质上是一个函数柯里化。在reduxapplyMiddlewareApi源码中,每个中间件接受2个参数,Store的getState函数和dispatch函数,分别获取store和action,最后返回一个函数。该函数将传递给下一个中间件的next的dispatch方法,并返回一个接收action的新函数。这个函数可以直接调用next(action),也可以在其他需要的时候调用,甚至根本不调用。调用链中的最后一个中间件将接受真实商店的dispatch方法作为下一个参数,从而结束调用链。所以,中间件的函数签名是({getState,dispatch})=>next=>action。什么是反应上下文?Context提供了一种通过组件树传递数据的方法,从而避免了在每一层手动传递props属性的需要。