【问题标题】:Toggle show hide class on child component from parent onfocus method in React从 React 中的父 onfocus 方法切换子组件上的显示隐藏类
【发布时间】:2019-03-21 09:09:53
【问题描述】:

我是 React 初学者。

我有一个包含多个输入字段的父组件(InputField 子组件)。 OnFocus 我想切换 Inputfield(InputFieldToolTip 组件)的子项以显示/隐藏父组件中的方法

目前,当我设置 showHide 的状态并通过 props 传递到 Input 字段组件时,它会切换所有工具提示组件

如何在 React 中引用单个工具提示组件?在 jQuery 中,我只会给它一个 ID 并使用一个 Dom 选择器。

示例代码(请勿将其视为实际代码,它只是代表结构和当前正在传递的内容):

父组件

import React from 'react';
import ReactDOM from 'react-dom';
import InputField from './InputField.jsx';

class Parent extends React.Component {
  constructor(props){
    super(props);
    this.state={
        showHide: ' hide',
        toolTip: 'This is a tooltip'
    }

    this.showHide = this.showHide.bind(this);
 }
 showHide(){
    if(this.state.showHide === 'hide') {
        this.setState({
            showHide: 'show'
        ))};
    } else {
        this.setState({
            showHide: 'hide'
        });
    }

 }

render(){
    return(
      <div>
        <InputField
            name='input-1'
            OnFocus={this.showHide}
            type="text"
            showHide={this.state.showHide}
            toolTip={this.state.toolTip}
        />
        <InputField
            name='input-2'
            OnFocus={this.showHide}
            type="text"
            showHide={this.state.showHide}
            toolTip={this.state.toolTip}
        />
        <InputField
            name='input-3'
            OnFocus={this.showHide}
            type="text"
            showHide={this.state.showHide}
            toolTip={this.state.toolTip}
        />
     </div>
    )       

  }
}

输入框组件

import React from 'react';
import ReactDOM from 'react-dom';
import InputField from './ToolTip.jsx';

export class InputField extends React.Component{

 render(){
    return(
      <div>
        <Input/>
        <ToolTip
            showHide={this.props.showHide}
            toolTip={this.props.toolTip}
        />
     </div>
    )           
  }
}

工具提示组件

import React, {Component} from 'react';
export const ToolTip = (props) => {
  return <div className={this.props.showHide}>{this.props.toolTip}</div>
}

【问题讨论】:

    标签: reactjs react-props react-state-management


    【解决方案1】:

    您的问题是当前您的状态由所有组件共享。 showHide 属性对于所有输入和工具提示组件都是相同的。

    我假设您的行为是在您关注输入时显示相应的工具提示。

    你可以这样做,而不是在你的父组件中拥有那个状态,把它放在每个输入/工具提示中:

    父母

    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>
        )       
    
      }
    }
    

    输入框

    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>
        )           
      }
    }
    

    工具提示

    export const ToolTip = (props) => {
      return (
         <div className={props.shown ? 'show' : 'hide'}> 
           {props.tooltipText}
         </div>
      )
    }
    

    现在每个InputField 组件都控制自己的 Tooltip 组件。 他们可以接收工具提示的文本作为道具并将其传递给工具提示。 当你给InputField焦点时,它会告诉工具提示被显示,当焦点丢失时onBlur会触发再次隐藏它。

    请注意,我还将InputField 中的Input 更改为input,因为您似乎没有使用自定义Input 组件。

    【讨论】:

    • 为什么省略InputField 组件?他想要一个包含Tooltip 的输入组件。 showhide 方法可以是一个函数。你的代码没有优化。
    • InputField 组件在我的回答中。我知道它可以是一个功能,但没有必要通过增加不必要的复杂性来增加混乱。
    • 你把一个简单的切换显示/隐藏函数写成两个函数,这种手写很复杂。我相信你改变了这个问题的面貌。
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2021-06-11
    • 2019-03-19
    • 2019-04-13
    • 2015-11-28
    • 1970-01-01
    • 2015-05-22
    • 2019-07-27
    相关资源
    最近更新 更多