प्रतिक्रिया पर क्लिक करें और निवारण () लिंक ताज़ा / पुनर्निर्देशित?


84

मैं प्रतिक्रिया के साथ एक लिंक दे रहा हूँ:

render: ->
  `<a className="upvotes" onClick={this.upvote}>upvote</a>`

फिर, ऊपर मेरे पास अपवोट फंक्शन है:

upvote: ->
  // do stuff (ajax)

लिंक से पहले मेरे पास उस स्थान पर स्पैन था, लेकिन मुझे लिंक करने के लिए स्विच करने की आवश्यकता है और यहां परेशानी है - हर बार जब मैं .upvotesपृष्ठ पर क्लिक करता हूं तो वह ताज़ा हो जाता है, मैंने अब तक क्या कोशिश की है:

event.preventDefault () - काम नहीं कर रहा है।

upvote: (e) ->
  e.preventDefault()
  // do stuff (ajax)

event.stopPropagation () - काम नहीं कर रहा है।

upvote: (e) ->
  e.stopPropagation()
  // do stuff (ajax)

झूठे लौटना - काम नहीं करना।

upvote: (e) ->
  // do stuff (ajax)
  return false

मैंने भी अपने index.html में jQuery का उपयोग करके उपरोक्त सभी की कोशिश की है, लेकिन कुछ भी काम नहीं करता है। मुझे यहां क्या करना चाहिए और मैं क्या कर रहा हूं? मैंने Event.type की जाँच की है और ऐसा clickलगता है कि मुझे लगता है कि मुझे किसी भी तरह अनुप्रेषित करने से बचना चाहिए?

माफ करना, जब मैं रिएक्ट की बात करता हूं तो मैं बदमाश हूं।

धन्यवाद!


1
क्या आप कार्यों के लिए es2015 सिंटैक्स का उपयोग करने की कोशिश कर रहे हैं?
erichardson30

आप किस प्रकार के घटक बना रहे हैं? राज्यविहीन? createClass?
निशानथोमास

क्या आप इस बात की पुष्टि कर सकते हैं कि onClick वास्तव में हिट है upvote? यह एक संदर्भ मुद्दा हो सकता है।
thangngoc89

1
उपयोग करेंpreventDefault
onmyway133

1
e.PreventDefault () अकेले मेरे लिए काम किया (प्रतिक्रिया 16.0.0-beta5)
felix-b

जवाबों:


68

रिएक्ट इवेंट वास्तव में सिंथेटिक इवेंट हैं, न कि नेटिव इवेंट। जैसा कि यहाँ लिखा गया है :

ईवेंट प्रतिनिधिमंडल: रिएक्ट वास्तव में ईवेंट हैंडलर को नोड्स में संलग्न नहीं करता है। जब प्रतिक्रिया शुरू होती है, तो यह एकल ईवेंट श्रोता का उपयोग करके शीर्ष स्तर पर सभी घटनाओं के लिए सुनना शुरू कर देता है। जब किसी घटक को माउंट या अनमाउंट किया जाता है, तो ईवेंट हैंडलर्स को केवल आंतरिक मैपिंग से जोड़ा या हटाया जाता है। जब कोई घटना होती है, तो रिएक्ट जानता है कि इस मैपिंग का उपयोग करके इसे कैसे भेजा जाए। जब मैपिंग में कोई इवेंट हैंडलर नहीं बचता है, तो रिएक्ट के ईवेंट हैंडलर सरल नो-ऑप्स होते हैं।

उपयोग करने का प्रयास करें Event.stopImmediatePropagation:

upvote: (e) ->
  e.stopPropagation();
  e.nativeEvent.stopImmediatePropagation();

74

समाधान का एक पूर्ण संस्करण onClick, ई पास करने और देशी e.preventDefault () का उपयोग करते हुए विधि को ऊपर ले जाएगा।

upvotes = (e, arg1, arg2, arg3 ) => {
    e.preventDefault();
    //do something...
}

