usyninis
@usyninis
react-эксперт

Как правильно рендерить множество компонентов в приложении на React JS?

Здравствуйте. Собираю приложение при помощи gulp + browserify + react + jquery.
Допустим, я написал компонент "select" на react, который используется несколько раз на странице с разными свойствами.
Вместо того, чтобы рендерить компонент на каждый div:
React.render(
  <Select prop="value1" />,
  document.getElementById("select1")
);
React.render(
  <Select prop="value2" />,
  document.getElementById("select2")
);
...
React.render(
  <Select prop="valueN" />,
  document.getElementById("selectN")
);


Я решил сделать функию рендеринга в главном файлe main.js приложения:
// подключаем компоненты
var components = {};
var app = {}; // сюда помещаются отрендеренные компоненты, правильно ли так ?
components.Programm= require('./programm'); 
components.CardComments = require('./card'); 
components.Select= require('./select'); 

//функция рендеринга компонентов на странице, свойства берутся из атрибутов data-*
function initComponents() {

 	var components_wrap = document.getElementsByClassName("js-component");
  
	Array.prototype.forEach.call(components_wrap, function(element) {
		var c = element.getAttribute("component");
		var data = element.dataset;
		var component = components[c];		
		
		 app[c] = React.render(React.createElement(component,data),element);
		
	}); 
}

// по готовности документа рендерим
$(function() { 
    initComponents();		
});


Теперь, чтобы компонент появился на странице, мы в HTML пишем:
<div class="js-component" component="Select" data-prop="значение свойства 1 "></div>
<div class="js-component" component="Programm" data-id="123"></div>


Все это, чтобы я мог просто в шаблоне указывать компонент с параметрами, без постоянного переписывания JS файлов.
Но свойства уже приходят со строковым типом из атрибута даты. Как лучше строить приложение в этом случае? Может что-то я упустил, пытался найти как это реализовывают, но не получилось. Буду благодарен за советы и помощь.
  • Вопрос задан
  • 2044 просмотра
Решения вопроса 1
@psyhO_octopus
Если нет возможности полностью перейти на реакт то этот вариант вполне рабочий. Только данные лучше передавать в одном дата атрибуте, так вы сможете запихнуть туда JSON, например, если данные виджета рендерятся на сервере. Ну и добавить проверок наличия компонента и прочего тоже бы не помешало. Плюс надо реализовать функцию которая так же бы уничтожала компоненты. И плюс параметр контекста. Например, если вы открываете попап и там есть компоненты которые надо отрисовать вам не нужно пробегать по всей странице, достаточно искать их только в попапе
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы