react 实习小记

1.setState
当调用setState的时候,react做的第一件事就是将传递给setState的对象合并到当前组件的当前状态,根据这个状态更新DOM。而且React将构建一个新的React虚拟DOM树,并且跟旧的DOM树进行比较,React比较过后知道发生的具体变化,就可以使用最小的操作代价更新DOM。

2.元素element和组件component有什么区别?
首先了解一下什么是dom,dom,即document object model(文本对象模型)。整个页面元素统称dom。
dom树。
在这里插入图片描述
那么element就是在屏幕上看到的元素,比如一个按钮,一个表格等。
component是一个函数或者一个类,可以接收输入并且返回一个元素。

3.什么时候使用类组件,什么时候使用功能组件?
如果组件具有状态或者生命周期方法,就使用类组件,否则就使用功能组件,一般情况下,使用的都是类组件。

4.关于react中的refs
refs可是使我们直接访问DOM元素或者组件实例,为了使用它们,可以向组件添ref属性。
如果ref的值是一个回调函数,就接收底层的dom元素或者已挂载实例作为其第一个参数,可以在组件中存储它。
如果ref的值是一个字符串,react会在组件实例化对象的refs属性中,存储一个同名属性,该属性是对这个dom元素的引用。

5.react中的key
key可以帮助react跟踪循环创建列表中的虚拟dom元素,了解哪些元素已更改,添加或删除。每个绑定key的虚拟dom元素,在兄弟元素之间都是独一无二的。

6.一个组件接受一个函数作为它的子组件。Icketang组件的子组件是一个函数,而不是一个常用的组件。这意味着在实现 Icketang组件时,需要将props. children作为一个函数来处理。

< Icketang username="雨夜清荷">
{user = > user ?<Info user={user} /><Loading />}
</Icketang>
import React, { Component } fromr "react"export class Icketang extends Component {
//请实现你的代码
}
render ( ) {
return this.props.children ( this .state.user )
}

7.约束性组件与非约束性组件有什么区别

在react中,组件负责控制和管理自己的状态。
如果将html中的表单元素添加到组件中,当用户与表单发生交互时候,就涉及到表单数据存储问题。根据表单数据的存储位置,将组件分成约束性和非约束性。
约束性组件,表单元素的数据存储在组件内部的状态中,表单呈现什么由组件决定。
非约束性组件,表单元素的数据交由元素自身存储并处理,而不是通过react组件。比如input,通过refs获取。

8.在哪个生命周期中会发出ajax请求,为什么?
Ajax请求应该写在组件创建期的第五个阶段,即 componentDidMount生命周期方法中。挂载时候,渲染完成。而且这个生命周期一定会执行,总不能在销毁时候请求数据毫无意义。

9.shouldComponentUpdate有什么用?
组件状态或者属性数据发生更新的时候,组件会进入存在期(更新),视图会重新渲染。而shouldComponentUpdate可以让我们退出某些组件的更新,因为每次都需要根据新的状态,对比dom树,看哪里需要更新,如果我们知道有些用户界面不会改变,那么就不用去对比弄清楚它是否应该重新渲染,我们可以通过shouldComponentUpdate方法返回去false,让组件保持当前状态不变。

10.如何用react构建生产模式?

通常,使用 Webpack的 DefinePlugin方法将 NODE ENV设置为 production。这将剥离 propType验证和额外的警告。除此之外,还可以减少代码,因为 React使用 Uglify的dead-code来消除开发代码和注释,这将大大减少包占用的空间。

<Parent>
<h1>有课前端网</h1>
<h2>前端技术学习平台</h2>
</Parent>
不建议使用如下方式,在这个案例中会抛出错误。
class Parent extends Component {
 render ( ) {
 return (
<div> { this .props.children.map (obj = > obj ) }</div>
)
} 
}

this.props.children是一个对象,所以不能用map上述方法是错的。下面的方法是正确的。

class Parent extends Component  {
render ( ) {
  return (
<div> { React.Children.map ( this .props.children, obj => obj) }</div>
)
}
}

12.setState方法的第二个参数有什么用?使用它的目的是什么?

它是一个回调函数,当 setState方法执行结束并重新渲染该组件时调用它。在工作中,更好的方式是使用 React组件生命周期之——“存在期”(更新的时候)的生命周期方法,而不是依赖这个回调函数。