render(){
    return (<a type="simpleQuery" onClick={ e => this.upvotes(e, arg1, arg2, arg3) }>
      upvote
    </a>);
{

क्या e.preventDefault () के बीच अंतर है; Beggining या समारोह के अंत में किया जा रहा है? इसे कहां रखा जाना चाहिए?
सरथिस स्टॉर्महैमर

मुझे लगता है कि शुरुआत में इसका इस्तेमाल करना बेहतर है
रोमन

यह बुरी प्रथाएं हैं, कृपया एक तीर के कार्यों के बारे में पढ़ें और .bind(this)एक प्रतिक्रिया ऐप में बिन संदर्भ के लिए। उदाहरण के लिए: medium.freecodecamp.org/…
Joyful

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

सावधान रहें कि यदि आप e.preventDefault () को कॉल करने से पहले एक रेंडरिंग (जैसे राज्य को बदलकर) ट्रिगर करते हैं तो इसका कोई प्रभाव नहीं होगा। तो बेहतर यह है कि घटना हैंडलर के पहले बयान के रूप में।
थिम एनीनेस

16

कोशिश बाँध (यह) तो आपके कोड नीचे की तरह दिखता है -

 <a className="upvotes" onClick={this.upvote.bind(this)}>upvote</a>

या यदि आप निर्माण में es6 प्रतिक्रिया घटक में लिख रहे हैं तो आप ऐसा कर सकते हैं

constructor(props){
   super(props);
   this.upvote = this.upvote.bind(this);
}

upvote(e){   // function upvote
   e.preventDefault();
   return false

}

9
इससे कोई फर्क नहीं पड़ता। आप अपवोट हो रहे हैं क्योंकि लोगों के पास thisइवेंट हैंडलर है और पूरी तरह से अलग मुद्दा है।
दिमित्र नेस्टोरोव

8

रेंडर: -> <a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>


1
यह बुरी प्रथाएं हैं, कृपया एक तीर के कार्यों के बारे में पढ़ें और .bind(this)एक प्रतिक्रिया ऐप में बिन संदर्भ के लिए। उदाहरण के लिए: medium.freecodecamp.org/…
Joyful

createReactClass या ऑटोबाइंडिंग या npm पैकेज 'ऑटो-बाइंड' का उपयोग करें
xjinjin

6

इस तरह एक संदर्भ में

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

जैसा कि आप देख सकते हैं, आपको स्पष्ट रूप से निवारण () कॉल करना होगा। मुझे लगता है कि यह डॉक्स मददगार हो सकता है।


2

एक अच्छा और सरल विकल्प जो मेरे लिए काम करता था:

<a href="javascript: false" onClick={this.handlerName}>Click Me</a>

यह बहुत कम है। मैं तुम्हें चूमने के लिए यदि आप बुरा नहीं करना चाहती। आपने मुझे बहुत सारी चीजों से बचाया सर। फार्म तत्व के action="javascript: false"लिए भी काम कर रहा है।
OzgurBagci

1
@OzgurBagci ऊपर की विधि का उपयोग करके रीसेंट में चेतावनी को हाल के संस्करणों में फेंक देगा। यह अब काम कर सकता है, लेकिन शायद लंबे समय तक काम नहीं करेगा। संभवतः एक वैकल्पिक विधि खोजने के लिए सबसे अच्छा है, खासकर अगर रिएक्ट के अधिक वर्तमान संस्करण का उपयोग कर।
डेविड

1

इसका कारण यह है कि उन हैंडलर गुंजाइश को संरक्षित नहीं करते हैं। प्रतिक्रिया प्रलेखन से: प्रतिक्रिया प्रलेखन

"नो ऑटोबाइंडिंग" अनुभाग देखें। आपको हैंडलर लिखना चाहिए: onClick = () => {}


1

मैंने जो गिस्ट पाया और मेरे लिए काम किया:

const DummyLink = ({onClick, children, props}) => (
    <a href="#" onClick={evt => {
        evt.preventDefault();
        onClick && onClick();
    }} {...props}>
        {children}
    </a>
);

क्रेडिट के लिए srph https://gist.github.com/srph/020b5c02dd489f30bfc59138b7c39b53


1
क्या मैं सुझाव देता हूं कि onClickएक पारित प्रोप्रेशन नाम के रूप में उपयोग न करें, लेकिन handleClickइसके बजाय कुछ ऐसा ? यह भ्रामक है, अन्य कम अनुभवी डेवलपर्स सोच सकते हैं कि यह घटक के लिए वास्तविक संलग्न घटना है, जबकि यह नहीं है। इसके अलावा, इसके साथ, आप हर बार एक नया फ़ंक्शन बना रहे हैं, भले ही घटक फिर से प्रस्तुत करता हो, भले ही वह समान प्रॉप्स प्राप्त कर रहा हो। इसे एक बुरा अभ्यास माना जाता है।
elQueFaltaba

0

यदि आप चेकबॉक्स का उपयोग करते हैं

<input 
    type='checkbox'
    onChange={this.checkboxHandler}
/>

stopPropagation और stopImmediatePropagation काम नहीं करेंगे।

क्योंकि आपको onClick = {this.checkboxHandler} का उपयोग करना होगा


0

यदि आप रिएक्ट राउटर का उपयोग कर रहे हैं, तो मेरा सुझाव है कि रिएक्ट-राउटर-बूटस्ट्रैप लाइब्रेरी की तलाश करें, जिसमें एक आसान घटक लिंककोर्नर है। यह घटक डिफ़ॉल्ट पृष्ठ पुनः लोड होने से रोकता है ताकि आपको घटना से निपटना न पड़े।

आपके मामले में यह कुछ इस तरह दिख सकता है:

import { LinkContainer } from 'react-router-bootstrap';

<LinkContainer to={givePathHere}>
    <span className="upvotes" onClick={this.upvote}>upvote</span>
</LinkContainer>

0

मुझे एंकर टैग के साथ और preventDefaultअतीत में कुछ परेशानी हुई है और मैं हमेशा भूल जाता हूं कि मैं क्या गलत कर रहा हूं, इसलिए यहां मुझे पता चल गया है।

मेरे पास अक्सर यह समस्या होती है कि मैं घटक की विशेषताओं को अन्य रिएक्ट घटकों के साथ सीधे नष्ट करके उन्हें एक्सेस करने का प्रयास करता हूं । यह काम नहीं करेगा, पृष्ठ फिर से लोड होगाe.preventDefault() : यहां तक ​​कि

function (e, { href }) {
  e.preventDefault();
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

ऐसा लगता है कि विनाशकारी एक त्रुटि ( Cannot read property 'href' of undefined) का कारण बनता है जो कंसोल को प्रदर्शित नहीं किया जाता है, शायद पृष्ठ पूर्ण पुनः लोड होने के कारण। चूंकि फ़ंक्शन त्रुटि में है, इसलिए preventDefaultकॉल नहीं किया जाता है। यदि href # है, तो कोई वास्तविक पुनः लोड नहीं होने के कारण त्रुटि ठीक से प्रदर्शित होती है।

अब मैं समझता हूं कि मैं केवल कस्टम रिएक्ट घटकों पर एक दूसरे हैंडलर तर्क के रूप में विशेषताओं का उपयोग कर सकता हूं, देशी HTML टैग्स पर नहीं । तो निश्चित रूप से, एक घटना में HTML टैग विशेषता तक पहुँचने के लिए, यह तरीका होगा:

function (e) {
  e.preventDefault();
  const { href } = e.target;
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

मुझे उम्मीद है कि यह मेरे जैसे अन्य लोगों को त्रुटियों को न दिखा कर मदद करता है!


0

मुझे इस पृष्ठ पर आने पर मेरे लिए सही या काम करने के लिए उल्लिखित विकल्पों में से कोई भी नहीं मिला। उन्होंने मुझे चीजों को परखने के लिए विचार दिए और मैंने पाया कि यह मेरे लिए काम करता है।

dontGoToLink(e) {
  e.preventDefault();
 }

render() {
  return (<a href="test.com" onClick={this.dontGoToLink} />});
}

0

इन विधियों में से किसी ने भी मेरे लिए काम नहीं किया, इसलिए मैंने इसे CSS के साथ हल किया:

.upvotes:before {
   content:"";
   float: left;
   width: 100%;
   height: 100%;
   position: absolute;
   left: 0;
   top: 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.