react面试题

什么是虚拟DOM?
虚拟DOM(VDOM)是真实DOM在内存中的表示。UI的表示形式保存在内存中,并与实际的DOM同步。这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤,整个过程被称为调和。
类组件和函数组件之间的区别是啥?

  • 类组件可以使用其他特性,如状态state和生命周期钩子。
  • 当组件只是接收props渲染到页面时,就是无状态组件,就属于函数组件,也被称为哑组件或展示组件。
    函数组件和类组件当然是有区别的,而且函数组件的性能比类组件的性能要高,因为类组件使用的时候要实例化,而函数组件直接执行函数取返回结果即可。为了提高性能,尽量使用函数组件。
    在这里插入图片描述
    React中refs干嘛用的?
    Refs提供了一种访问在render方法中创建的DOM节点或者React元素的方法。在典型的数据流中,props是父子组件交互的唯一方式,想要修改子组件,需要使用新的props重新渲染它。凡事有例外,某些情况下咱们需要咋典型数据流外,强制修改子代,这个时候可以使用Refs。
    咱们可以再组件添加一个ref属性来使用,该属性的值是一个回调函数,接收作为其第一个参数的底层DOM元素或组件的挂载实例。
class UnControlledForm extends Component{
	handleSubmit = () =>{
		console.log("Input Value:",this.inputt.value)
	}
	render(){
	return(
			<form onSubmit={this.handleSubmit}>
				<input 
					type='text'
					ref={(input)=>this.input=input}/>
				<button type='submit'>Submit</button>
			</form>
		)
	}
}

请注意,input元素有一个ref属性,它的值是一个函数。该函数接收输入的实际DOM元素,然后将其放在实例上,这样就可以在handleSubmit函数内部访问它。
经常被误解的只有在类组件中才能使用refs,但是refs也可通过利用js中的闭包与函数组件一起使用。

function CustomeForm({handleSubmit}){
	let inputElement;
	return (
		<form onSubmit={()=>handleSubmit(inputElement.value)}>
			<input
			type='text'
			ref={(input)=>inputElement=input}/>
			<button type='submit'>Submit</button>
		</form>
	)
}

在React中如何处理事件
为了解决夸浏览器的兼容性问题,SyntheticEvent实例将被传递给你的事件处理函数,SyntheticEvent是React跨浏览器的浏览器原生事件包装器,他还拥有和浏览器原生事件相同的接口,包括stopPropagation()和preventDefault().
比较有趣的是,React实际上并不将事件附加到子节点本身。React使用单个事件侦听器侦听顶层的所有事件。这对性能有好处,也意味着React在更新DOM时不需要跟踪事件监听器。
state和props区别是啥?
props和states是普通的js对象。虽然它们都包含影响渲染输出的信息,但是它们在组件方面的功能是不同的。即

  • state是组件自己管理数据,控制自己的状态,可变;
  • props是外部传入的数据参数,不可变;
  • 没有states的叫做无状态组件,有state的叫做有状态组件;
  • 多用props,少用state,也就是多写无状态组件
    如何创建refs
    Refs是使用React.createRef() 创建的,并通过ref属性附加到React元素。在构造组件时,通常将Refs分配给实例属性,以便可以再整个组件中引用他们。
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}

或者这样用:

class UserForm extends Component {
  handleSubmit = () => {
    console.log("Input Value is: ", this.input.value)
  }
  render () {
    return (
      <form onSubmit={this.handleSubmit}>
        <input
          type='text'
          ref={(input) => this.input = input} /> // Access DOM input in handle submit
        <button type='submit'>Submit</button>
      </form>
    )
  }
}

什么是高阶组件
高阶组件(HOC)是接受一个组件并返回一个新组建的函数。基本上,这是一个模式,是从React的组合特性中衍生出来的,称其为出组件,因为他们可以接受任何动态提供的子组件,但不会修改或复制输入组件中的任何行为。

const EnhancedComponent = higherOrderComponent(WrappedComponent);

HOC可以用于以下许多案例

  • 代码重用、逻辑和引导抽象
  • 渲染劫持
  • state抽象和操作
  • props处理
    在构造函数调用super并将props作为参数传入的作用是啥?
    在调用super()方法之前,子类构造函数无法使用this引用,ES6子类也是如此。将props参数传递给super()调用的主要原因是在字构造函数中能够通过this.props来获取传入的props。

传递props

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    console.log(this.props);  // { name: 'sudheer',age: 30 }
  }
}

没传递props

class MyComponent extends React.Component {
  constructor(props) {
    super();
    console.log(this.props); // undefined
    // 但是 Props 参数仍然可用
    console.log(props); // Prints { name: 'sudheer',age: 30 }
  }

  render() {
    // 构造函数外部不受影响
    console.log(this.props) // { name: 'sudheer',age: 30 }
  }
}

上面实例揭示了一点。props的行为只有在构造函数中是不同的,在构造函数之外也是一样的。
什么是控制组件
在HTML中,表单元素如< input >、< textarea >和< select >通常维护自己的状态,并根据用户输入进行更新。当用户提交表单时,来自上述元素的值将随表单一起发送。
而 React 的工作方式则不同。包含表单的组件将跟踪其状态中的输入值,并在每次回调函数(例如onChange)触发时重新渲染组件,因为状态被更新。以这种方式由 React 控制其值的输入表单元素称为受控组件。
如何 React.createElement ?
问题

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
)

上述代码如何使用 React.createElement 来实现:

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

讲讲什么是 JSX ?
当 Facebook 第一次发布 React 时,他们还引入了一种新的 JS 方言 JSX,将原始 HTML 模板嵌入到 JS 代码中。JSX 代码本身不能被浏览器读取,必须使用Babel和webpack等工具将其转换为传统的JS。很多开发人员就能无意识使用 JSX,因为它已经与 React 结合在一直了。

class MyComponent extends React.Component {
  render() {
    let props = this.props;  
    return (
      <div className="my-component">
      <a href={props.url}>{props.name}</a>
      </div>
    );
  }
}

为什么不直接更新 state 呢 ?
如果试图直接更新 state ,则不会重新渲染组件。

//错误
This.state.message = 'Hello world';

需要使用setState()方法来更新 state。它调度对组件state对象的更新。当state改变时,组件通过重新渲染来响应:

//正确做法
This.setState({message: ‘Hello World’});

React 组件生命周期有哪些不同阶段?
在组件生命周期中有四个不同的阶段:

  1. Initialization:在这个阶段,组件准备设置初始化状态和默认属性。
  2. Mounting:react 组件已经准备好挂载到浏览器 DOM 中。这个阶段包括componentWillMount和componentDidMount生命周期方法。
  3. Updating:在这个阶段,组件以两种方式更新,发送新的 props 和 state 状态。此阶段包括shouldComponentUpdate、componentWillUpdate和componentDidUpdate生命周期方法
  4. Unmounting:在这个阶段,组件已经不再被需要了,它从浏览器 DOM 中卸载下来。这个阶段包含 componentWillUnmount 生命周期方法
    除以上四个常用生命周期外,还有一个错误处理的阶段:
    Error Handling:在这个阶段,不论在渲染的过程中,还是在生命周期方法中或是在任何子组件的构造函数中发生错误,该组件都会被调用。这个阶段包含了 componentDidCatch 生命周期方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值