我阅读了一些有关此的教程。他们告诉我应该使用ref来做到这一点。 但这很笼统。
这是我的问题:
基本上在Header
组件中包括NavBar
,SearchBar
和ResultSearch
组件。
const Header = () => {
return (
<header className="ss_header">
<Navbar />
<SearchBar />
<ResultSearch />
</header>
);
};
在SearchBar
组件中。每当我专注于输入文本时。它发出一个事件并以任何方式显示ResultSearch
组件(更改样式或...)。
class SearchBar extends Component{
render() {
return (
<div className="search_bar">
<section className="search">
<div className="sub_media container">
<form method="GET" action="" id="search_form">
<Icon icon="search" />
<span className="autocomplete">
<input
className="search_input"
autoCorrect="off"
autoComplete="off"
name="query"
type="text"
placeholder="Search for a movie, tv show, person..." />
</span>
</form>
</div>
</section>
</div>
);
}
}
ResultSearch
组件中的样式。我被定为display: none
。
.results_search { display: none; }
我认为ResultSearch将收到来自SearchBar
的事件,并为display: block
组件设置ResultSearch
。有可能吗?
我该如何处理? 我的代码在这里:https://codesandbox.io/s/3xv8xnx3z5
答案 0 :(得分:1)
答案 1 :(得分:1)
只有您应该像下面那样转换Header组件:
class Header extends Component {
state = {
focus: false
};
handleInputFocus = () => {
this.setState({ focus: true });
};
handleInputBlur = () => {
this.setState({ focus: false });
};
render() {
return (
<header className="ss_header">
<SearchBar
onFocus={this.handleInputFocus}
onBlur={this.handleInputBlur}
/>
{this.state.focus ? <ResultSearch /> : null}
</header>
);
}
}
以及在SearchBar组件中,将以下属性添加到您的输入中:
onFocus={this.props.onFocus}
onBlur={this.props.onBlur}
此外,您还应该删除关于结果框的CSS。
而且,您可以在以下沙箱中看到更新的代码: