Reactステップノート3(Refs&DOM)
6918 ワード
refsは、renderで作成されたdomノードまたはReact要素にアクセスする方法を提供します.
典型的なReactデータストリームでは、
Refsの使用方法
①処理焦点、テキスト選択又はメディア制御②強制動画のトリガー③第三者のDOMライブラリを統合することが宣言により実現可能であれば、
Refsを過度に使用しない
まず、アプリケーションで
Note
以下の例は既にReact v 16を用いる.3導入された
Refsの作成
①Reactを使用する.creatRef()を使用してrefsを作成し、refプロパティを使用してReact要素を取得します.2コンポーネントを構築する場合、refsは通常、コンポーネントの属性に付与される.これにより、コンポーネントのいずれかで彼を使用することができます.
demo
次のコードは、
Reactは、コンポーネントのロード時にDOM要素を
クラスコンポーネントにrefを追加
上の
なお、この方法は、
Refsと関数コンポーネント
関数コンポーネントにはインスタンスがないため、
注意:DOMまたは
親コンポーネントへのDOMノードの露出
ごく少数の場合、親コンポーネントから子コンポーネントのノードにアクセスしたい場合があります.コンポーネントのパッケージを破壊するため、通常は推奨されません.しかし、たまにフォーカス後者をトリガしてサブノードdomのサイズまたは位置を測定するために使用することもできる.
サブコンポーネントにrefを追加できますが、domノードではなくコンポーネントインスタンスしか取得できないため、この方法は関数コンポーネントでは無効です.
React 16.3以上を使用する場合は、ref転送を推奨します.Ref転送は、コンポーネントが自分のrefを露出するようにサブコンポーネントのrefを露出させることができ、親コンポーネントにサブコンポーネントをどのように露出させるかのDOMノードについて、ref転送ドキュメントに詳細な例がある.
React 16.2以下を使用するか、ref転送よりも柔軟性が必要な場合は、この代替案を使用してrefを特殊な名前のpropとして直接伝えることができます.
できればDOMノードの露出はお勧めしませんが、時には命の藁になることがあります.これらのスキームには、サブコンポーネントにコードを追加する必要があります.サブコンポーネントの実装に制御権がない場合は、残りの選択は
コールバックrefs
Reactはまた、
これは、
demo:
Reactは、コンポーネントのマウント時にdom要素を
上記の例では、Parentがそのrefコールバック関数をinputRefとしてCustomTextInputに渡し、CustomTextInputがrefプロパティを介して渡します.最終的には、Parentのthis.InputElementは、CustomTextIputの要素に対応するDOMノードに設定されます.
に注意
refコールバックがインライン関数で定義されている場合、更新中に2回呼び出され、最初のパラメータはnullで、その後のパラメータはDOM要素です.これは、レンダリングのたびに新しい関数インスタンスが作成されるためです.したがって,Reactは古いrefをクリーンアップし,新しいものを設定する必要がある.refのコールバック関数をクラスのバインド関数として定義することで、上記の問題を回避できますが、ほとんどの場合は重要ではありません.
典型的なReactデータストリームでは、
(props)
は親コンポーネントが子コンポーネントと対話する唯一の方法である.サブコンポーネントを変更するには、新しいpropsを使用して再レンダリングする必要があります.しかし、場合によっては、典型的なデータストリームの外で、サブコンポーネントを強制的に変更する必要があります.修正するサブコンポーネントは、Reactのインスタンスであってもよいし、DOM要素であってもよい.この2つの場合、Reactは解決策を提供する.Refsの使用方法
①処理焦点、テキスト選択又はメディア制御②強制動画のトリガー③第三者のDOMライブラリを統合することが宣言により実現可能であれば、
Refs
例えばDialog
コンポーネントにopen()
及びclose()
メソッドを直接露出させないように、isOpen
属性を伝達することが望ましい.Refsを過度に使用しない
まず、アプリケーションで
Refs
を使用してコンポーネントを更新することを考えるかもしれません.もしそうであれば、state
属性のコンポーネントレベルでの位置を考えてみてください.通常、ステータスアップグレード:コンポーネントstate
のレベルをアップグレードするのがより適切な方法であることがわかります.例については、ステータスアップグレードを参照してください.Note
以下の例は既にReact v 16を用いる.3導入された
React.createRef()
API更新.Reactの以前のリリースを使用している場合は、コールバック形式のrefsを使用することをお勧めします.Refsの作成
①Reactを使用する.creatRef()を使用してrefsを作成し、refプロパティを使用してReact要素を取得します.2コンポーネントを構築する場合、refsは通常、コンポーネントの属性に付与される.これにより、コンポーネントのいずれかで彼を使用することができます.
class MyComponent extends React.Component{ constructor(props){ super(props); this.myRef=React.createRef(); } render(){ return
} }
访问refs
当一个ref
属性被传递给一个render()
函数中的元素时,可以使用ref
中的current
属性对节点的引用进行访问。
const current = this.myRef.current;
ref
の値は、ノードタイプ1に依存し、ref
の属性が通常のHTML要素に使用されると、React.createRef()
は、current
の属性として最下位のDOM要素を受信し、ref
を作成する.②ref
がカスタムクラスコンポーネントに使用される場合、ref
オブジェクトは、そのコンポーネントがマウントされたインスタンスをcurrent
として受信する.③インスタンスがないため、関数形式のコンポーネントにref
を使用することはできません.demo
次のコードは、
ref
属性のノードへの参照を格納します.class CustomTextInput extends React.Component{
constructor(props){
super(props);
// ref textInput DOM
this.textInput = React.createRef();
this.focusTextInput = this.focusTextInput.bind(this);
}
focusTextInput(){
// api text
// current dom
this.textInput.current.focus();
}
render(){
// React input ref textInput
return(
)
}
}
ReactDOM.render(
,document.getElementById('root')
)
Reactは、コンポーネントのロード時にDOM要素を
current
のプロパティに転送し、コンポーネントのアンインストール時にnull
に戻り、ref
の更新はcomponentDidMounted
とcomponentDidUpdate
のライフサイクルフックの前に発生します.クラスコンポーネントにrefを追加
上の
CustomTextInput
をパッケージして、マウント後すぐにクリックされるのをシミュレートしたい場合は、ref
を使用してカスタム入力にアクセスし、focusTextInput
メソッドを手動で呼び出すことができます.class AutoFocusTextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = React.createRef();
}
componentDidMount() {
this.textInput.current.focusTextInput();
}
render() {
return (
);
}
}
なお、この方法は、
class
を使用して宣言されたコンポーネントにのみ有効である.Refsと関数コンポーネント
関数コンポーネントにはインスタンスがないため、
ref
プロパティを関数コンポーネントに使用することはできません.ref
またはstate
および他の宣言サイクルメソッドを使用する場合は、関数コンポーネントをclass
宣言コンポーネントに変換する必要があります.注意:DOMまたは
ref
コンポーネントを指す限り、関数コンポーネントの内部でclass
を使用できます.function CustomTextInput(props){
// textInput, ref
let textInput = null;
function handleClick(){
textInput.focus();
}
return (
{textInput=input}}/>
)
}
親コンポーネントへのDOMノードの露出
ごく少数の場合、親コンポーネントから子コンポーネントのノードにアクセスしたい場合があります.コンポーネントのパッケージを破壊するため、通常は推奨されません.しかし、たまにフォーカス後者をトリガしてサブノードdomのサイズまたは位置を測定するために使用することもできる.
サブコンポーネントにrefを追加できますが、domノードではなくコンポーネントインスタンスしか取得できないため、この方法は関数コンポーネントでは無効です.
React 16.3以上を使用する場合は、ref転送を推奨します.Ref転送は、コンポーネントが自分のrefを露出するようにサブコンポーネントのrefを露出させることができ、親コンポーネントにサブコンポーネントをどのように露出させるかのDOMノードについて、ref転送ドキュメントに詳細な例がある.
React 16.2以下を使用するか、ref転送よりも柔軟性が必要な場合は、この代替案を使用してrefを特殊な名前のpropとして直接伝えることができます.
できればDOMノードの露出はお勧めしませんが、時には命の藁になることがあります.これらのスキームには、サブコンポーネントにコードを追加する必要があります.サブコンポーネントの実装に制御権がない場合は、残りの選択は
findDOMNode()
を使用しますが、推奨されません.コールバックrefs
Reactはまた、
ref
を設定する別の方法をサポートし、 ref
と呼ばれ、ref
をいつ設定および削除するかをより細かく制御することができる.これは、
createRef
で作成されたref
のプロパティとは異なり、「コールバックref」は、Reactコンポーネントのインスタンスを受信する関数、またはhtml内のdom要素をパラメータとして格納し、他の場所にアクセスするために格納する関数を渡します.demo:
ref
コールバック関数を使用して、インスタンスのプロパティにdomノードへの適用を格納します.
class CustomTextInput extends React.Component{
constructor(props){
super(props);
this.textInput = null;
this.setTextInputRef=element=>{
this.textInput=element;
}
this.focusTextInput=()=>{
if(this.textInput) this.textInput.focus();
}
}
componentDidMount(){
//
this.focusTextInput();
}
render(){
// ref text dom react
return(
)
}
}
Reactは、コンポーネントのマウント時にdom要素を
ref
のコールバック関数に転送して呼び出し、アンインストール時にnull
に転送して呼び出す.ref
のコールバック関数は、componentDidMount
およびcomponentDidUpdate
のライフサイクル関数が呼び出される前に呼び出されます.refs
で作成したReact.createRef()
オブジェクトを渡すことができるように、コンポーネント間でコールバック形式のrefs
を渡すことができます.function CustomTextInput(props){
return(
)
}
class Parent extends React.Component{
render(){
return(
this.inputElement=el} />
)
}
}
上記の例では、Parentがそのrefコールバック関数をinputRefとしてCustomTextInputに渡し、CustomTextInputがrefプロパティを介して渡します.最終的には、Parentのthis.InputElementは、CustomTextIputの要素に対応するDOMノードに設定されます.
に注意
refコールバックがインライン関数で定義されている場合、更新中に2回呼び出され、最初のパラメータはnullで、その後のパラメータはDOM要素です.これは、レンダリングのたびに新しい関数インスタンスが作成されるためです.したがって,Reactは古いrefをクリーンアップし,新しいものを設定する必要がある.refのコールバック関数をクラスのバインド関数として定義することで、上記の問題を回避できますが、ほとんどの場合は重要ではありません.