Динамический компонент с динамическими полями в React - PullRequest
0 голосов
/ 28 октября 2018

Я знаю, что существует множество других вопросов-ответов, связанных с выполнением динамического компонента в реакции.Но в нашем проекте есть другое требование.

Структура нашего проекта выглядит следующим образом:

  • UI (различные модули, такие как пользователь, менеджер, администратор. Эти модули реализованы отдельнои запущен на другом порту) - реализован в React, Redux, Axios и т. д.
  • Nginx
  • Back-End - реализован в Java как API
  • База данных

У нас есть требования, приведенные ниже:

Допустим, в модулях пользовательского интерфейса есть компоненты, указанные ниже:

component1:

  • field1
  • field2
  • field3

component2:

  • field1
  • field2

component3:

  • field1
  • field2
  • field3
  • field4

Нам нужно изменить эти компонентыв соответствии с потребностями клиента (Клиент может быть #n. Не исправлено).

(Мы не хотим каждый раз менять код. Это означает, что когда клиент спрашивает согласно его макету, мыне хочу настраивать код в то время.Можем ли мы разработать какую-либо полезную / конструкторскую схему / методологию, используя которую мы можем выбирать поля для отображения / замены, а все остальное работает как есть?)

customer1:

component1:

  • field1
  • field2
  • cust_field3 (вместо field3)

совершенно новый пользовательский компонент2:

  • cust_field1
  • cust_field2

component3:

  • field1
  • field2
  • cust_field3 (вместо field3)
  • field5 (вместо field4)

customer2:

component1:

  • cust_field1
  • field2
  • field3
  • field4 (новое в этом компоненте для этого клиента)

component2:

  • field1
  • field2
  • field3 (new)

component3 не требуется и полностью удален

Вопросы:

  1. Есть ли в React какой-либо способ разработки такого рода?
  2. Нужно ли реализовывать какую-либо утилиту для выбора компонентов такого типа для клиента?
  3. Нужно ли использовать разные технические стеки или сторонние библиотеки с реагировать?Если таковые имеются, просьба сообщить подробности об этом.
  4. Нужно ли использовать динамический рендеринг с использованием JSON (хранение в любой базе данных) для такого рода требований?
  5. Нужно ли использовать какой-либо другой шаблон проектирования или другой подход?что-нибудь еще?
  6. Сколько усилий нужно для этого?Это действительно сложно реагировать?

Нужна поддержка в этом.Я застрял с этим требованием.

1 Ответ

0 голосов
/ 28 октября 2018

Существует несколько способов достичь этого в React.Основной вопрос заключается в том, можете ли вы изменить код этих компонентов или нет.

В случае, если вы не можете: вам придется создавать новые компоненты в соответствии с потребностями клиента, применяя версию знаменитого «рендеринга с высоким разрешением»".

Если вам нужно это для работы с композицией (композиция предпочтительнее наследования по разным причинам), вам необходимо применить компонент высшего порядка (HOC), который заменяет оригинальный метод рендеринга.Вот одна ссылка, но если вы ищете термин, вы найдете больше вариантов.https://blog.callstack.io/sweet-render-hijacking-with-react-bb2b81d8d9be

Если вы не возражаете, и вам просто нужно, чтобы он работал быстро, перейдите к расширению класса Component1, напишите новый метод рендеринга и пропустите методы, которые не нуждаются в улучшениях.

например,

class Component1v1 extends Component1 {
  render() {
    return(
      {'My old and My new stuff'}
    );
  }
} 

Если вы можете редактировать существующие компоненты, у вас есть несколько способов добиться этого.

Опция 1: условный рендеринг

Не мойчашка чая, но в некоторых случаях это имеет смысл: например,

class Component1 extends React.Component {
  ...
  render() {
    return(
      <input1/>
      <input2/>
      {customer2 && <input3_cust2/> : <input3/>}  
    );
  }
} 

Как правило, нет смысла иметь компоненты, которые нужно редактировать для каждого из вас, поэтому я бы сказалс компонентом-оберткой, который визуализирует другие и увеличивает их способности.Из того, что я могу собрать, лучше оставить большую часть обработки для обертки, чтобы она была последовательной.

Опция 2: Обертка, которая передает дополнительных детей

например

class Component1 extends React.Component {
    render() {
      return(
        <div>
          <input1 onChange={this.props.onChange}/>
          <input2 onChange={this.props.onChange}/>
          {...this.props.children}
        </div>
      );
    }
}

class Wrapper extends React.Component {
  handleChange(e) {
    return null;
  }

  render() {
    return(
      <Component1 onChange={this.handleChange}>
        <input3 onChange={this.handleChange}/>
      </Component1>
    );
  }
}

Пожалуйстаимейте в виду, что это псевдокод, он не будет работать без исправлений

В любом случае, вы можете создавать обертки для каждой или одну обертку для всех в зависимости от ситуации.Вы передаете в качестве «детей» все поля, которые вам нужны, чтобы иметь отношение к вашим клиентам.

Как я упоминал ранее, наличие компонентов, требующих модификации в соответствии с клиентом, не имеет особого смысла, вы, вероятно,нужно потратить некоторое время на группирование и разделение вашего слоя представления и вашей логики так, как вам удобно.Это означает, что вам нужно переопределить ваши компоненты.

...