आप कैसे ReactJS में होवर करते हैं? - onMouseLeave तेज होवर ओवर के दौरान पंजीकृत नहीं है


101

जब आप इनलाइन स्टाइल करते हैं, तो आप ReactJS में एक हॉवर ईवेंट या सक्रिय ईवेंट कैसे प्राप्त कर सकते हैं?

मैंने पाया है कि onMouseEnter, onMouseLeave दृष्टिकोण छोटी गाड़ी है, इसलिए उम्मीद है कि इसे करने का एक और तरीका है।

विशेष रूप से, यदि आप एक घटक पर बहुत जल्दी से माउस ले जाते हैं, तो केवल ऑनमैटर ईवेंट पंजीकृत है। OnMouseLeave कभी भी आग नहीं लगाता है, और इस तरह राज्य को अपडेट नहीं कर सकता है ... घटक को प्रकट करने के लिए छोड़ देता है जैसे कि यह अभी भी मँडरा रहा है। मैंने एक ही चीज़ देखी है यदि आप कोशिश करते हैं और ": सक्रिय" सीएसएस छद्म वर्ग की नकल करते हैं। यदि आप वास्तव में तेजी से क्लिक करते हैं, तो केवल ऑनमेडडाउन इवेंट रजिस्टर होगा। OnMouseUp ईवेंट को नजरअंदाज किया जाएगा ... घटक को छोड़कर सक्रिय दिखाई दे रहा है।

यहाँ एक JSFiddle समस्या दिखा रहा है: https://jsfiddle.net/y9swecyu/5/

समस्या से JSFiddle का वीडियो: https://vid.me/ZJEO

कोड:

var Hover = React.createClass({
    getInitialState: function() {
        return {
            hover: false
        };
    },
    onMouseEnterHandler: function() {
        this.setState({
            hover: true
        });
        console.log('enter');
    },
    onMouseLeaveHandler: function() {
        this.setState({
            hover: false
        });
        console.log('leave');
    },
    render: function() {
        var inner = normal;
        if(this.state.hover) {
            inner = hover;
        }

        return (
            <div style={outer}>
                <div style={inner}
                    onMouseEnter={this.onMouseEnterHandler}
                    onMouseLeave={this.onMouseLeaveHandler} >
                    {this.props.children}
                </div>
            </div>
        );
    }
});

var outer = {
    height: '120px',
    width: '200px',
    margin: '100px',
    backgroundColor: 'green',
    cursor: 'pointer',
    position: 'relative'
}

var normal = {
    position: 'absolute',
    top: 0,
    bottom: 0,
    left: 0,
    right: 0,
    backgroundColor: 'red',
    opacity: 0
}

var hover = {
    position: 'absolute',
    top: 0,
    bottom: 0,
    left: 0,
    right: 0,
    backgroundColor: 'red',
    opacity: 1
}

React.render(
    <Hover></Hover>,         
    document.getElementById('container')
)

1
सलाह के लिये धन्यवाद। मैंने इसे अब एक प्रश्न के रूप में लिखा।
HelpMeStackOverflowMyOnlyHope

कृपया समस्या को उजागर करते हुए कुछ कोड उदाहरण जोड़ें (आदर्श रूप से jsFiddle या समकक्ष) क्योंकि यह अभी भी स्पष्ट नहीं है कि समस्या क्या है। "ईवेंट पंजीकृत है" से आपका क्या तात्पर्य है?
वायर्डप्रैरी

@HelpMeStackOverflowMyOnlyHope क्या आप कोई उत्तर चुनना चाहते हैं? stackoverflow.com/a/35619979/1579789 धन्यवाद!
एलोन जीतो

जवाबों:


92

क्या आपने इनमें से कोई भी कोशिश की है?

onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp

SyntheticEvent

इसमें निम्नलिखित का भी उल्लेख है:

रिएक्ट घटनाओं को सामान्य करता है ताकि उनके विभिन्न ब्राउज़रों में सुसंगत गुण हों।

नीचे दिए गए घटना संचालकों को बबलिंग चरण में एक घटना द्वारा ट्रिगर किया गया है। कैप्चर चरण के लिए एक इवेंट हैंडलर को पंजीकृत करने के लिए, कैप्चर को ईवेंट नाम में जोड़ें; उदाहरण के लिए, onClick का उपयोग करने के बजाय, आप कैप्चर चरण में क्लिक इवेंट को संभालने के लिए onClickCapture का उपयोग करेंगे।


4
डॉक्स से onMouseEnter और onMouseLeave का उल्लेख करने के लिए:The onMouseEnter and onMouseLeave events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
P Fuster

39

पिछले जवाब बहुत भ्रामक हैं। इसे हल करने के लिए आपको कोई प्रतिक्रिया-स्थिति की आवश्यकता नहीं है, न ही कोई विशेष बाहरी परिवाद। इसे शुद्ध css / sass के साथ प्राप्त किया जा सकता है:

शैली:

.hover {
  position: relative;

  &:hover &__no-hover {
    opacity: 0;
  }

  &:hover &__hover {
    opacity: 1;
  }

  &__hover {
    position: absolute;
    top: 0;
    opacity: 0;
  }

  &__no-hover {
    opacity: 1;
  }
}

प्रतिक्रिया-घटक

एक सरल Hoverशुद्ध-प्रतिपादन-कार्य:

const Hover = ({ onHover, children }) => (
    <div className="hover">
        <div className="hover__no-hover">{children}</div>
        <div className="hover__hover">{onHover}</div>
    </div>
)

प्रयोग

फिर इसे इस तरह उपयोग करें:

    <Hover onHover={<div> Show this on hover </div>}>
        <div> Show on no hover </div>
    </Hover>

1
आप इस जवाब को पसंद कर सकते हैं: stackoverflow.com/a/50342093/101290
Beau Smith

2
इस सवाल पर यह सबसे अच्छा जवाब है।
उपकरण

20

आप घटक पर और बाहर उपयोग करने के लिए onMouseOver={this.onToggleOpen}और उपयोग कर सकते हैंonMouseOut={this.onToggleOpen}


इसने मेरे लिए पूरी तरह से काम किया, बहुत बहुत धन्यवाद। लेकिन, मैं उस अन्य कार्यों तक कैसे पहुंच सकता हूं, जैसे कि मैं उदाहरण के लिए "onMauseOverFirstTime" मौजूद होगा? आपको वह जानकारी कहां से मिली?
SmoggeR_js

1
@MtgKhaJeskai reactjs.org/docs/events.html यदि आप sth चाहते हैं onMouseOverFirstTime आपको इसे स्वयं बनाना होगा, उदाहरण के लिए, फ़ंक्शन को केवल तभी फायर करें जब आपके राज्य में 'firstMouseOver' सत्य हो और इसे झूठी होने पर सेट करें फंक्शन को एक बार बुलाया गया था।
cubefox

मैंने ढूंदा! आपका बहुत बहुत धन्यवाद! : D
SmoggeR_js

नहीं, यह "onMauseOverFirstTime" फ़ंक्शन में मौजूद नहीं है; लेकिन अगर आप एक ध्वज का उपयोग इस कार्रवाई करने के लिए कर सकते हैं, तो यह आपके राज्यों में जोड़ें "राज्यों: {isFirstTime: झूठी}" "onmouseover" @MtgKhaJeskai में सच और यह
बेहनाम eskandari

12

यदि आप onMouseEnter / onMouseLeave या onMouseDown / onMouseUp बग दिखाते हुए एक छोटा सा डेमो उत्पन्न कर सकते हैं, तो इसे रिएक्टजस के मुद्दों पृष्ठ या मेलिंग सूची में पोस्ट करना उचित होगा, बस सवाल उठाएं और सुनें कि डेवलपर्स को इसके बारे में क्या कहना है।

आपके उपयोग के मामले में, आपको लगता है कि सीएसएस: होवर और: सक्रिय राज्य आपके उद्देश्यों के लिए पर्याप्त होंगे, इसलिए मेरा सुझाव है कि आप उनका उपयोग करें। सीएसएस जावास्क्रिप्ट की तुलना में तेजी से और अधिक विश्वसनीय के आदेश है, क्योंकि यह सीधे ब्राउज़र में लागू किया गया है।

हालाँकि,: होवर और: सक्रिय अवस्था को इनलाइन शैलियों में निर्दिष्ट नहीं किया जा सकता है। आप क्या कर सकते हैं अपने तत्वों को एक आईडी या एक वर्ग का नाम निर्दिष्ट करें और अपनी शैलियों को या तो एक स्टाइलशीट में लिखें, यदि वे आपके आवेदन में कुछ स्थिर हैं, या एक गतिशील रूप से उत्पन्न <style>टैग में हैं।

यहां बाद की तकनीक का एक उदाहरण दिया गया है: https://jsfiddle.net/ors1vos9/


@clusterBuddy मुझे लगता है कि यह JsFiddle या पुस्तकालयों में एक बग है, क्योंकि कोड सही है और उसने ठीक काम नहीं किया है।
तोबिया

10

नोट: यह उत्तर इस प्रश्न के पिछले संस्करण के लिए था जहां प्रश्न पूछने वाला css शैलियों को लागू करने के लिए जावास्क्रिप्ट का उपयोग करने की कोशिश कर रहा था ... जो कि केवल CSS के साथ किया जा सकता है।

एक सरल-सरल cssसमाधान।

बुनियादी शैलियों को लागू करने के लिए, सीएसएस सरल और अधिक प्रदर्शनशील है जो जेएस 99% समय का समाधान करता है। (हालांकि आधुनिक सीएसएस-इन-जेएस समाधान - जैसे। रिएक्ट घटक, आदि - यकीनन अधिक बनाए रखने योग्य हैं।)

इस कोड स्निपेट को कार्रवाई में देखने के लिए इसे चलाएं ...

.hover-button .hover-button--on,
.hover-button:hover .hover-button--off {
  display: none;
}

.hover-button:hover .hover-button--on {
  display: inline;
}
<button class='hover-button'>
  <span class='hover-button--off'>Default</span>
  <span class='hover-button--on'>Hover!</span>
</button>


11
इस सवाल का जवाब नहीं है।
त्सुजिन

@tsujin - ऊपर नोट देखें।
ब्यू स्मिथ

more performant that JS solutions 99% of the timeसच नहीं। इस मिथक पर चर्चा करते हुए लेख पढ़ें। क्या आपके पास कोई स्रोत है?
क्लाउडीयू क्रेन्गा

@ClaudiuCreanga - कृपया इस मिथक को समाप्त करने वाले लेखों से लिंक करें।
ब्यू स्मिथ स्मिथ

1
@ClaudiuCreanga - मैंने स्पष्ट किया है कि आपने जिस वाक्य पर आपत्ति जताई है, वह अधिक संक्षिप्त है।
ब्यू स्मिथ

9

मैं सिर्फ एक ही समस्या पर टकरा गया है जब एक अक्षम बटन पर onMouseLeave घटनाओं के लिए सुन रहा है। अक्षम बटन को लपेटने वाले तत्व पर मूल मूसलीव ईवेंट के लिए सुनकर मैंने इसके चारों ओर काम किया।

componentDidMount() {
    this.watchForNativeMouseLeave();
},
componentDidUpdate() {
    this.watchForNativeMouseLeave();
},
// onMouseLeave doesn't work well on disabled elements
// https://github.com/facebook/react/issues/4251
watchForNativeMouseLeave() {
    this.refs.hoverElement.addEventListener('mouseleave', () => {
        if (this.props.disabled) {
            this.handleMouseOut();
        }
    });
},
render() {
    return (
        <span ref='hoverElement'
            onMouseEnter={this.handleMouseEnter}
            onMouseLeave={this.handleMouseLeave}
        >
            <button disabled={this.props.disabled}>Submit</button>
        </span>
    );
}

यहाँ एक पहेली है https://jsfiddle.net/qfLzkz5x/8/


यह दृष्टिकोण काम नहीं करेगा, क्योंकि विश्वसनीय होने का कोई रास्ता नहीं है onMouseLeave-ईवेंट
ड्रीमपुल

क्या आपने फिडल की जांच की? मेरे लिए ठीक काम करने लगता है, सिवाय इसके कि जब आप माउस निकालते हैं तो यह घटना दो बार फेंकी जाती है।
कोरी डेनियलसन

यह बहुत बार काम करेगा, लेकिन हमेशा नहीं! इस चर्चा को देखें: stackoverflow.com/questions/7448468/…
dreampulse

5

नामक पैकेज styled-componentsइस समस्या को एक ईलीगैंट तरीके से हल कर सकता है ।

संदर्भ

  1. ग्लेन मैडरन - स्टाइलिंग घटकों के साथ स्टाइलिंग रिएक्ट ऐप्स

उदाहरण

const styled = styled.default
const Square = styled.div`
  height: 120px;
  width: 200px;
  margin: 100px;
  background-color: green;
  cursor: pointer;
  position: relative;
  &:hover {
    background-color: red;
  };
`
class Application extends React.Component {
  render() {
    return (
      <Square>
      </Square>
    )
  }
}

