使用 React.createRef 创建 Ref 而不在 React 中使用构造函数?

IT技术 javascript reactjs ref
2021-05-13 09:11:21

基本上,我只使用constructorReact3 个原因 -

1. 初始化state像 -

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = { counter: 0 };
    }
}

但是由于 Babel 的class-field支持,我不再使用它了

class App extends React.Component {
    state = { counter: 0 };
}

2.bind功能如 -

class App extends React.Component {
    constructor(props) {
        super(props);
        this.increment.bind(this);
    }

    increment() {

    }
}

但由于arrow功能,我不再这样做了

class App extends React.Component {
    increment = () => {

    }
}

3. 使用createRef喜欢 -

class App extends React.Component {
    constructor(props) {
        super(props);
        this.inputRef = React.createRef();
    }
}

那么我可以在React.createRef不使用constructorReact 的情况下使用吗?

4个回答

您可以将其声明为类字段,就像state.

class App extends React.Component {
  state = { counter: 0 };
  inputRef = React.createRef();
}

Babel 会将其转译为类似下面第 2 阶段预设中的代码。

constructor(props) {
    super(props);

    this.state = { counter: 0 };
    this.inputRef = React.createRef();
  }

是的你可以。例如:

const MyComponent = () => {
  const inputRef = React.createRef();

  return (
    <input ref={inputRef} />
  );
}

您唯一不能做的就是将ref属性传递给功能组件:

render() {
  // This won't work.
  return <MyFunctionalComponent ref={this.inputRef} />
}

来自官方文档的更多信息,在这里

但是,ref只要引用 DOM 元素或类组件,就可以在函数组件中使用该属性:

您可以在不使用构造函数的情况下创建带有 ref 回调的 ref。<input ref={(element) => { this.inputRef = element; }} />是你所需要的。

类组件上写如下:

import React, { Component, createRef } from 'react';

class App extends Component {
  inputRef = createRef();

  render() {
    return (
      <div ref={this.inputRef}~~~
    );
  }
}

功能组件上写如下:

import React, { useRef } from 'react';

const App = () => {
  const inputRef = useRef(null);

  return (
    <div ref={inputRef}~~~
  );
};

当然,被引用的元素是可变对象,但它应该在组件的整个生命周期内持续存在。这不是我的意见,这句话是针对ReactJS 文档的