React常见面试题 ( 一 )

1.当你调用setState的时候,发生了什么事?

当调用 setState 时,React会做的第一件事情是将传递给 setState 的对象合并到组件的当前状态。 这将启动一个称为和解(reconciliation)的过程。 和解(reconciliation)的最终目标是以最有效的方式,根据这个新的状态来更新UI。 为此,React将构建一个新的 React 元素树(您可以将其视为 UI 的对象表示)。 一旦有了这个树,为了弄清 UI 如何响应新的状态而改变,React 会将这个新树与上一个元素树相比较( diff )。 通过这样做, React 将会知道发生的确切变化,并且通过了解发生什么变化,只需在绝对必要的情况下进行更新即可最小化 UI 的占用空间

2.props和state相同点和不同点

相同点:
1.不管是props还是state的改变,都会引发render的重新渲染。

2.都能由自身组件的相应初始化函数设定初始值。

不同点 :
1.初始值来源:
state的初始值来自于自身的getInitalState(constructor)函数;
props来自于父组件或者自身getDefaultProps(若key相同前者可覆盖后者)。

2.修改方式:
state只能在自身组件中setState,不能由父组件修改;
props只能由父组件修改,不能在自身组件修改。

3.对子组件:
props是一个父组件传递给子组件的数据流,这个数据流可以一直传递到子孙组件;
state代表的是一个组件内部自身的状态,只能在自身组件中存在。

3.shouldComponentUpdate 应该做什么

其实这个问题也是跟reconciliation有关系。 “和解( reconciliation )的最终目标是以最有效的方式,根据新的状态更新用户界面”。 如果我们知道我们的用户界面(UI)的某一部分不会改变, 那么没有理由让 React 很麻烦地试图去弄清楚它是否应该渲染。 通过从 shouldComponentUpdate 返回 false, React 将假定当前组件及其所有子组件将保持与当前组件相同

4.redux状态管理的流程

action是用户触发或程序触发的一个普通对象。 reducer是根据action操作来做出不同的数据响应,返回一个新的state。 store的最终值就是由reducer的值来确定的。(一个store是一个对象, reducer会改变store中的某些值) action -> reducer -> 新store -> 反馈到UI上有所改变。

5.reactJS的props.children.map函数来遍历会收到异常提示,为什么?应该如何遍历?

this.props.children 的值有三种可能:
1.当前组件没有子节点,它就是 undefined;
2.有一个子节点,数据类型是 object ;
3.有多个子节点,数据类型就是 array 。 系统提供React.Children.map()方法安全的遍历子节点对象

6.Redux中同步 action 与异步 action 最大的区别是什么

同步只返回一个普通 action 对象。而异步操作中途会返回一个 promise 函数。当然在 promise 函数处理完毕后也会返回一个普通 action 对象。thunk 中间件就是判断如果返回的是函数,则不传导给 reducer,直到检测到是普通 action 对象,才交由 reducer 处理。

7.什么是JSX

JSX是ECMAScript一个类似XML的语法扩展。基本上,它只是为React.createElement()函数提供语法糖,从而让我们在JavaScript中,使用类似HTML模板的语法,进行页面描述

在下面的示例中, 《h1》内的文本标签会作为JavaScript函数返回给渲染函数。

class App extends React.Component{
  render(){
    return (
      <div>
        <h1>{'Welcome to React world!'}</h1>
      </div>
    )
  }
}

以上示例render方法中的JSX将会被转化为以下内容:

React.createElement("div",null,React.createElement("h1",null,'Welcome to React world!'));

8.如何在React中创建组件

创建组件的方式,传送门 → 种创建组件的方法

1.Function Component(函数式组件):这是创建组件最简单的方式。这些是纯JavaScript函数,接受props对象作为第一个参数并返回React元素:

export default function Greeting({message}){
    return <h1>{`Hello,${message}`}</h1>
}

2.Class Components(类组件):你还可以使用ES6类定义组件。上面的函数组件若使用ES6的类可改写为:

class Greeting extends Component{
    constructor(){
        super('props');
    }
    render(){
        return <h1>{`Hello,${this.props.message}`}</h1>
    }
}

export default Greeting;

通过以上任意方式创建的组件,可以这样使用:

 <Greeting  message="semlinker"/>

在React内部对函数组件和类组件的处理方式是不一样的,如:

//如果Greeting是一个函数
const result = Greeting(props);//<p>Hello</p>

//如果Greeting是一个类
const instance = new Greeting(props);//Greeting{}
const result = instance.render();//<p>Hello</p>

9.何时使用类组件和函数组件?

如果组件需要使用状态或生命周期方法,那么使用类组件,否则使用函数组件。

10.React的状态state是什么?

组件的状态是一个对象,它包含某些信息,这些信息可能在组件的生命周期中发生更改。我们应该尽量使状态尽可能简单,并尽量减少有状态组件的数量。

状态(State)与属性(props)类似,但它是私有的,完全由组件控制。也就是说,除了它所属的组件外,任何组件都无法访问它。

11.React中的props是什么?

Props是组件的输入。它们是单个值或包含一组值的对象,这些值在创建时使用类似于HTML标记属性的命名约定传递给组件。它们是从父组件传递到子组件的数据。

Props的主要目的是提供以下组件功能:

  • 将自定义数据传递到组件。
  • 触发状态更改。
  • 在组件的render()方法中通过this.props.reactProp使用。

12.状态和属性有什么区别?

state和props都是普通的JavaScript对象。虽然它们都保存着影响渲染输出的信息,但是它们在组件方面的功能不同。Props以类似于函数参数的方式传递给组件,而状态则类似于在函数内部声明变量并对它进行管理。

States VS Props

Conditions States Props
可从父组件接收初始值
可从父组件中改变其值
在组件被设置默认值
在组件内可改变
可作为子组件的初始值

13.为什么不能直接更新状态

如果你尝试直接改变状态,那么组件将不会重新渲染。

this.state.message = 'Hello World'

正确的方法应该是setState()方法。他调度组件状态对象的更新。当状态更改时,组件通常将会重新渲染。

this.setState({message:'Hello world')

注意:你可以在constructor中或使用最新的JavaScript类属性声明语法直接设置状态对象

14.回调函数作为setState()参数的目的是什么?

当setState完成和组件渲染后,回调函数将会被调用。由于setState()是异步的,回调函数用于任何后续的操作。

注意:建议使用生命周期方法而不是此回调函数

setState({name:'JoHn'},()=>{console.log('The name has updated and component re-rendered')})

15.HTML 和 React事件处理有什么区别?

  • 在HTML中事件名必须小写:
<button onclick="activateLasers()">    

而在React中遵循驼峰惯例:

<button onClick={activateLasers}>
  • 在HTML中你可以返回false以阻止默认的行为
<a href="#" onclick ='console.log("The link was clicked.");return false;' />

而在React中你必须得明确调用preventDefault():

function handleClick(event){
  event.preventDefault()
  console.log('The link was clicked.')
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章