-1

Предположим, у меня есть большой HTML-документ с многочисленными компонентами React, встроенными в его части.Группировка большого набора вызовов ReactDOM.render() в корневом компоненте

Например:

<body> 

    <h1 id="react-component-1">...</h1> 
    <p>Static Content</p> 

    <h2> id="react-component-2">...</h2> 
    <img src="static-img" /> 
    <p id="react-component-3">...</h3> 

</body> 

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

Сейчас мое приложение работает так:

function renderPage(data) { 
    ReactDOM.render(<Component {...data} />, document.getElementById("react-component-1")); 
    ReactDOM.render(<Component {...data} />, document.getElementById("react-component-2")); 
    ReactDOM.render(<Component {...data} />, document.getElementById("react-component-3")); 
} 

renderPage() призывается успех АЯКСА запроса. Это делает мои компоненты обновленными по своему усмотрению, и это выглядит довольно эффектно.

Однако было бы гораздо приятнее, если бы у меня был компонент React, который обрабатывал состояние приложения, и сместил изменения в data в качестве реквизита.

Я не могу создать компонент root, потому что не все на моей странице динамическое, мне нужно сохранить статическое содержимое между компонентами React.

Я хотел бы быть в состоянии сделать что-то вроде этого, хотя:

class Root extends React.Component { 

    constructor(props) { 
     super(props); 
     this.data = {...}; 
    } 

    render() { 
     ReactDOM.render(<Component {...this.state.data} />, document.getElementById("react-component-1")); 
     ReactDOM.render(<Component {...this.state.data} />, document.getElementById("react-component-2")); 
     ReactDOM.render(<Component {...this.state.data} />, document.getElementById("react-component-3"));   
    } 

    return false; 
} 

Можно ли использовать Реагировать таким образом? Сначала я не знаю, как это будет возможно, потому что ReactDOM ожидает, что элемент будет отображать компоненты в, что позволит очистить мой статический контент, когда я отрисую свой корневой компонент. Теперь я думаю, что могу просто сделать new Root(), но мне еще предстоит проверить это.

Еще одна возможность, о которой я только думал, заключалась в том, чтобы поддерживать функцию renderPage() и называть ее ONCE, а не каждый раз, когда загружается AJAX. Затем каждый компонент будет прослушивать настраиваемое событие, которое запускается с успехом AJAX, который содержит новые данные. Это кажется медленнее, хотя ... И я мог бы также использовать Redux для состояния приложения.

+0

Это неправильный способ реагирования, все дело в том, что у вас есть модульные компоненты, которые вы можете использовать снова и снова. Вы должны подумать о том, какие типы компонентов у вас есть, h1, h2, & p из вышеперечисленного как отдельные компоненты, как только у вас есть передача статических данных, поскольку реквизиты - это путь. Проверьте это: https://facebook.github.io/react/docs/thinking-in-react.html – JordanHendrix

+0

Я знаю, как React предназначен для использования. Нет никаких признаков того, что в моем примере кода существуют негибкие или избыточные компоненты. К сожалению, вам не хватает. Пример использования здесь заключается в том, что не все содержимое на странице может быть React. Есть много элементов, которые не будут носить динамический характер, но я хотел бы обернуть все в компонент уровня корня, чтобы я мог использовать жизненный цикл компонента, чтобы обновить реквизиты моих динамических элементов. – lostPixels

+0

Умм, это именно то, что я сказал ... поставьте нединамический материал в реагирующем компоненте ... вам не нужно использовать реквизиты, вы можете просто поместить контент по своему усмотрению: точно так же, как и ответ ниже. Это не перекресток, а то, как это делается. Это лучшая практика для того, о чем вы просите. И, как говорится в ответе, вы находитесь в мире обид, если эта вещь растет, и вы должны ее изменить. – JordanHendrix

ответ

3

Невозможно использовать метод компонента React для вызова ReactDOM.render, как это делается в вашем примере Root. Метод компонента render может возвращать либо действительный элемент React (например, <div />), либо null и не должен выполнять никаких мутаций, таких как изменение DOM и т. Д. Если компоненту React необходимо выполнить некоторые DOM-мутации, это должен делать это из крючков жизненного цикла, таких как ComponentDidMount или ComponentDidUpdate.

Чтобы ответить на ваш вопрос, зависит от того, может ли ваш статический контент быть включен в компонент React или нет.

Если вы можете, который был бы идеальным, вы можете реорганизовывать свой код, чтобы иметь Root компонент следующим образом:

class Root extends React.Component { 
    render() { 
     return (
      <Component data={ this.props.data } /> 
      <p>Static Content</p> 
      <Component data={ this.props.data } /> 
      <img src="static-img" /> 
      <Component data={ this.props.data } /> 
     ); 
    } 
} 

и иметь один вызов ReactDOM.render:

ReactDOM.render(<Root data={ data } />, document.getElementById('my-react-mounting-point')); 

Если у вас нет, то есть если вам необходимо, чтобы иметь разные деревья рендеринга, ваш текущий a pproach в порядке. Однако если вы это сделаете, будьте осторожны, чтобы позвонить по телефону ReactDOM.unmountComponentAtNode, когда вам больше не нужен компонент, или вы можете столкнуться с проблемами утечки памяти. У этого article from React's blog есть несколько приятных советов о мерах предосторожности, которые необходимо использовать при использовании различных деревьев визуализации + шаблон ReactComponentRenderer, чтобы избежать распространенных ошибок.

+0

Спасибо за ваш ответ, это перекресток, в котором я оказался. Было бы много дополнительной работы по восстановлению статического контента как JSX. Я немного беспокоился о том, чтобы несколько раз называть ReactDOM.render() на одних и тех же компонентах, но кажется, что он работает отлично и использует Virtual DOM, чтобы он мог различать то, что нужно заменить. – lostPixels

+0

@lostPixels ok. Я добавил ссылку с некоторыми советами об этом – VonD