Как передать аргументы в callback функцию

Есть компонент react App. Он принимает объект settingsObjс callbac функцией:

export const settingsObj = {
  handlers: {
    onClick: (e, dispatch) => {
      console.log('сработал клик из settingsObj', e);
      dispatch('привет из dispatch');
    }
  }
}

объединяет его функционал с функционалом callbac который находится в handlers внутри компонента App при помощи функции concatenatesEventHandlers и получившийся callbac присваивает кнопке button.

const concatenatesEventHandlers = (
  ownedEventHandlers,
  addedEventHandlers,
  dispatch
) => {
  const _ownedEventHandlers = { ...ownedEventHandlers };
  if (!addedEventHandlers || Object.keys(addedEventHandlers).length === 0) {
    return _ownedEventHandlers;
  }
  const keyAddedEventHandlers = Object.keys(addedEventHandlers);
  // функция объединяет функционал обработчиков (собственного и переданного eventHandlers)
  for (const handl in ownedEventHandlers) {
    if (ownedEventHandlers.hasOwnProperty(handl)) {
      for (let i = 0; i < keyAddedEventHandlers.length; i++) {
        if (handl === keyAddedEventHandlers[i]) {
          const concatFunc = (e, dispatch) => {
            ownedEventHandlers[handl]();
            addedEventHandlers[keyAddedEventHandlers[i]](e, dispatch);
          };
          _ownedEventHandlers[keyAddedEventHandlers[i]] = (e, dispatch) =>
            concatFunc(e, dispatch);
        } else {
          _ownedEventHandlers[keyAddedEventHandlers[i]] =
            addedEventHandlers[keyAddedEventHandlers[i]];
        }
      }
    }
  }
  return _ownedEventHandlers;
};

Код на codesandbox https://codesandbox.io/s/compassionate-sun-wgtn4h?file=/src/data.js

Проблема заключается в том, что когда я пытаюсь передать функцию для callbac из settingsObj, в данном случае dispatch, то она (dispatch) всегда undefined внутри callbac в объекте settingsObj. Подскажите пожалуйста где я ошибся?

PS ошибка появляется при клике на кнопку "кликни меня".


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

Автор решения: Grundy

Если убрать лишний код станет заметно, что параметр dispatch нигде не используется

const concatenatesEventHandlers = (
  ownedEventHandlers,
  addedEventHandlers,
  dispatch
) => {
  ...
  const concatFunc = (e, dispatch) => {
    ownedEventHandlers[handl]();
    addedEventHandlers[keyAddedEventHandlers[i]](e, dispatch);
  };
  _ownedEventHandlers[keyAddedEventHandlers[i]] = (e, dispatch) =>
  concatFunc(e, dispatch);
  ...
};

Чтобы стало еще понятнее, достаточно переименовать параметр

const concatenatesEventHandlers = (
  ownedEventHandlers,
  addedEventHandlers,
  dispatch
) => {
  ...
  const concatFunc = (e, secondArg) => {
    ownedEventHandlers[handl]();
    addedEventHandlers[keyAddedEventHandlers[i]](e, secondArg);
  };
  _ownedEventHandlers[keyAddedEventHandlers[i]] = (e, secondArg) =>
  concatFunc(e, secondArg);
  ...
};

Для решения достаточно удалить лишний параметр из добавляемых обработчиков, в этом случае будет замыкаться параметр приходящий в функцию concatenatesEventHandlers

const concatenatesEventHandlers = (
  ownedEventHandlers,
  addedEventHandlers,
  dispatch
) => {
  ...
  const concatFunc = (e) => {
    ownedEventHandlers[handl]();
    addedEventHandlers[keyAddedEventHandlers[i]](e, dispatch);
  };
  _ownedEventHandlers[keyAddedEventHandlers[i]] = (e) =>
  concatFunc(e, dispatch);
  ...
};
→ Ссылка