react 面试问题

2021-01-20  本文已影响0人  skoll

如果在初始状态中使用 props 属性会发生什么?

如果在不刷新组件的情况下更改组件上的属性,则不会显示新的属性值,因为构造函数函数永远不会更新组件的当前状态。只有在首次创建组件时才会用 props 属性初始化状态

//这里是不会显示更新的输入值的
class MyComponent extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      records: [],
      inputValue: this.props.inputValue
    };
  }

  render() {
    return <div>{this.state.inputValue}</div>
  }
}

//这里会显示
class MyComponent extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      record: []
    }
  }

  render() {
    return <div>{this.props.inputValue}</div>
  }
}

createElement() 和 cloneElement() 方法有什么区别?

JSX 元素将被转换为 React.createElement() 函数来创建 React 元素,这些对象将用于表示 UI 对象。而 cloneElement 用于克隆元素并传递新的属性

组件的命名方法

export default class TodoApp extends React.Component {
  // ...
}

不用 display 方式

switching组件

//这就是简单版的路由操作吧
import HomePage from './HomePage'
import AboutPage from './AboutPage'
import ServicesPage from './ServicesPage'
import ContactPage from './ContactPage'

const PAGES = {
  home: HomePage,
  about: AboutPage,
  services: ServicesPage,
  contact: ContactPage
}

const Page = (props) => {
  const Handler = PAGES[props.page] || ContactPage

  return <Handler {...props} />
}

// The keys of the PAGES object can be used in the prop types to catch dev-time errors.
Page.propTypes = {
  page: PropTypes.oneOf(Object.keys(PAGES)).isRequired
}

为什么我们需要将函数传递给 setState() 方法?

这背后的原因是 setState() 是一个异步操作。出于性能原因,React 会对状态更改进行批处理,因此在调用 setState() 方法之后,状态可能不会立即更改。这意味着当你调用 setState() 方法时,你不应该依赖当前状态,因为你不能确定当前状态应该是什么。这个问题的解决方案是将一个函数传递给 setState(),该函数会以上一个状态作为参数。通过这样做,你可以避免由于 setState() 的异步性质而导致用户在访问时获取旧状态值的问题。

假设初始计数值为零。在连续三次增加操作之后,该值将只增加一个。

this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
// this.state.count === 1, not 3


this.setState((prevState, props) => ({
  count: prevState.count + props.increment
}))
// this.state.count === 3 as expected

在 React v16 中是否支持自定义 DOM 属性

1 .支持所有自定义的DOM属性
2 .建议避免使用 forceUpdate(),强制更新组件刷新,并且只在 render() 方法中读取 this.props 和 this.state。

super(props)做了什么?

1 .传统的组件样式

class Checkbox extends React.Component {
  constructor(props) {
    super(props);
    this.state = { isOn: true };
  }
  // ...
}

2 .super指的是父类的构造函数,在上面的例子中,指的是react.component的实现
3 .在调用父类构造函数之前,是不能在constructor中使用this关键字
4 .让 React.Component 构造函数能够初始化 this.props,将 props 传入 super 是必须的
5 .React 在调用构造函数后也立即将 props 赋值到了实例上,即使你不传props,也是可以访问的。但是这样不是很明确,最好还是加上为好
6 .React 会在构造函数执行完毕之后给 this.props 赋值。但如此为之会使得 this.props 在 super 调用一直到构造函数结束期间值为 undefined。
7 .如果super传入了props,那么会在构造函数执行完毕之前被赋值

class Button extends React.Component {
  constructor(props) {
    super(props); // ✅ 传入 props
    console.log(props);      // ✅ {}
    console.log(this.props); // ✅ {}
  }
  // ...
}

8 .super(props, context) 这里是两个参数,但是后面的一般都不会用到
9 .有了hook之后,就不用再搞这些有的没的了
10 .

上一篇 下一篇

猜你喜欢

热点阅读