基本的に、constructor
でReact
を使用した理由は3つだけです-
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 };
}
bind
関数のように-class App extends React.Component {
constructor(props) {
super(props);
this.increment.bind(this);
}
increment() {
}
}
しかし、arrow
関数のために、私はもうそれをしません
class App extends React.Component {
increment = () => {
}
}
createRef
のように使用するには-class App extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef();
}
}
だから私はReact.createRef
Reactでconstructor
を使用せずに?
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} />
}
公式ドキュメントの詳細情報 こちら :
ただし、DOM要素またはクラスコンポーネントを参照する限り、関数コンポーネント内で
ref
属性を使用できます。
クラスコンポーネント上に次のように書きます:
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 docs のためのものです。
はい。状態で行ったとおり(Babelのクラスフィールドサポートを使用):
class App extends React.Component {
inputRef = React.createRef();
}
コンストラクタを使用せずに、refコールバックでrefを作成できます。 <input ref={(element) => { this.inputRef = element; }} />
が必要です。