Как добавить функции в ReactElement

Я пытаюсь использовать внутреннюю библиотеку Javascript, которая обычно используется для Интернета и которая содержит миллионы строк кода (поэтому я действительно хотел бы использовать ее, а не что-либо менять в ней:D) с React Native.

В этой библиотеке есть некоторые манипуляции с DOM, которые являются абстрагированными, и я пытаюсь заставить абстракцию работать с использованием React Native.

По сути, в Интернете мы передаем HTML-элемент в библиотеку, а библиотека заполняет его другими элементами. Позже, эта библиотека может удалять элементы из дерева или добавлять некоторые, в зависимости от того, что мы говорим, чтобы сделать. Поэтому я хотел бы иметь возможность передать эту библиотеку ReactElement, чтобы React Native автоматически обрабатывал чертежную часть.

Вот что делает библиотека, очень очень упрощенно:

function libraryCode(element) {
    element.append(otherElement);
}
var element = document.createElementNS('div');
libraryCode(element);
return element;

И вот что я хотел бы сделать:

render() {
    var element = React.createElement(Element);
    libraryCode(element);
    return element;
}

Но ReactElement не имеет append функция. Поэтому мне было интересно, есть ли способ добавить функции в ReactElement? Это позволило бы мне создать функцию с именем append, которая добавила бы дочерний элемент и повторно отобразила элемент. Я пытался, и это только для чтения, очевидно. Я хотел расширить класс ReactElement, но как сказать React использовать мой класс вместо ReactElement?

var elem = React.createElement(Element);
elem.append = function() {};

Я также открыт для новых идей, я совершенно новичок в React/React Native, так что, возможно, я ошибаюсь с этим!:)

Спасибо

1 ответ

Решение

Что вам нужно сделать, это использовать React.cloneElement и затем сделайте свое прибавление, передав детей. Это должно позволить вам сделать:

function libraryCode(element, otherElement) {
  return React.cloneElement(element, null, [otherElement]);
}

РЕДАКТИРОВАТЬ

Самое близкое, что я получил, чтобы заставить его работать, но не соответствовал вашим потребностям, это:

var oldCreateElement = React.createElement;
React.createElement = function(...args) {
  let element = Object.assign({}, oldCreateElement(...args));
  element.append = (otherElement) => {
    // Unfortunately you simply can't replace the
    // reference of `element` by the result of this operation
    return React.cloneElement(element, null, [
      React.cloneElement(otherElement, {
        // You must give a `key` or React will give you a warning
        key: Math.random(),
      }),
    ]);
  };
  return element;
};

Это только позволит вам сделать:

var element = React.createElement(Element);
element = element.append(<Text>Hi</Text>);
return element;

Но нет:

var element = React.createElement(Element);
element.append(<Text>Hi</Text>);
return element;

В любом случае, это очень неприлично и НЕ рекомендуется и не одобряется, потому что это требует исправления обезьян.

Другие вопросы по тегам