Передача нажатия кнопки от дочернего элемента к родительскому в React

При попытке переключения между двумя дочерними компонентами мне нужно иметь кнопку триггера в дочернем компоненте и передавать функцию щелчка через дочерний компонент в компонент, чтобы переключить другой дочерний компонент. Я не уверен, как протолкнуть реквизиты от дочернего к родительскому, чтобы вызвать переключение.

Родительский компонент

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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
4
0
7 238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 = () => {this.setState({isHidden: !this.state.isHidden})}

Matt 20.04.2018 20:37

@Matt, наверное, у вас нет такого плагина babel под названием "transform-class-properties". Я перепишу код с синтаксисом bind, но рекомендую вам использовать его и дальше.

Denys Kotsur 20.04.2018 20:39

@Matt Я изменил toggleOffer на обычную функцию и добавил привязку в конструктор. Попробуй еще раз.

Denys Kotsur 20.04.2018 20:41

Хммм, теперь у меня Cannot read property 'props' of undefined

Matt 20.04.2018 20:46

@ Мэтт да, извини, написал в спешке. Я обновил код. Удален this из пропсов в компоненте Child.

Denys Kotsur 20.04.2018 20:50

Другие вопросы по теме