ReactでのRefの使用_05
5442 ワード
ReactにおけるRefの使用React v 16.6.3
典型的なReactデータストリームでは、propsは親コンポーネントとそのサブコンポーネントが相互作用する唯一の方法である.サブアイテムを変更するには、new propsを使用して再表示します.ただし、場合によっては、通常のデータ・ストリーム以外のサブアイテムを強制的に変更する必要があります.変更するサブアイテムは、Reactコンポーネントのインスタンスであってもよいし、DOM要素であってもよい.どちらの場合もReactはapiを提供しています.
refsの使用方法
refsにはいくつかの良い例があります. 1.テキスト選択またはメディア再生. 2.必須のアニメーションをトリガします. 3.サードパーティ製DOMライブラリとの統合.
宣言的に完了できる任意の操作にrefsを使用しないでください.
*Refsを過度に使用しない
旧API:文字列参照
Reactを使用したことがある場合は、ref属性が文字列「textInput」であり、DOMノードがthisにアクセスする古いAPIを熟知している可能性があります.refs.textInput.文字列参照に問題があるため、問題が残っていると考えられ、将来のバージョンで削除される可能性が高いため、使用しないことをお勧めします.
コールバックリファレンス
コンポーネントがインストールされると、ReactはDOM要素を使用してrefコールバックを呼び出し、アンインストール時にnullを呼び出します.Refsは、componentDidMountまたはcomponentDidUpdateがトリガーされる前に最新であることを保証する.
refs例--クリックしてinputフォーカスを取得
Reactを使用します.createRef()
React.createRef()React 16.3に導入されたAPI.以前のバージョンのReactを使用している場合は、コールバックリファレンスを使用することをお勧めします.
Reactを作成します.createRef()
Refsはプロパティを使用して作成されましたcreateRef()を作成し、ref属性でReact要素に添付します.コンポーネントを構築する際には、通常、インスタンス属性にRefsが割り当てられ、コンポーネント全体で参照できるようになります.
refの値はノードのタイプによって異なります refHTML要素でこの属性を使用すると、構造関数で作成するrefの属性がReactされる.createRef()は、そのcurrent属性として最下位のDOM要素を受信する. refカスタムクラスコンポーネントでこのプロパティを使用すると、refオブジェクトは受信コンポーネントのインストール済みインスタンスをcurrentとします.
インスタンスがないため、refは関数コンポーネントでこのプロパティを使用できません.
Currentコンポーネントがインストールされると、ReactはそのプロパティにDOM要素を割り当て、nullはアンインストール時に割り当てます.ref更新が発生する前にcomponentDidMountまたはcomponentDidUpdateライフサイクルメソッド.
関数コンポーネントでrefプロパティを使用できません
**参照が必要な場合は、ライフサイクルメソッドまたはステータスが必要な場合と同様に、コンポーネントをクラスに変換する必要があります.ただし、DOM要素またはクラスコンポーネントを参照すると、関数コンポーネントでrefプロパティを使用できます:**
親コンポーネントへのDOMリファレンスの公開
ごく少数の場合、親コンポーネントから子ノードのDOMノードにアクセスしたい場合があります.コンポーネントパッケージを破壊するため、通常は推奨されませんが、フォーカスまたは測定子DOMノードのサイズまたは位置をトリガするためにたまに使用できます.
サブコンポーネントに参照を追加できますが、DOMノードではなくコンポーネントインスタンスしか得られないため、理想的な解決策ではありません.また、これは機能コンポーネントには適用されません.
React 16.3以降を使用する場合は、ref forwardingを使用することをお勧めします.リファレンス転送では、コンポーネントが任意のサブコンポーネントのリファレンスを自分のコンポーネントとして公開することを選択できます.サブDOMノードを親コンポーネントに公開する方法の詳細な例は、ref転送ドキュメントにあります.
React 16.2以降を使用する場合、またはref転送よりも柔軟性が必要な場合は、この代替方法を使用して、refを異なる名前のpropとして明確に渡すことができます.
可能であればDOMノードを露出しないことをお勧めしますが、有用な脱出室であることができます.この方法では、サブコンポーネントにコードを追加する必要があります.サブアセンブリ実装を完全に制御できない場合は、findDOMNode()を使用しますが、StrictModeの使用は奨励されません.
典型的なReactデータストリームでは、propsは親コンポーネントとそのサブコンポーネントが相互作用する唯一の方法である.サブアイテムを変更するには、new propsを使用して再表示します.ただし、場合によっては、通常のデータ・ストリーム以外のサブアイテムを強制的に変更する必要があります.変更するサブアイテムは、Reactコンポーネントのインスタンスであってもよいし、DOM要素であってもよい.どちらの場合もReactはapiを提供しています.
refsの使用方法
refsにはいくつかの良い例があります.
宣言的に完了できる任意の操作にrefsを使用しないでください.
*Refsを過度に使用しない
旧API:文字列参照
Reactを使用したことがある場合は、ref属性が文字列「textInput」であり、DOMノードがthisにアクセスする古いAPIを熟知している可能性があります.refs.textInput.文字列参照に問題があるため、問題が残っていると考えられ、将来のバージョンで削除される可能性が高いため、使用しないことをお勧めします.
コールバックリファレンス
コンポーネントがインストールされると、ReactはDOM要素を使用してrefコールバックを呼び出し、アンインストール時にnullを呼び出します.Refsは、componentDidMountまたはcomponentDidUpdateがトリガーされる前に最新であることを保証する.
class CustomTextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = null;
this.setTextInputRef = element => {
this.textInput = element;
};
this.focusTextInput = () => {
// Focus the text input using the raw DOM API
if (this.textInput) this.textInput.focus();
};
}
componentDidMount() {
// autofocus the input on mount
this.focusTextInput();
}
render() {
// Use the `ref` callback to store a reference to the text input DOM
// element in an instance field (for example, this.textInput).
return (
);
}
}
refs例--クリックしてinputフォーカスを取得
class Example extends React.Component {
handleClick() {
// DOM API
this.refs.myInput.focus
();
}
render() {
// DOM ,ref this.refs
return (
);
}
}
Reactを使用します.createRef()
React.createRef()React 16.3に導入されたAPI.以前のバージョンのReactを使用している場合は、コールバックリファレンスを使用することをお勧めします.
Reactを作成します.createRef()
Refsはプロパティを使用して作成されましたcreateRef()を作成し、ref属性でReact要素に添付します.コンポーネントを構築する際には、通常、インスタンス属性にRefsが割り当てられ、コンポーネント全体で参照できるようになります.
class MyComponent extends React.Component { constructor(props) { super(props); this.myRef = React.createRef(); } render() { return
; } }
访问ref
当ref被传递给元素时render,对该节点的引用变得可以在currentref 的属性处访问
const node = this.myRef.current;
refの値はノードのタイプによって異なります
インスタンスがないため、refは関数コンポーネントでこのプロパティを使用できません.
class CustomTextInput extends React.Component {
constructor(props) {
super(props);
// create a ref to store the textInput DOM element
this.textInput = React.createRef();
this.focusTextInput = this.focusTextInput.bind(this);
}
focusTextInput() {
// Explicitly focus the text input using the raw DOM API
// Note: we're accessing "current" to get the DOM node
this.textInput.current.focus();
}
render() {
// tell React that we want to associate the ref
// with the `textInput` that we created in the constructor
return (
);
}
}
Currentコンポーネントがインストールされると、ReactはそのプロパティにDOM要素を割り当て、nullはアンインストール時に割り当てます.ref更新が発生する前にcomponentDidMountまたはcomponentDidUpdateライフサイクルメソッド.
関数コンポーネントでrefプロパティを使用できません
function MyFunctionComponent() {
return ;
}
class Parent extends React.Component {
constructor(props) {
super(props);
this.textInput = React.createRef();
}
render() {
// This will *not* work!
return (
);
}
}
**参照が必要な場合は、ライフサイクルメソッドまたはステータスが必要な場合と同様に、コンポーネントをクラスに変換する必要があります.ただし、DOM要素またはクラスコンポーネントを参照すると、関数コンポーネントでrefプロパティを使用できます:**
function CustomTextInput(props) {
// textInput must be declared here so the ref can refer to it
let textInput = React.createRef();
function handleClick() {
textInput.current.focus();
}
return (
);
}
親コンポーネントへのDOMリファレンスの公開
ごく少数の場合、親コンポーネントから子ノードのDOMノードにアクセスしたい場合があります.コンポーネントパッケージを破壊するため、通常は推奨されませんが、フォーカスまたは測定子DOMノードのサイズまたは位置をトリガするためにたまに使用できます.
サブコンポーネントに参照を追加できますが、DOMノードではなくコンポーネントインスタンスしか得られないため、理想的な解決策ではありません.また、これは機能コンポーネントには適用されません.
React 16.3以降を使用する場合は、ref forwardingを使用することをお勧めします.リファレンス転送では、コンポーネントが任意のサブコンポーネントのリファレンスを自分のコンポーネントとして公開することを選択できます.サブDOMノードを親コンポーネントに公開する方法の詳細な例は、ref転送ドキュメントにあります.
React 16.2以降を使用する場合、またはref転送よりも柔軟性が必要な場合は、この代替方法を使用して、refを異なる名前のpropとして明確に渡すことができます.
可能であればDOMノードを露出しないことをお勧めしますが、有用な脱出室であることができます.この方法では、サブコンポーネントにコードを追加する必要があります.サブアセンブリ実装を完全に制御できない場合は、findDOMNode()を使用しますが、StrictModeの使用は奨励されません.