没有ref的反应组分的目标dom元素

时间:2016-11-12 08:04:53

标签: javascript reactjs

我在我的项目中安装了一个名为react-geosuggest的react组件。我需要在<label>组件中找到<Geosuggest> dom元素,并向onClick插入<label>处理程序。有没有办法定位<label>代码而不改变<Geosuggest>组件的代码。

这是JSX

render() {
return (
<div>
  <Geosuggest
    id = "searchbar"
    label = " "
    placeholder = ""
    initialValue = {this.state.location}
    onChange = {this.onInputChange}
    onSuggestSelect = {this.onSelection}
    onClick = {this.toggleSearch}
    className = {this.state.expand}
    inputClassName = {this.state.expand}
    // Name a calling reference
    ref = 'geosuggest_component'
  />
</div>
);

}

这是HTML输出

<div class="geosuggest">
<div class="geosuggest__input-wrapper">
<label for="searchbar"></label>
<input class="geosuggest__input" type="text" id="searchbar">
</div>
</div>

1 个答案:

答案 0 :(得分:2)

你必须使用vanillajs。在组件中,您可以在componentDidMount中访问geosuggest_component ref:

componentDidMount() {
    // findDOMNode returns an HTMLElement
    const node = ReactDOM.findDOMNode(this.refs.geosuggest_component);
    // Then search the label
    const label = node.querySelector('label');
    // Now, you can do anything you want with label
    label.addEventListener('click', () => console.log('clicked'))   
}

我使用ReactDOM.findDOMNode,因为在这种情况下,this.refs.geosuggest_component返回一个React组件。 findDOMNode方法将为您提供所需的HTMLElement。

但是,声明ref的更好方法是使用回调:

ref={node => this.geosuggest_component = node}

现在在componentDidMount中:

const node = ReactDOM.findDOMNode(this.geosuggest_component);