অভিভাবক নোডগুলির সাথে যোগাযোগের জন্য কাস্টম ইভেন্টগুলি প্রতিক্রিয়া জানায় j


85

CustomEventপ্যারেন্ট নোডগুলিতে যোগাযোগ করার জন্য আমি সাধারণ DOM এর জন্য তৈরি এবং শুনছি :

সন্তানের মধ্যে:

  var moveEvent = new CustomEvent('the-graph-group-move', { 
    detail: {
      nodes: this.props.nodes,
      x: deltaX,
      y: deltaY
    },
    bubbles: true
  });
  this.getDOMNode().dispatchEvent(moveEvent);

পিতামাতায়:

componentDidMount: function () {
  this.getDOMNode().addEventListener("the-graph-group-move", this.moveGroup);
},

এটি কাজ করে, তবে এমন কোনও প্রতিক্রিয়া-নির্দিষ্ট উপায় কি আরও ভাল হবে?


7
প্রতিক্রিয়া উপায় হ'ল কলব্যাকগুলি বাচ্চাদের কাছে প্রপসগুলির মাধ্যমে স্পষ্টভাবে পাঠানো - <Child onCustomEvent={this.handleCustomEvent} />। প্রতিক্রিয়া কাস্টম ইভেন্ট ডাব্লু / বুদবুদ জন্য কোন সমর্থন নেই।
andreypopp

16
সুতরাং, ইভেন্টগুলি পরিবর্তে কলব্যাকগুলি বুদবুদ করবেন? যুক্তিযুক্ত মনে হয়।
ফরেস্টো

23
@ ফোরেস্টো কট্টর প্রেম, +1
ক্রিস্টফ

13
আমি বিদ্রূপ করছি না।
ফরেষ্টো

4
এটি একটি জিনিস যা একটি সর্বোত্তম অনুশীলন সেট করে, একটি কার্যকর প্যাটার্ন প্রতিরোধের জন্য পুরোপুরি আরেকটি। টুইটার .github.io/flight - যা সিন্থেটিক ইভেন্টগুলিকে বুদ্বুদ ও প্রচার করতে ডোমেভেন্টসকে ব্যবহার করে - এর মত বিপরীতে ।
দিমিতর ক্রিস্টফ

উত্তর:


50

উপরে উল্লিখিত:

প্রতিক্রিয়া উপায় হ'ল কলব্যাকগুলি বাচ্চাদের কাছে প্রপসগুলির মাধ্যমে স্পষ্টভাবে পাঠানো -। প্রতিক্রিয়া কাস্টম ইভেন্ট ডাব্লু / বুদবুদ জন্য কোন সমর্থন নেই।

প্রতিক্রিয়াশীল প্রোগ্রামিং বিমূর্তিটি অরথোগোনাল:

পর্যবেক্ষক প্যাটার্নের মাধ্যমে প্রোগ্রামিং ইন্টারেক্টিভ সিস্টেমগুলি কঠোর এবং ত্রুটি-প্রবণ এখনও অনেক উত্পাদন পরিবেশে বাস্তবায়ন মান is প্রতিক্রিয়াশীল প্রোগ্রামিং বিমূর্তকরণের পক্ষে পর্যবেক্ষককে পর্যায়ক্রমে হ্রাস করার জন্য আমরা একটি দৃষ্টিভঙ্গি উপস্থাপন করি। বেশ কয়েকটি লাইব্রেরি স্তর প্রোগ্রামারগুলিকে কলব্যাকগুলি থেকে আরও ঘোষিত প্রোগ্রামিং মডেলটিতে বিদ্যমান কোডটি সহজেই স্থানান্তরিত করতে সহায়তা করে।

প্রতিক্রিয়া দর্শনের পরিবর্তে কমান্ড প্যাটার্ন উপর ভিত্তি করে:

এখানে চিত্র বর্ণনা লিখুন

তথ্যসূত্র


9
প্রতিক্রিয়াতে কাস্টম সিন্থেটিক ইভেন্টগুলির জন্য কেন সমর্থন নেই সে বিষয়ে আমি আগ্রহী। এগুলি কি কেবল কার্যকর হয় যে এগুলি কখনই কার্যকর করা হয়নি, বা তাদের কেন কার্যকর করা হয়নি তার কোনও বৈধ নকশার সিদ্ধান্ত আছে ?. গোটো স্টেটমেন্টের মতো ঘটনাগুলি কি ক্ষতিকারক হিসাবে বিবেচিত?
মাইকেল বাইলস্ট্রা

4
@MichaelBylstra কাস্টম ঘটনা কারণে উপর একটি নাটের গুরু হয় ক্লাসিক ইস্যু : a class of debugging problems where you don't know what triggers some code because of a long chain of events triggering other eventsকমান্ড প্যাটার্ন সঙ্গে একমুখী তথ্য প্রবাহ দর্শন প্রতিক্রিয়া হয়।
পল সুইট

4
প্রতিক্রিয়া প্রসঙ্গে, (রেডাক্স, প্রতিক্রিয়া রাউটার, ইত্যাদি সমস্ত প্রসঙ্গ ব্যবহার করে) দ্বারা পূর্বপুরুষের দ্বারা ইনজেকশনের ডেটাস্টোরের সাথে উপাদানগুলি যোগাযোগ করার বিষয়টি বিবেচনা করে, এটি সম্পূর্ণরূপে বলা যায় যে কোনও প্রসঙ্গে প্রাসঙ্গিক কোনও ক্রিয়াকলাপের মাধ্যমে কোনও পূর্বপুরুষের কাছে ফোন করা ঠিক নয় og অহংকারী প্রতিক্রিয়া। রেডাক্সকে "প্রেরণ" "" ক্রিয়া "অবজেক্টের সাথে কল করা এবং" ইভেন্ট "অবজেক্টের সাথে প্রসঙ্গে একটি" ইভেন্ট হ্যান্ডলার "বলার মধ্যে কোনও পার্থক্য নেই।
অ্যান্ডি

4
কিছু লোক যেভাবে রেডাক্সকে ব্যবহার করে (যেমন রিডেক্স-সাগা উন্মাদনা)
অ্যান্ডি

আমি পয়েন্টটি পেয়েছি তবে আমার একটি প্রশ্ন আছে। আসুন ধরে নেওয়া যাক যে একটি ইউআই-কিট লাইব্রেরি তৈরি করবে যা লক্ষ্য একাধিক আর্কিটেকচার জুড়ে নির্বিঘ্নে কাজ করার জন্য। কিছু উপাদানগুলির কাস্টম ইভেন্টগুলি প্রেরণের প্রয়োজন হতে পারে কারণ আমরা অজানা আর্কিটেকচার সম্পর্কে কিছুই অনুমান করতে পারি না। প্রতিক্রিয়া দ্বারা করা কঠোর অনুমান একটি বড় ইস্যুতে ফলাফল দেয়। আপনি এখানে সমস্যাটি দেখতে পারেন ( কাস্টম-উপাদানসমূহ- প্রতিটি স্থান ডটকম ): প্রতিক্রিয়া হ'ল একমাত্র গ্রন্থাগার যা কাস্টম ইভেন্টগুলি সঠিকভাবে পরিচালনা করতে পারে না। হতে পারে, আমি কিছু মিস করছি এবং কোনও পরামর্শ খুব প্রশংসিত হবে।
7uc4

7

আপনি একটি সাধারণ পরিষেবা লিখতে পারেন এবং তারপরে এটি ব্যবহার করতে পারেন

/** eventsService */
module.exports = {
  callbacks: {},

  /**
   * @param {string} eventName
   * @param {*} data
   */
  triggerEvent(eventName, data = null) {
    if (this.callbacks[eventName]) {
      Object.keys(this.callbacks[eventName]).forEach((id) => {
        this.callbacks[eventName][id](data);
      });
    }
  },

  /**
   * @param {string} eventName name of event
   * @param {string} id callback identifier
   * @param {Function} callback
   */
  listenEvent(eventName, id, callback) {
    this.callbacks[eventName][id] = callback;
  },

  /**
   * @param {string} eventName name of event
   * @param {string} id callback identifier
   */
  unlistenEvent(eventName, id) {
    delete this.callbacks[eventName][id];
  },
};

উদাহরণ (ট্রিগার জন্য একই)

import eventsService from '../../../../services/events';
export default class FooterMenu extends Component {
  componentWillMount() {
    eventsService
      .listenEvent('cart', 'footer', this.cartUpdatedListener.bind(this));
  }

  componentWillUnmount() {
    eventsService
      .unlistenEvent('cart', 'footer');
  }

  cartUpdatedListener() {
    console.log('cart updated');
  }
}

5

আপনি কলব্যাকের মাধ্যমে ঘটনাগুলি বুদ্বুদ করতে পারতেন প্রসঙ্গে উপস্থাপিত হয়ে : [কোডপেন]

import * as React from 'react';

const MyEventContext = React.createContext(() => {});

const MyEventBubbleContext = ({children, onMyEvent}) => {
  const bubbleEvent = React.useContext(MyEventContext);
  const handleMyEvent = React.useCallback((...args) => {
    // stop propagation if handler returns false
    if (onMyEvent(...args) !== false) {
      // bubble the event
      bubbleEvent(...args);
    }
  }, [onMyEvent]);
  return (
    <MyEventContext.Provider value={handleMyEvent}>
      {children}
    </MyEventContext.Provider>
  );
};

const MyComponent = () => (
  <MyEventBubbleContext onMyEvent={e => console.log('grandparent got event: ', e)}>
    <MyEventBubbleContext onMyEvent={e => console.log('parent got event: ', e)}>
      <MyEventContext.Consumer>
        {onMyEvent => <button onClick={onMyEvent}>Click me</button>}
      </MyEventContext.Consumer>
    </MyEventBubbleContext>
  </MyEventBubbleContext>
);

export default MyComponent;

3

আমি আরও একটি পেয়েছি যা বেশ যুক্তিসঙ্গত পাশাপাশি বিশেষত যদি বাবা-মা থেকে বাচ্চা পর্যন্ত ছিদ্র ছিদ্র ইতিমধ্যে জটিল হয়ে ওঠে। তিনি একে কম সহজ যোগাযোগ বলেছিলেন। লিঙ্কটি এখানে:

https://github.com/ryanflorence/react-training/blob/gh-pages/lessons/04-less-simple-communication.md


এটি মূলত "অবজারভার প্যাটার্নটি প্রয়োগ করুন" বলছে। আমি ওপি সম্পর্কে মাইকেল বাইলস্ট্রার মন্তব্যের সাথে একমত, আমি কম সরল যোগাযোগে উল্লিখিত সমস্যাটিকে "ড্রিলিং হোল" হিসাবে বর্ণনা করছি ... বুদবুদ না করে কলব্যাকগুলি> 1 স্তরের গভীর কাঠামো পরিচালনা করে না।
এরিকোসো

3

একটি সম্ভাব্য সমাধান, যদি আপনাকে অবশ্যই অবশ্যই একটি রিএ্যাকটিজে অ্যাপ্লিকেশনটিতে পর্যবেক্ষক প্যাটার্নটি অবলম্বন করতে হয় তবে আপনি একটি সাধারণ ইভেন্ট হাইজ্যাক করতে পারেন। উদাহরণস্বরূপ, যদি আপনি মুছুন কীটি মুছে <div>ফেলার জন্য চিহ্নিত করা হয়েছে, এমন <div>একটি কীডাউন ইভেন্টের জন্য আপনি শুনতে পারেন যা একটি কাস্টম এভেন্ট দ্বারা আমন্ত্রণ জানানো হবে। শরীরে customEventকীডাউনটি ফাঁদে ফেলুন এবং নির্বাচিতগুলিতে একটি কীডাউন ইভেন্ট প্রেরণ করুন <div>। এটি কাউকে সহায়তা করে যদি ভাগ করে নেওয়া।


3

সেন্ট্রাল স্টোর [রেডাক্স] যা ক্লায়েন্টদের রাজ্য বিতরণ করে, তারপরে দোকানে 'প্রেরণ' স্টেটটি ব্যাক আপ পর্যন্ত পর্যবেক্ষক বিন্যাসের মতো। প্রকাশের / সাবস্ক্রাইব করার একটি উপায় কেবল সুস্পষ্ট (ভঙ্গুর?) ওভারহেড সংযোগকারী প্রপস / ইভেন্ট পাথগুলির কারণে আরও খারাপ হয়। শ্রেণিবদ্ধ প্রতিক্রিয়ার মাধ্যমে হ্যাক করার জন্য প্রসঙ্গ (সরবরাহকারী প্যাটার্ন) বা দুর্গন্ধযুক্ত পর্যবেক্ষণযোগ্য লাইব্রেরি সরবরাহ করে। মোবিএক্সের মতো যা নতুন সজ্জিত @ অবজার্ভেবল, বা ভিউ যা নতুন টেম্পলেট সিনট্যাক্স "ভি-ইফ" প্রবর্তন করে। ইভেন্টগুলি ডিওএম এবং জাভাস্ক্রিপ্ট ইভেন্ট লুপটি যেভাবেই হোক কাজ করে, তাই কেন নয়? আমি মনে করি শয়তানবাদীরা এটি করেছিল। হাঃ হাঃ হাঃ


1

আমি বুঝতে পারি এই প্রশ্নটি এখনই বেশ পুরানো, তবে এই উত্তরটি এখনও কাউকে সাহায্য করতে পারে। আমি প্রতিক্রিয়ার জন্য একটি জেএসএক্স প্রগমা লিখেছি যা ঘোষিত কাস্টম ইভেন্ট যুক্ত করে: জেএসএক্স-নেটিভ-ইভেন্টগুলি

মূলত আপনি onEvent<EventName>ইভেন্টগুলি দেখার জন্য কেবল প্যাটার্নটি ব্যবহার করেন ।

<some-custom-element onEventSomeEvent={ callback }></some-custom-element>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.