ReactのDOM操作
5675 ワード
場合によっては、通常のデータ・ストリームの外で子を強制的に変更する必要があります.変更する子は、Reactコンポーネントインスタンスであってもよいし、DOM要素であってもよい.このとき、DOMを操作するためにrefsを使用します.
シーンの操作
以下に、refsを使用するのに適したいくつかの状況を示します.処理フォーカス、テキスト選択またはメディア制御 トリガ強制アニメーション サードパーティ製DOMライブラリ を統合
宣言式で実現できる場合は、refsの使用はできるだけ避けます.Dialogコンポーネントに直接open()とclose()メソッドを露出しないで、isOpenプロパティを渡すことが望ましいことに注意してください.
ref
reactは、任意のコンポーネントに特殊なプロパティを追加することをサポートします.refプロパティは、コンポーネントがロードまたはアンインストールされるとすぐに実行されるコールバック関数を受け入れます.コンポーネントmountの後にrefを取得することに注意してください.componentWillMountと最初のrenderでは取得できません.componentDidMountでのみ取得できます.
html要素
HTML要素にref属性を追加すると、refコールバックは最下位のDOM要素をパラメータとして受信します.reactコンポーネントは、ロード時にDOM要素をrefのコールバック関数に転送し、アンインストール時にnullに転送します.refコールバックは、componentDidMountまたはcomponentDidUpdateのライフサイクルコールバックの前に実行されます.
もっと短い書き方は以下の通りです.
クラスコンポーネント
ref属性がclass宣言のカスタムコンポーネントを使用するために使用される場合、refのコールバックはロードされたReactインスタンスを受信する.
なお,この方法はclass宣言のCustomTextInputにのみ有効である.
関数コンポーネント
インスタンスがないため、関数コンポーネントでrefプロパティを使用することはできません.
親コンポーネントへのDOMノードの露出
サブノードに特殊な属性を露出すると、サブノードは関数属性を取得し、それをref属性としてDOMノードに付加します.これにより、親は中間部品を介してrefを子のDOMノードにコールバックすることができる.
上記の例では、Parentはそのrefコールバックを特殊なinputRefとしてCustomTextInputに渡し、CustomTextInputはref属性を介してそれを渡す.最終的には、Parentのthis.InputElementは、CustomTextInputの要素に対応するDOMノードに設定されます.
非管理コンポーネント
ステータス更新ごとにイベントハンドラを記述するのではなく、制御されたコンポーネントを記述するには、refを使用してDOMからフォーム値を取得します.注意、e.target.valueはreactをバインドすることなくDOM値を取得する.
非制御コンポーネントは実際のデータをDOMに保存するので、非制御コンポーネントを使用する場合、Reactコードと非Reactコードを同時に統合することが容易になります.
デフォルト
Reactのライフサイクルでは、フォーム要素のvalueプロパティがDOMの値を上書きします.制御されていないコンポーネントを使用する場合は、通常、Reactは初期値を指定できますが、後続の更新は制御されません.この問題を解決するには、valueではなくdefaultValue属性を指定します.
同様に、defaultCheckedをサポートし、defaultValueをサポートします.
ReactDOM
react-domというパッケージは、DOMに対する方法を提供し、アプリケーションのトップドメインで呼び出すことも、必要に応じてReactモデルから飛び出す出口として使用することもできる.しかし、ほとんどのコンポーネントはこのパッケージを使用する必要はありません.render() unmountComponentAtNode() findDOMNode()
render()
react要素をレンダリングし、提供されたcontainerにあるDOM要素に追加し、このコンポーネントの参照を返します(または、ステータスなしコンポーネントに対してnullを返します).このreact要素がcontainerにレンダリングされている場合、このコードは更新され、要素の最新の状態を反映するために必要なDOM要素だけが変更されます.
unmountComponentAtNode()
マウントされたReactコンポーネントをDOM要素から除去し、イベントプロセッサとstateをクリアします.コンテナにコンポーネントがマウントされていない場合、この関数は何もしません.コンポーネントがアンインストールされている場合はtrueを返し、アンインストール可能なコンポーネントがない場合はfalseを返します.
findDOMNode()
このコンポーネントがDOMにマウントされている場合、関数は対応するブラウザで生成されたDOM要素を返します.この関数は、フォームの値やDOM要素のサイズなど、DOMから値を読み込む必要がある場合に便利です.ほとんどの場合、findDOMNodeという関数の使用を完全に回避するために、DOMノードへの参照を追加できます.renderがnullまたはfalseを返すとfindDOMNodeもnullを返します
新しいref
バージョン16.3以前、Reactにはrefを提供する2つの方法がありました.文字列とコールバックです.文字列の方法に問題があるので、公式にはコールバックを使用してrefを使用することをお勧めします.現在導入されているcreateRef APIは、公式には欠点のないrefを使う方式であり、コールバック方式も道を譲ることができると言われています.
なお、styleComponentsを使用してスタイル化された要素が露出するインタフェースは、refではなくinnerRefである
シーンの操作
以下に、refsを使用するのに適したいくつかの状況を示します.
宣言式で実現できる場合は、refsの使用はできるだけ避けます.Dialogコンポーネントに直接open()とclose()メソッドを露出しないで、isOpenプロパティを渡すことが望ましいことに注意してください.
ref
reactは、任意のコンポーネントに特殊なプロパティを追加することをサポートします.refプロパティは、コンポーネントがロードまたはアンインストールされるとすぐに実行されるコールバック関数を受け入れます.コンポーネントmountの後にrefを取得することに注意してください.componentWillMountと最初のrenderでは取得できません.componentDidMountでのみ取得できます.
html要素
HTML要素にref属性を追加すると、refコールバックは最下位のDOM要素をパラメータとして受信します.reactコンポーネントは、ロード時にDOM要素をrefのコールバック関数に転送し、アンインストール時にnullに転送します.refコールバックは、componentDidMountまたはcomponentDidUpdateのライフサイクルコールバックの前に実行されます.
class CustomTextInput extends React.Component {
constructor(props) {
super(props);
this.focus = this.focus.bind(this);
}
focus() {
this.textInput.focus();
}
render() {
return(
{ this.textInput = input; }} />
)
}
}
もっと短い書き方は以下の通りです.
ref={ input => this.textInput = input }
クラスコンポーネント
ref属性がclass宣言のカスタムコンポーネントを使用するために使用される場合、refのコールバックはロードされたReactインスタンスを受信する.
class AutoFocusTextInput extends React.Component {
componentDidMount() {
this.textInput.focusTextInput();
}
render() {
return (
{ this.textInput = input; }} />
);
}
}
なお,この方法はclass宣言のCustomTextInputにのみ有効である.
関数コンポーネント
インスタンスがないため、関数コンポーネントでrefプロパティを使用することはできません.
親コンポーネントへのDOMノードの露出
サブノードに特殊な属性を露出すると、サブノードは関数属性を取得し、それをref属性としてDOMノードに付加します.これにより、親は中間部品を介してrefを子のDOMノードにコールバックすることができる.
function Custom TextInput(props) {
return(
)
}
class Parent extends React.Component {
render() {
return (
this.inputElement = el }
/>
)
}
}
上記の例では、Parentはそのrefコールバックを特殊なinputRefとしてCustomTextInputに渡し、CustomTextInputはref属性を介してそれを渡す.最終的には、Parentのthis.InputElementは、CustomTextInputの要素に対応するDOMノードに設定されます.
非管理コンポーネント
ステータス更新ごとにイベントハンドラを記述するのではなく、制御されたコンポーネントを記述するには、refを使用してDOMからフォーム値を取得します.注意、e.target.valueはreactをバインドすることなくDOM値を取得する.
class NameForm extends React.Component {
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleSubmit(event) {
alert("A name was submitted:" + this.input.value);
event.preventDefault();
}
render() {
return(
);
}
}
非制御コンポーネントは実際のデータをDOMに保存するので、非制御コンポーネントを使用する場合、Reactコードと非Reactコードを同時に統合することが容易になります.
デフォルト
Reactのライフサイクルでは、フォーム要素のvalueプロパティがDOMの値を上書きします.制御されていないコンポーネントを使用する場合は、通常、Reactは初期値を指定できますが、後続の更新は制御されません.この問題を解決するには、valueではなくdefaultValue属性を指定します.
render() {
return(
);
}
同様に、defaultCheckedをサポートし、defaultValueをサポートします.
ReactDOM
react-domというパッケージは、DOMに対する方法を提供し、アプリケーションのトップドメインで呼び出すことも、必要に応じてReactモデルから飛び出す出口として使用することもできる.しかし、ほとんどのコンポーネントはこのパッケージを使用する必要はありません.render() unmountComponentAtNode() findDOMNode()
render()
ReactDOM.render(
element,
container,
[callback]
)
react要素をレンダリングし、提供されたcontainerにあるDOM要素に追加し、このコンポーネントの参照を返します(または、ステータスなしコンポーネントに対してnullを返します).このreact要素がcontainerにレンダリングされている場合、このコードは更新され、要素の最新の状態を反映するために必要なDOM要素だけが変更されます.
unmountComponentAtNode()
ReactDOM.unmountComponentAtNode(container)
マウントされたReactコンポーネントをDOM要素から除去し、イベントプロセッサとstateをクリアします.コンテナにコンポーネントがマウントされていない場合、この関数は何もしません.コンポーネントがアンインストールされている場合はtrueを返し、アンインストール可能なコンポーネントがない場合はfalseを返します.
findDOMNode()
ReactDOM.findDOMNode(component)
このコンポーネントがDOMにマウントされている場合、関数は対応するブラウザで生成されたDOM要素を返します.この関数は、フォームの値やDOM要素のサイズなど、DOMから値を読み込む必要がある場合に便利です.ほとんどの場合、findDOMNodeという関数の使用を完全に回避するために、DOMノードへの参照を追加できます.renderがnullまたはfalseを返すとfindDOMNodeもnullを返します
新しいref
バージョン16.3以前、Reactにはrefを提供する2つの方法がありました.文字列とコールバックです.文字列の方法に問題があるので、公式にはコールバックを使用してrefを使用することをお勧めします.現在導入されているcreateRef APIは、公式には欠点のないrefを使う方式であり、コールバック方式も道を譲ることができると言われています.
class MyComponent extends React.Component { constructor(props) { super(props); this.myRef = React.createRef(); } render() { return
; } }
然后使用current属性,即可获得当前元素 this.myRef.current,典型应用如下所示:
constructor(props) {
super(props);
this.Mask = React.createRef()
this.MenuList = React.createRef()
}
handleClick = () => {
ReactDOM.findDOMNode(this.MenuList.current).classList.toggle("transform-zero")
ReactDOM.findDOMNode(this.Mask.current).classList.toggle("mask-show")
}
なお、styleComponentsを使用してスタイル化された要素が露出するインタフェースは、refではなくinnerRefである