/*
 * Render the above component into the div#app
 */
ReactDOM.render(<Application />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js"></script>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>
<div id='app'></div>


2

आप अकेले इनलाइन स्टाइल के साथ नहीं कर सकते। जावास्क्रिप्ट में सीएसएस सुविधाओं को फिर से लागू करने की अनुशंसा न करें हमारे पास पहले से ही एक भाषा है जो इस उपयोग के मामले के लिए बेहद शक्तिशाली और अविश्वसनीय रूप से तेज है - सीएसएस। इसलिए इसका उपयोग करें! बनाया शैली यह सहायता करने के लिए।

npm install style-it --save

कार्यात्मक सिंटैक्स ( JSFIDDLE )

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return Style.it(`
      .intro:hover {
        color: red;
      }

    `,
      <p className="intro">CSS-in-JS made simple -- just Style It.</p>
    );
  }
}

export default Intro;

JSX सिंटेक्स ( JSFIDDLE )

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return (
      <Style>
      {`
        .intro:hover {
          color: red;
        }
      `}

      <p className="intro">CSS-in-JS made simple -- just Style It.</p>
    </Style>
  }
}

export default Intro;

1

रेडियम का प्रयोग करें !

निम्नलिखित उनकी वेबसाइट से एक उदाहरण है:

var Radium = require('radium');
var React = require('react');
var color = require('color');

@Radium
class Button extends React.Component {
  static propTypes = {
    kind: React.PropTypes.oneOf(['primary', 'warning']).isRequired
  };

  render() {
    // Radium extends the style attribute to accept an array. It will merge
    // the styles in order. We use this feature here to apply the primary
    // or warning styles depending on the value of the `kind` prop. Since its
    // all just JavaScript, you can use whatever logic you want to decide which
    // styles are applied (props, state, context, etc).
    return (
      <button
        style={[
          styles.base,
          styles[this.props.kind]
        ]}>
        {this.props.children}
      </button>
    );
  }
}

// You can create your style objects dynamically or share them for
// every instance of the component.
var styles = {
  base: {
    color: '#fff',

    // Adding interactive state couldn't be easier! Add a special key to your
    // style object (:hover, :focus, :active, or @media) with the additional rules.
    ':hover': {
      background: color('#0074d9').lighten(0.2).hexString()
    }
  },

  primary: {
    background: '#0074D9'
  },

  warning: {
    background: '#FF4136'
  }
};


3
आप इनलाइन शैलियों का उपयोग करके होवर सीएसएस प्रभाव को लागू करने का तरीका दिखा रहे हैं और यह नहीं कि कर्सर के तत्व के ऊपर कोड को मज़बूती से चलाने के लिए कैसे, जो उपयोगकर्ता ने पूछा है।
गन्चर

निश्चित नहीं है कि मेरा उत्तर उस आधार पर स्वीकार क्यों नहीं किया गया।
fkilaiwi

2
@Gunchars " जब आप इनलाइन स्टाइलिंग करते हैं, तो आप ReactJS में एक हॉवर ईवेंट या सक्रिय ईवेंट कैसे प्राप्त कर सकते हैं? " ओपी के सवाल का पहला वाक्य। यह वास्तव में बहुत है कि उसने क्या मांगा।
त्रिकाल

1

मैं onMouseOver और onMouseOut का उपयोग करता हूं। कारण में प्रतिक्रिया

OnMouseEnter और onMouseLeave घटनाओं को साधारण बुदबुदाती के बजाय प्रवेश किए जा रहे तत्व से छोड़ दिया जाता है और कैप्चर चरण नहीं होता है।

यहाँ यह माउस घटनाओं के लिए प्रतिक्रिया दस्तावेज में है


0

मेरे पास ऐसा ही एक मुद्दा था जब onMouseEnter को कॉल किया गया था, लेकिन कभी-कभी इसी onMouseLeave घटना को निकाल नहीं दिया गया था, यहाँ एक वर्कअराउंड है जो मेरे लिए अच्छा काम करता है (यह आंशिक रूप से jQuery पर निर्भर करता है):

