2017-07-13 6 views
0

リアクションを使用して、ユーザーがアクションを完了したときに通知カードとして機能するコンポーネントをビルドしています。動作は次のようになります。JSを使用してX秒後に消える通知カードを作成するが、ホバー上でタイマーがリセットされる

ユーザーがフォーラムに投稿を作成すると、そのカードは下部に表示され、修正されます。ユーザーが4秒間ホバーしないと、ユーザーはそれを表示しなくなります。それらの上にマウスを置くと、タイマーはリセットされ、マウスがカードを離れると、タイマーは再び4からカウントダウンします。ここで

は、ロジックのための私の関連するコードです:

let elem = document.getQuerySelector('card'); 

let loop = (el) => { 
    let timer = setTimeout(() => { 
     hide(); 
    }, duration); 

    el.addEventListener('mouseover',() => { 
     clearTimeout(timer); 
     el.addEventListener('mouseout',() => { 
      // let elClone = el.cloneNode(true); 
      // el.parentNode.replaceChild(elClone, el); 
      loop(el); 
     }); 
    }); 

} 

loop(elem) 

このコードは動作しますが、それは要素に冗長なイベントリスナの不必要な量を取り付けてしまいます。私は、要素を複製して置き換えることによって、マウスアウト後にすべてのイベントリスナーを削除しようとしましたが、それは私のためには機能しませんでした。代わりにこの方法を使用しても、カードはまったく消えません。

+0

おそらく、状態を使用すると、これを達成するための選択肢が増える可能性があります。誰かがこれに答えることができなければ、私はこれを打ち、返信します。 –

答えて

1

については、mouseentermouseoutを使用すると、リスナーを追加するだけで動作します。

let elem = document.querySelector('card'); 

let loop = (el) => { 
    let timer = setTimeout(() => { 
     hide(); 
    }, duration); 

    el.addEventListener('mouseenter',() => { 
     clearTimeout(timer); 
    }); 

    el.addEventListener('mouseout',() => { 
     // let elClone = el.cloneNode(true); 
     // el.parentNode.replaceChild(elClone, el); 
     timer = setTimeout(()=>{hide()}, duration); 
    }); 
} 

loop(elem) 
+0

Reactでこれを行う必要はないと思うが、彼らは設定イベントリスナーの選択肢があると思う。しかし、間違っている可能性があります。 –

+0

コードを少し編集して、ループを再帰的に呼び出さないようにしました。ただし、Reactには関連していませんが、ロジックの基本については、複数のイベントリスナーの登録は避けてください。 –

+0

これは完璧です。私は州@DanielZuzevichを使うことについても考えなかったが、それもうまくいっただろう。私はこの答えがずっと簡単だと思います。 –

関連する問題