Как передать контекст?

83
15 апреля 2021, 09:40

Допустим есть такой React-компонент, вопрос в том, как передать контекст вызова отсюда:

this.benefitPanel = React.createRef();
this.waveBackground = React.createRef();
this.waveBackgroundWrapper = React.createRef();
this.portfolioPanel = React.createRef();
this.animationBG = React.createRef();

В this.animationElements

Видимо из-за неправильного контекста вызова, если попробовать достать DOM элемент таким образом console.log(this.animationElements[0].ElementNode), мы получим null

class App extends React.Component { 
 
  constructor() { 
    super(); 
 
 
    this.benefitPanel = React.createRef(); 
    this.waveBackground = React.createRef(); 
    this.waveBackgroundWrapper = React.createRef(); 
    this.portfolioPanel = React.createRef(); 
    this.animationBG = React.createRef(); 
 
 
    this.animationElements = [{ 
        name: 'benefitPanel', 
        class: 'benefit-panel', 
        ElementNode: this.benefitPanel.current, 
      }, 
      { 
        name: 'waveBackground', 
        class: 'wave-background__item', 
        ElementNode: this.waveBackground.current, 
      }, 
      { 
        name: 'waveBackgroundWrapper', 
        class: 'wave-background', 
        ElementNode: this.waveBackgroundWrapper.current, 
      }, 
      { 
        name: 'portfolioPanel', 
        class: 'portfolio-panel', 
        ElementNode: this.portfolioPanel.current, 
        func: function() { 
          console.log(this); 
        } 
      }, 
 
    ] 
 
 
 
 
 
 
 
  } 
}

Answer 1

Как описано в справке значение свойства current становится доступно после render.

Так как, в приведенном коде обращение к current идет в конструкторе - значение свойства в этот момент - null, и именно это значение записывается в массив.

class App extends React.Component { 
    constructor() { 
      super(); 
      this.ref = React.createRef(); 
      console.log(1, this.ref.current); 
    } 
    componentDidMount() { 
      console.log(3, this.ref.current); 
    } 
    render() { 
      console.log(2, this.ref.current); 
      return ( <div ref = { 
          this.ref 
        } > 1 </div>); 
      } 
    } 
 
    ReactDOM.render(  
      <App /> , 
      document.getElementById('root') 
    );
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> 
<div id="root"></div>

Для решения достаточно сохранять в ElementNode не current, а само поле, например:

ElementNode: this.benefitPanel,

Тогда после render можно будет обратиться к current: ElementNode.current

READ ALSO
Отпимизация скрипта

Отпимизация скрипта

Всем приветсейчас будет очень тупой вопрос

117
Как узнать, какой элемент вызвал функцию?

Как узнать, какой элемент вызвал функцию?

К примеру есть два элемента <input type="range">, которые вызывают одну и туже функцию (с помощью oninput="")В зависимости от того, какой именно input вызвал...

106
Как отправить Post запрос на js без библиотек?

Как отправить Post запрос на js без библиотек?

Я хочу отправить сообщение от сообщества вкКак составить на js пост запрос аналогичный ссылке

109