親コンテナー上でマウスオーバーするとアクティブになるスクリプトを作成し、その子要素をマウスから離す必要があります。私は現在それを機能させていますが、コードのいくつかの部分は、REACTコードがどのように見えるべきかと矛盾しているようです。特に2つの部分。
レンダー関数でカウンターを使用して、各スパンが正しいカスタムプロパティを取得できるようにしています。
state.customProperties
これは、親要素のマウスオーバー時にカスタムプロパティを更新する配列です。render() { let counter = 0; const returnCustomProp = function(that) { counter++; let x = 0; if (that.state.customProperties[counter - 1]) { x = that.state.customProperties[counter - 1].x; } let y = 0; if (that.state.customProperties[counter - 1]) { y = that.state.customProperties[counter - 1].y; } return "customProperty(" + x + " " + y + ")"; } return ( <div onMouseMove={this._testFunction} id="ParentContainer"> <section custom={returnCustomProp(this)}> <b>Custom content for part 1</b> <i>Could be way different from all the other elements</i> </section> <section custom={returnCustomProp(this)}> 2 </section> <section custom={returnCustomProp(this)}> <div> All content can differ internally so I'm unable to create a generic element and loop trough that </div> </section> <section custom={returnCustomProp(this)}> 4 </section> <section custom={returnCustomProp(this)}> 5 </section> <section custom={returnCustomProp(this)}> <div> <b> This is just test data, the actualy data has no divs nested inside secions </b> <h1> 6 </h1> </div> </section> <section custom={returnCustomProp(this)}> 7 </section> <section custom={returnCustomProp(this)}> 8 </section> </div> ); }
私が使用
document.getElementById
しquerySelectorAll
ているmousemove関数では、すべてのセクション要素を取得し、マウスからのマウス座標をセクション要素の座標と比較しています。var mouseX = e.pageX; var mouseY = e.pageY; var spans = document.getElementById('ParentContainer').querySelectorAll('section'); var theRangeSquared = 10 * 10; var maxOffset = 5; var newCustomProperties = []; for (var i = 0; i < spans.length; i++) { var position = spans[i].getBoundingClientRect(); var widthMod = position.width / 2; var heightMod = position.height / 2; var coordX = position.x + widthMod; var coordY = position.y + heightMod + window.scrollY; // Distance from mouse var dx = coordX - mouseX; var dy = coordY - mouseY; var distanceSquared = (dx * dx + dy * dy); var tx = 0, ty = 0; if (distanceSquared < theRangeSquared && distanceSquared !== 0) { // Calculate shift scale (inverse of distance) var shift = maxOffset * (theRangeSquared - distanceSquared) / theRangeSquared; var distance = Math.sqrt(distanceSquared); tx = shift * dx / distance; ty = shift * dy / distance; } newCustomProperties.push({ x: tx, y: ty }); }
私はこれについてすべて間違っていると感じています。returnCustomProp
上記の要素のプロパティを返す汎用関数を保持しながら、カウンターをどのように回避できるかわかりません(ライブコードでは、これらの要素が約200あるため、手動で配列項目番号を設定することは効率的ではありません)。 。
2番目の部分は、実際のコンポーネント内にあるIDで要素をターゲットにするのはハッキーです。DOMをトラバースせずにこれをターゲットにできるはずです。セクション要素を参照することは解決策になる可能性がありますが、参照は最小限に留めるべきであり、実際のコードは数百のこれらのセクションで構成されています。
コードは、custom="customProperty(0 0)"
プロパティを更新するよりも多くのatmを実行しません。これは、マウスオーバー時に要素インスペクターを介して行われることがわかります。
<section>
render関数内の要素を数えることなく、また使用することなく、この機能を動作させることができdocument.querySelectorAll
ますか?
this.parentContainer
ところでエラーが発生した場合は、this.ParentContainer
大文字にする必要があります)。let counter
レンダー関数の内部を使用する必要があることを回避するにはどうすればよいですか?