export class App extends Component {
constructor (props) {
 super ( props )
this.state = {
username:"雨夜清荷"
}
}
render ( ) {
return (
<div> { this .state. username) </div>
);
}
componentDidMount ( ) {
this .setstate ( { 
 username :'有课前端网'
}( ) => console. log ( 're-rendered success. ' ) )

13.请说岀 React从 EMAScript5编程规范到 EMAScript6编程规范过程中的几点改变
(1)创建组件的方法不同。

EMAScript5版本中,定义组件用 React.createClass。EMAScript6版本中,定义组件要定义组件类,并继承 Component类。

(2)定义默认属性的方法不同。

EMAScript5版本中,用 getDefaultProps定义默认属性。EMAScript6版本中,为组件定义 defaultProps静态属性,来定义默认属性。

(3)定义初始化状态的方法不同。EMAScript5版本中,用 getInitialState定义初始化状态。EMAScript6版本中,在构造函数中,通过this. state定义初始化状态。

注意:构造函数的第一个参数是属性数据,一定要用 supe继承。

14.react中D算法的原理是什么?
1)节点之间的比较
节点包括两种类型:一种是 React组件,另一种是HTML的DOM。
如果节点类型不同,按以下方式比较。

如果 HTML DOM不同,直接使用新的替换旧的。如果组件类型不同,也直接使用新的替换旧的。

如果 HTML DOM类型相同,按以下方式比较。
在 React里样式并不是一个纯粹的字符串,而是一个对象,这样在样式发生改变时,只需要改变替换变化以后的样式。修改完当前节点之后,递归处理该节点的子节点。
如果组件类型相同,按以下方式比较。

如果组件类型相同,使用 React机制处理。一般使用新的 props替换旧的 props,并在之后调用组件的 componentWillReceiveProps方法,之前组件的 render方法会被调用。
(2)两个列表之间的比较。

一个节点列表中的一个节点发生改变, React无法很妤地处理这个问题。循环新旧两个列表,并找出不同,这是 React唯一的处理方法。

但是,有一个办法可以把这个算法的复杂度降低。那就是在生成一个节点列表时给每个节点上添加一个key。这个key只需要在这一个节点列表中唯一,不需要全局唯一。
(3)取舍

需要注意的是,上面的启发式算法基于两点假设。

类型相近的节点总是生成同样的树,而类型不同的节点也总是生成不同的树

可以为多次 render都表现稳定的节点设置key。

上面的节点之间的比较算法基本上就是基于这两个假设而实现的。要提高 React应用的效率,需要按照这两点假设来开发。

15.传入 setstate函数的第二个参数的作用是什么?

第二个参数是一个函数,该函数会在 setState函数调用完成并且组件开始重渲染时调用,可以用该函数来监听渲染是否完成。​​​​​​​

16.React和vue.js的相似性和差异性是什么?

相似性如下。

(1)都是用于创建UI的 JavaScript库。

(2)都是快速和轻量级的代码库(这里指 React核心库)。

(3)都有基于组件的架构。

(4)都使用虚拟DOM。

(5)都可以放在单独的HTML文件中,或者放在 Webpack设置的一个更复杂的模块中。

(6)都有独立但常用的路由器和状态管理库。

它们最大的区别在于 Vue. js通常使用HTML模板文件,而 React完全使用 JavaScript创建虚拟DOM。 Vue. js还具有对于“可变状态”的“ reactivity”的重新渲染的自动化检测系统

17.生命周期调用方法的顺序?
React生命周期分为三大周期,11个阶段,生命周期方法调用顺序分别如下。

(1)在创建期的五大阶段,调用方法的顺序如下。

getDetaultProps:定义默认属性数据。

getInitialState:初始化默认状态数据。

component WillMount:组件即将被构建。

render:渲染组件。

componentDidMount:组件构建完成

(2)在存在期的五大阶段,调用方法的顺序如下。

componentWillReceiveProps:组件即将接收新的属性数据。

shouldComponentUpdate:判断组件是否应该更新。

componnent WillUpdate:组件即将更新。

render:渲染组件。

componentDidUpdate:组件更新完成。

(3)在销毁期的一个阶段,调用方法 componentWillUnmount,表示组件即将被销毀。
18.使用状态要注意哪些事情?

要注意以下几点。

不要直接更新状态

状态更新可能是异步的

状态更新要合并。

数据从上向下流动

19.说说 React组件开发中关于作用域的常见问题。

在 EMAScript5语法规范中,关于作用域的常见问题如下。

(1)在map等方法的回调函数中,要绑定作用域this(通过bind方法)。

(2)父组件传递给子组件方法的作用域是父组件实例化对象,无法改变。

(3)组件事件回调函数方法的作用域是组件实例化对象(绑定父组件提供的方法就是父组件实例化对象),无法改变。

在 EMAScript6语法规范中,关于作用域的常见问题如下。

(1)当使用箭头函数作为map等方法的回调函数时,箭头函数的作用域是当前组件的实例化对象(即箭头函数的作用域是定义时的作用域),无须绑定作用域。

(2)事件回调函数要绑定组件作用域。

(3)父组件传递方法要绑定父组件作用域。

总之,在 EMAScript6语法规范中,组件方法的作用域是可以改变的。

20.在 Redux中使用 Action要注意哪些问题?

在Redux中使用 Action的时候, Action文件里尽量保持 Action文件的纯净,传入什么数据就返回什么数据,最妤把请求的数据和 Action方法分离开,以保持 Action的纯净。

21.在 Reducer文件里,对于返回的结果,要注意哪些问题?

在 Reducer文件里,对于返回的结果,必须要使用 Object.assign ( )来复制一份新的 state,否则页面不会跟着数据刷新。

22.在使用 React Router时,如何获取当前页面的路由或浏览器中地址栏中的地址?

在当前组件的 props中,包含 location属性对象,包含当前页面路由地址信息,在 match中存储当前路由的参数等数据信息。可以直接通过 this .props使用它们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值