Ваша проблема в том, что в настоящее время ваше состояние совместно используется всеми вашими компонентами.Пропуск showHide одинаков для всех входных данных и компонентов всплывающей подсказки.
Я предполагаю, что поведение, которое вы используете, заключается в отображении соответствующей всплывающей подсказки при фокусировке ввода.
Вы можетесделайте это, вместо того чтобы иметь это состояние в родительском компоненте, поместите его в каждый ввод / всплывающую подсказку:
Parent
import React from 'react';
import ReactDOM from 'react-dom';
import InputField from './InputField.jsx';
class Parent extends React.Component {
render(){
return(
<div>
<InputField
name='input-1'
type="text"
tooltipText="Input1 Tooltip"
/>
<InputField
name='input-2'
type="text"
tooltipText="Input2 Tooltip"
/>
<InputField
name='input-3'
type="text"
tooltipText="Input3 Tooltip"
/>
</div>
)
}
}
InputField
import React from 'react';
import ReactDOM from 'react-dom';
import InputField from './ToolTip.jsx';
export class InputField extends React.Component{
constructor(props){
super(props)
this.state = {
tooltipShown: false
}
this.showTooltip = this.showTooltip.bind(this)
this.hideTooltip = this.hideTooltip.bind(this)
}
showTooltip(){
this.setState({
tooltipShown: true
})
}
hideTooltip(){
this.setState({
tooltipShown: false
})
}
render(){
return(
<div>
<input onFocus={this.showTooltip} onBlur={this.hideTooltip} />
<ToolTip
shown={this.state.tooltipShown}
text={this.props.tooltipText}
/>
</div>
)
}
}
Tooltip
export const ToolTip = (props) => {
return (
<div className={props.shown ? 'show' : 'hide'}>
{props.tooltipText}
</div>
)
}
Теперь каждый компонент InputField
управляет своим собственным компонентом всплывающей подсказки.Они могут получить текст всплывающей подсказки в качестве реквизита и передать его всплывающей подсказке.Когда вы дадите фокус на InputField
, он сообщит, что всплывающая подсказка будет отображаться, а при потере фокуса onBlur
сработает, чтобы скрыть его снова.
Обратите внимание, что я также изменил Input
от InputField
до input
, поскольку не похоже, что вы используете пользовательский компонент Input
.