Как не перерисовать определенные элементы DOM компонента React?

Недавно я начал проводить рефакторинг своего веб-приложения Backbone с помощью React, и я пытаюсь написать интерактивный компонент визуализации графиков, используя response и sigma.js.

Я примерно понял декларативную парадигму React и то, как она реализуется render() метод с использованием синтаксиса JSX.

Но то, что спотыкает меня, - это ситуация, когда я не могу определить свой компонент React декларативно.

Это из-за сгенерированных JavaScript элементов DOM, которые могут быть сгенерированы только на componentDidMount() после того, как декларативные элементы DOM представлены render(),

Это заставляет меня беспокоиться как о производительности, так и об ошибках анимации (мой график анимируется во время создания экземпляра, который будет воспроизводиться на каждом render() звонки в этой ситуации)

Мой текущий код выглядит так:

...

render: function() {
  return (
    <div class="my-graph-visualization-component">
      {/*
          This div is defined declaratively, so won't be re-rendered
          on every `change` events* unless `React`'s diff algorithm 
          think it needs to be re-rendered.
      */}
      <div class="my-declarative-div">{this.props.text}</div>

      {/*
          This div will be filled by javascript after the `render()`
          call. So it will be always cleared and re-rendered on every
          `change` events.
      */}
      <div class="graph-container MY-PROBLEM-DIV"></div>
    </div>
  );
},

componentDidMount: function() {
  this.props.sigmaInstance.render('.graph-container', this.props.graph);
}

...

Есть ли способ сделать что-то вроде

render: function() {
  return (
    <div class="my-graph-visualization-component">
      <div class="my-declarative-div">{this.props.text}</div>

      {/* 
          Any nice workaround to tell react not to re-render specific
          DOM elements? 
      */}
      <div class="graph-container NO-RE-RENDER"></div>
    </div>
  );
},

так что мой компонент графика sigma.js не будет обновляться с идентичной стартовой анимацией на каждом change по штатам?

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

2 ответа

Решение

Самый простой способ - определить подкомпоненты реакции и перерисовать то, что вам действительно нужно, вместо перерисовки всего блока.

render: function() {

    return (
       <div class='myStaticContainerNotupdated'>
           <SubComponentToUpdateOften/>
           <MyGraph/>
       </div>
    )

}

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

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

Надеюсь, поможет

Вы можете использовать опасно SetInnerHTML. Это в основном говорит React держаться подальше от его контента, и он не будет оценивать / обновлять его, когда делает это DOM diffing.

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