2016-06-02 1 views
2

Если у меня есть класс, как это, содержащий createDocument метод:вызова метод экземпляра из высшего компонента порядка в реакции

class Sine extends Component { 
    createDocument() { 
    console.log('in createDocument'); 
    } 

    render(el, props) { 
    return (
     <div className="row"> 
      <div className="row"> 
      <h1>Sine Wave</h1> 
      <div id="sine" ref="sine"/> 
      </div> 
     </div> 
    ); 
    } 
} 

export default ResizeComponent(Sine); 

И у меня есть высший компонент порядка, как это:

export var ResizeComponent = ComposedComponent => class extends Component { 
    componentDidMount() { 
    this.createDocument(); // undefined 
    } 

    render() { 
    return <ComposedComponent {...this.props}/>; 
    } 
}; 

Как могу ли я вызвать метод экземпляра из класса, который завернут из компонента более высокого порядка?

+0

Почему не просто вызов componentDidMount быть обернутой компонента? то есть 'Sine' в этом случае. – ctrlplusb

+0

Вы пытаетесь передать значения 'this.createDocument()' из HOC? В вашем примере нет причин, по которым компонент Sine не должен иметь только 'componentDidMount() {this.createDocument(); } 'сам по себе. – ctrlplusb

ответ

1

Если вы хотите вызвать метод экземпляра просто создать ref обратный вызов обернутой компоненты и доступ к нему там.

export var ResizeComponent = ComposedComponent => class extends Component { 
    onMounted(node) { 
    node.createDocument(); 
    } 
    render() { 
    return <ComposedComponent 
       ref={(node) => this.onMounted(node)} 
       {...this.props}/>; 
    } 
}; 

Однако, чтобы избежать использования refs можно также передать пропеллер к вашему завернутые Sine решить, если вы хотите позвонить createDocument() на componentDidMount

+0

Приятный трюк! Но это работает только тогда, когда компонент монтируется. Он не решает, как вызвать метод экземпляра из компонента более высокого порядка в реакции. –

1

HOC не может этого сделать. Тем не менее, если вы хотите, чтобы функция из HOC была доступна в упакованном компоненте, вы можете передать ее через реквизиты.

В противном случае, чтобы решить дело, использовать наследование:

class ResizeComponent extends React.Component{ 
    componentDidMount() { 
     this.createDocument(); 
    } 
}; 

class Sine extends ResizeComponent{ 
    createDocument() { 
     console.log('in createDocument'); 
    } 

    render() { 
     return (
      <div className="row"> 
       <div className="row"> 
        <h1>Sine Wave</h1> 
        <div id="sine" ref="sine"/> 
       </div> 
      </div> 
     ); 
    } 
} 
+0

', но эти функции должны быть переданы через реквизиты, что неверно. –

+0

Ho? Пожалуйста, предоставьте скрипту, чтобы доказать, что это не так. Спасибо :) –

+0

неправильное предложение, я должен сказать, что это не 100% истинно, так как HOC не должен «передавать» реквизиты упакованным компонентам, они могут добавлять функциональные возможности, не передавая обратные вызовы, например. HOC, который определяет, произошло ли нажатие за пределами завернутого компонента. –

Смежные вопросы