Как объединить обработчики событий, представленные как значения ключей в объектах

Есть компонент react Component который содержит объект ownedEventHandlersс обработчиком события. При вызове компонента Component в него передается еще один объект handlers с обработчиками. Моя задача состоит в том, что бы объединить функционал колбеков, находящихся в объектах ownedEventHandlers и handlers. Например в функции mergeHandlers

const handlers = {
onClick: (e) => do something else,
}

const Component = ({handlers}) => {

  const ownedEventHandlers = {
    onClick: (e) => do something,
  }

  const mergeHandlers = (ownedEventHandlers, handlers) => {
   функция должна объединить функционал колбеков.

     return {
       onClick: (e) => {
         выполнить функционал из колбека из объекта `handlers`
         выполнить функционал из колбека из объекта 
                                            `ownedEventHandlers`
       }
     }
  }
  return(
    <button {...mergeHandlers(ownedEventHandlers, handlers)}) />
      
}

Функция mergeHandlers должна выглядеть примерно так:

const mergeHandlers = (ownedEventHandlers, addedEventHandlers) => {
    const _ownedEventHandlers = { ...ownedEventHandlers };
    
    if (!addedEventHandlers || Object.keys(addedEventHandlers).length === 0) {
      return _ownedEventHandlers;
    }
    const keyAddedEventHandlers = Object.keys(addedEventHandlers);
    for (const handl in ownedEventHandlers) {
      if (ownedEventHandlers.hasOwnProperty(handl)) {
        for (let i = 0; i < keyAddedEventHandlers.length; i++) {
          if (handl === keyAddedEventHandlers[i]) {
// В этом месте нужно объединить функционалы двух обработчиков onClick
            console.log('нужно объединение');
          } else {
            _ownedEventHandlers[keyAddedEventHandlers[i]] = addedEventHandlers[keyAddedEventHandlers[i]];
          }
        }
      }
    }
    console.log('_ownedEventHandlers', _ownedEventHandlers);
    return _ownedEventHandlers;
  };

Есть вариант в исходном объекте с обработчиками ownedEventHandlers значением ключа делать функцию которая будет вызывать другие функции это го же события например так:

const ownedEventHandlers = {
    onClick: (e) => {
     (() => do something)()
    }
  }

и добавлять обработчики в неё, но не представляю как это сделать. Прошу поделиться идеями по этому поводу. Заранее благодарю.


Ответы (1 шт):

Автор решения: Dmitriy Prigulnov

На сообщество надейся а сам не бездельничай!!! Вот и я решил свой вопрос. Функция которая объединяет функционал обработчиков выглядит так:

const concatenatesEventHandlers = (ownedEventHandlers, addedEventHandlers) => {
    const _ownedEventHandlers = { ...ownedEventHandlers };
    if (!addedEventHandlers || Object.keys(addedEventHandlers).length === 0) {
      return _ownedEventHandlers;
    }
    const keyAddedEventHandlers = Object.keys(addedEventHandlers);
    for (const handl in ownedEventHandlers) {
      if (ownedEventHandlers.hasOwnProperty(handl)) {
        for (let i = 0; i < keyAddedEventHandlers.length; i++) {
          if (handl === keyAddedEventHandlers[i]) {
**Ниже в трёх строчках я создаю функцию которая по очереди вызывает обработчики**
            const concatFunc = (e) => {
              ownedEventHandlers[handl]();
              addedEventHandlers[keyAddedEventHandlers[i]](e);
            };
**Присваиваю функцию `concatFunc` обработчику в смёрженом объекте**
            _ownedEventHandlers[keyAddedEventHandlers[i]] = concatFunc;
          } else {
            _ownedEventHandlers[keyAddedEventHandlers[i]] = addedEventHandlers[keyAddedEventHandlers[i]];
          }
        }
      }
    }
    return _ownedEventHandlers;
  };

Возможно мой опыт будет кому то полезным.

Если у более опытных товарищей будут замечания по моему коду прошу высказаться. Для меня это важно.

→ Ссылка