【问题标题】:Passing button click from child to parent in React在 React 中将按钮单击从子级传递给父级
【发布时间】:2018-10-01 12:35:51
【问题描述】:

在尝试在两个子组件之间切换时,我需要在子组件中有触发按钮,并通过子组件将点击功能传递给以切换另一个子组件。我不确定如何将道具从孩子推送到父母以触发切换。

父组件

import React from 'react'
import CancelOffer from '../CancelPages/CancelOffer'
import CancelWarning from '../CancelPages/CancelWarning'

class Cancel extends React.Component {
  constructor() {
    super()
    this.state = {
      isHidden: true
    }
  }
  toggleOffer() {
    this.setState({
      isHidden: !this.state.isHidden
    })
  }
  render() {
    return ( 
    <div className = 'cancel'
      style = {{backgroundImage: `url(${this.props.backgroundImage})`}} >
      <div className = 'container' > 
        {!this.state.isHidden &&
          <CancelOffer { ...this.props}/>
        }

        {this.state.isHidden &&
            <CancelWarning { ...this.props}/>
        }

        {this.state.isHidden &&
            <button onClick = {this.toggleOffer.bind(this)} > Click < /button>
        } 
      </div> 
      </div>
    )
  }
}

export default Cancel

子组件

import React from 'react'
import SvgIcon from '../SvgIcon/SvgIcon'
import './CancelWarning.scss'

function CancelOffer (props) {
  const content = props.config.contentStrings

  return (
    <div className='cancel-warning'>
      <h2 className='heading md'>heading</h2>
      <p className='subpara'>subheading</p>
      <div className='losses'>
        <ul>
          <li>text</li>
          <li>text</li>
          <li>text</li>
        </ul>
        </div>
      <div className='footer-links'>
        <a href='/member' className='btn btn--primary btn--lg'>continue</a>
        <a href='/cancel' className='cancel-link'>Cancel</a>
        //NEED TO HAVE BUTTON HERE AND PASS PROPS TO PARENT TO TOGGLE VIEW
        {this.state.isHidden &&
        <button onClick = {this.toggleOffer.bind(this)}>Click</button>
        } 
      </div>
    </div>
  )
}

export default CancelOffer

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    你可以像普通参数一样传递它。此外,您可以使用箭头函数代替绑定。

    父组件

    import React from 'react'
    import CancelOffer from '../CancelPages/CancelOffer'
    import CancelWarning from '../CancelPages/CancelWarning'
    
    class Cancel extends React.Component {
      constructor() {
        super()
        this.state = {
          isHidden: true
        }
    
        this.toggleOffer = this.toggleOffer.bind(this);
      }
    
      toggleOffer() {
        this.setState({
          isHidden: !this.state.isHidden
        })
      }
    
      render() {
        const { isHidden } = this.state
        return ( 
        <div className = 'cancel'
          style = {{backgroundImage: `url(${this.props.backgroundImage})`}} >
          <div className = 'container' > 
            {!isHidden &&
              <CancelOffer toggleOffer={this.toggleOffer} isHidden={isHidden}/>
            }
    
            {isHidden &&
                <CancelWarning toggleOffer={this.toggleOffer} isHidden={isHidden}/>
            }
    
            {isHidden &&
                <button onClick = {this.toggleOffer}> Click </button>
            } 
          </div> 
          </div>
        )
      }
    }
    
    export default Cancel
    

    子组件

    import React from 'react'
    import SvgIcon from '../SvgIcon/SvgIcon'
    import './CancelWarning.scss'
    
    function CancelOffer (props) {
      const content = props.config.contentStrings
    
      return (
        <div className='cancel-warning'>
          <h2 className='heading md'>heading</h2>
          <p className='subpara'>subheading</p>
          <div className='losses'>
            <ul>
              <li>text</li>
              <li>text</li>
              <li>text</li>
            </ul>
            </div>
          <div className='footer-links'>
            <a href='/member' className='btn btn--primary btn--lg'>continue</a>
            <a href='/cancel' className='cancel-link'>Cancel</a>
            {props.isHidden &&
            <button onClick = {props.toggleOffer}>Click</button>
            } 
          </div>
        </div>
      )
    }
    
    export default CancelOffer
    

    【讨论】:

    • 箭头函数抛出语法错误unexpected tokentoggleOffer = () =&gt; {this.setState({isHidden: !this.state.isHidden})}
    • @Matt 可能,您没有名为“transform-class-properties”的 babel 插件。我将使用bind 语法重写代码,但我建议您进一步使用它。
    • @Matt 我已将toggleOffer 更改为常规函数并在构造函数中添加了绑定。再试一次。
    • 嗯,我现在收到Cannot read property 'props' of undefined
    • @Matt 是的,抱歉,匆忙写了。我已经更新了代码。从 Child 组件中的 props 中删除了 this。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多