var Hover = React.createClass({
    getInitialState: function() {
        return {
            hover: false
        };
    },
    onMouseEnterHandler: function(e) {
        this.setState({
            hover: true
        });
        console.log('enter');

        $(e.currentTarget).one("mouseleave", function (e) {
            this.onMouseLeaveHandler();
        }.bind(this));

    },
    onMouseLeaveHandler: function() {
        this.setState({
            hover: false
        });
        console.log('leave');
    },
    render: function() {
        var inner = normal;
        if(this.state.hover) {
            inner = hover;
        }

        return (
            <div style={outer}>
                <div style={inner}
                    onMouseEnter={this.onMouseEnterHandler} >
                    {this.props.children}
                </div>
            </div>
        );
    }
});

Jsfiddle पर देखें: http://jsfiddle.net/qtbr5cg6/1/


ऐसा क्यों हो रहा था (मेरे मामले में): मैं एक jQuery स्क्रॉल एनीमेशन (के माध्यम से) चला रहा हूं $('#item').animate({ scrollTop: 0 }) आइटम पर क्लिक करते समय ) । इसलिए कर्सर आइटम को "स्वाभाविक रूप से" नहीं छोड़ता है, लेकिन जावास्क्रिप्ट-संचालित एनीमेशन के दौरान ... और इस मामले में ऑनमाउथवेव को रिएक्ट (प्रतिक्रिया 15.3.0, क्रोम 51, डेस्कटॉप) द्वारा ठीक से निकाल नहीं दिया गया था।


0

मुझे पता है कि यह प्रश्न पूछे जाने के बाद से कुछ समय हो गया है, लेकिन मैं सिर्फ onMouseLeave () के साथ असंगतता के एक ही मुद्दे में दौड़ता हूं, मैंने ड्रॉप-लिस्ट के लिए onMouseOut () का उपयोग करने के लिए और पूरे मेनू के लिए माउस छोड़ दिया है, यह है विश्वसनीय और हर बार काम करता है जो मैंने इसका परीक्षण किया है। मैंने डॉक्स में यहां की घटनाओं को देखा: https://facebook.github.io/react/docs/events.html#mouse-events यहां एक उदाहरण है https://www.w3schools.com/bootstrap/bootstrap_dropdowns.asp का उपयोग कर :

handleHoverOff(event){
  //do what ever, for example I use it to collapse the dropdown
  let collapsing = true;
  this.setState({dropDownCollapsed : collapsing });
}

render{
  return(
    <div class="dropdown" onMouseLeave={this.handleHoverOff.bind(this)}>
      <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Dropdown Example
      <span class="caret"></span></button>
      <ul class="dropdown-menu" onMouseOut={this.handleHoverOff.bind(this)}>
        <li><a href="#">bla bla 1</a></li>
        <li><a href="#">bla bla 2</a></li>
        <li><a href="#">bla bla 3</a></li>
      </ul>
    </div>
  )
}

0

मैं व्यक्तिगत रूप से रिएक्ट में इनलाइन-स्टाइल के लिए स्टाइल इट का उपयोग करता हूं या सीएसएस में अपनी शैली अलग से रखता हूं या या एसएएसएस फाइल ...

लेकिन अगर आप वास्तव में इसे इनलाइन करने में रुचि रखते हैं, तो पुस्तकालय को देखें, मैं नीचे दिए गए कुछ अंश साझा करता हूं:

घटक में :

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return (
      <Style>
        {`
          .intro {
            font-size: 40px;
          }
        `}

        <p className="intro">CSS-in-JS made simple -- just Style It.</p>
      </Style>
    );
  }
}

export default Intro;

आउटपुट :

    <p class="intro _scoped-1">
      <style type="text/css">
        ._scoped-1.intro {
          font-size: 40px;
        }
      </style>

      CSS-in-JS made simple -- just Style It.
    </p>


इसके अलावा आप नीचे दिए गए तरीके से अपने सीएसएस में होवर के साथ जावास्क्रिप्ट चर का उपयोग कर सकते हैं:

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    const fontSize = 13;

    return Style.it(`
      .intro {
        font-size: ${ fontSize }px;  // ES2015 & ES6 Template Literal string interpolation
      }
      .package {
        color: blue;
      }
      .package:hover {
        color: aqua;
      }
    `,
      <p className="intro">CSS-in-JS made simple -- just Style It.</p>
    );
  }
}

export default Intro;

और परिणाम नीचे है:

<p class="intro _scoped-1">
  <style type="text/css">
    ._scoped-1.intro {
      font-size: 13px;
    }
    ._scoped-1 .package {
      color: blue;
    }
    ._scoped-1 .package:hover {
      color: aqua;
    }
  </style>

  CSS-in-JS made simple -- just Style It.
</p>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.