2016-12-16 3 views
0

Я пытаюсь создать компонент React, который будет использовать классы загрузки alert для отображения ошибок. Проблема в том, что я хочу сделать это уклончивым, но привязка обработчика в кнопке закрытия внутри div-файла предупреждения, чтобы скрыть его, не сделает его повторной рендерингом, если мне нужно снова отобразить ошибку. Пример:React: create offable Alert component

class Alert extends React.Component { 
    constructor(props) { 
    super(props) 
    this.handleClick = this.handleClick.bind(this) 
    this.state = { 
     display: true 
    } 
    } 

    handleClick() { 
    this.setState({ 
     display: false 
    }) 
    } 

    render() { 
    return (
     <div> 
     {this.state.display && 
      <div className={"alert alert-" + this.props.type + " alert-dismissible mt10"}> 
      {this.props.message} 
      <button type="button" className="close" onClick={this.handleClick} data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
      </div> 
     } 
     </div> 
    ) 
    } 
} 

Это рабочий код для компонента «Предупреждение», и щелчок по кнопке закрытия внутри спрячет его. Вот вопрос:

class FormImageUpload extends React.Component { 
    ... 

    render() { 
    return (
     <form> 
     <input type="text" placeholder="Paste Image Url"/> 
     {this.props.displayUploadError && 
      <Alert type="danger" message="There was an error trying to process the image. Please try again." /> 
     } 
     <button type="submit" className="btn btn-primary mt10">SEND</button> 
     </form> 
    ) 
    } 
} 

корень Родитель:

class App extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = { 
     displayUploadError: false 
    } 
    this.handleRequest = this.handleRequest.bind(this) 
    } 


    handleRequest(image_url) { 
     this.setState({ 
     displayUploadError: true 
     }) 
    } 


    render() { 
    return (
     <div className="demo__wrap"> 
     <FormImageUpload 
      handleRequest={this.handleRequest} 
      displayUploadError={this.state.displayUploadError} 
     /> 
     </div> 
    ) 
    } 
} 

У меня есть Логическое значение, указывающее, если мне нужно, чтобы показать/скрыть компонент предупреждения. Но если я закрою предупреждение, оно больше не будет отображаться. Как я могу это исправить?

ответ

1

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

+0

Но дело в том, чтобы создать многократно используемый компонент, который может спрятаться. У меня уже есть boolean в компоненте формы для отображения/скрытия Alert –

+0

Зачем вам нужны два флага 2, спрячьте это, просто передайте логическое значение из формы в alert как prop –

+0

. Ваше оповещение не отображается, потому что вы задаете состояние но компонент формы не узнает об изменении. Следовательно, измените состояние формы и передайте ее дочерним элементам –

0

Да, прохождение булевского также может скрыть его. Вот еще макет кода

If (boolean) { 
Return Alert 
} 
Else { 
Return null 
} 
+0

Используйте его так, как показано на рисунке. –

+0

Я добавил свой корневой компонент к вопросу. Как я могу сделать эту работу, скрывая предупреждение от обработчика кликов внутри компонента Alert, но делая его отображаемым снова, когда обновляется родительское состояние корня? –