2016-12-14 2 views
2

У меня есть класс машинопись, который простирается React.Component:Получение ссылки на класс экземпляра компонента

class MyComponent extends React.Component<{}, {}> 
{ 
    constructor(props: {}) 
    { 
     super(props); 
    } 

    public render() 
    { 
     return <span>Test</span>; 
    } 

    public MyMethod() { 
     console.log("Working fine"); 
    } 
} 

Тогда есть место, где я вручную нужно создать экземпляр и прикрепить это к DOM:

var component = MyComponent; 
var element = React.createElement(component, {}, null); 
ReactDOM.render(element, myDomElementContainer); 

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

React.createElement только позволяет мне предоставить класс, а ReactDOM.render не нравится объект, созданный вручную.

Что мне нужно для создания пользовательского компонента, присоединения его к DOM и получения ссылки на экземпляр класса компонента?

ответ

3

У вас есть несколько вариантов:

(1) Использование возвращаемого значения ReactDOM.render:

var element = ReactDOM.render(<MyComponent />, myDomElementContainer); 

(2) Использование React.createElement:

var element = React.createElement(MyComponent); 
ReactDOM.render(element); 

(3) Использовать refs:

var element; 
ReactDOM.render(<MyComponent ref={el => element = el } />, myDomElementContainer); 

Экземпляр будет присвоен element, когда был показан экземпляр MyComponent.

+0

Ах, возвращаемое значение ReactDOM.render было ключевым. Хотя, похоже, это отличается от React.createElement, который не возвращает ожидаемый экземпляр. – Alex

+0

Что возвращает 'React.createElement'? Должен быть элемент реакции –

+0

Я не знаю, какой тип должен быть, но это совсем не то же самое, что и объект, который я получаю от ReactDOM.render. Он просто содержит такие вещи, как 'target',' _store', '_owner',' _self' 'props' и т. Д. Это не экземпляр моего класса компонентов. – Alex

0

Похоже, вы используете React.js таким образом, что используете jQuery, и это не нормально. На самом деле, я не могу представить себе случая, который требует таких действий; и я подозреваю, что вы не должны этого делать. Пожалуйста, (1) используйте jsx для создания компонентов, (2) используйте refs для поиска компонента в этом jsx. Как

... 

x(){ 
    this.refs.c.style={color:'blue'} 
} 

render() { 
    return <div ref='c' style={{border:'1px solid red', height:10}} onClick={this.x.bind(this)}/> 
} 
+0

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

+0

Наличие таких ссылок вам не поможет, так как React создает новые узлы после изменений реквизита/состояния - я имею в виду, React изменяет/заменяет элементы DOM, чтобы разрешить обновление дерева DOM после изменений реквизита/состояния - и ссылки, которые у вас будут, будут бесполезны рано или поздно , –

+0

Да, но экземпляр класса компонента тем не менее. – Alex

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