Как не допустить закрытия модального семантического интерфейса при отображении различных компонентов? - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь использовать модал для аутентификации (логин и регистрация).До сих пор мне удавалось заставить его отображаться корректно и я могу переключаться с входа в систему, чтобы зарегистрировать компонент, но по какой-то причине модал закроется после попытки переключения из регистрации в регистрацию.У меня есть заголовок, который содержит триггер для модального.Вот мой код:

Header.js

import React, { Component } from "react";
import Login from "./Login";
import Register from "./Register";
import logo from "../assets/logo.png"
import { Modal } from "semantic-ui-react";

class Header extends Component {
  constructor(props){
super(props);
this.state = { login: true, header: "Login"}
this.handleRegister = this.handleRegister.bind(this);


  this.handleLogin = this.handleLogin.bind(this);
  }

  handleRegister = () => {
    this.setState({ login: false,
                    header: "Register"});
  }

  handleLogin = () => {
    this.setState({ login: true,
                    header: "Login"});
  }

  renderModal () {
    const showLogin = this.state.login ? (<Login handleRegister={this.handleRegister} />) : (<Register handleLogin={this.handleLogin} />);
    return (
      <Modal closeIcon onClose={this.handleLogin} size="tiny" trigger={<a className="item">Login</a>}>
        <Modal.Header style={{backgroundColor: "#005ce6", color:"white"}}>{this.state.header}</Modal.Header>
        <Modal.Content>
          {showLogin}
        </Modal.Content>
      </Modal>
    )
  }
render() {
    return (
      <div>
        <div className="ui menu hover" style={{ padding: 0}}>

          <div className="right menu">
            {this.renderModal()}
          </div>
        </div>
    </div>


    )
  }
}

export default Header;

Register.js

import React, { Component } from 'react';

class Register extends Component {
  constructor(props){
    super(props)
    this.handleLogin = this.props.handleLogin.bind(this);
  }

  render() {
    return (
      <div>
        <div>
            <form action="/auth/register" method="post" className="ui form">
            <div className="field">
              <label>First Name</label>
              <input type="text" placeholder="First Name" name="firstName"/>
            </div>
            <div className="field">
              <label>Last Name</label>
              <input type="text" placeholder="Last Name" name="lastName"/>
            </div>
            <div className="field">
              <label>Email</label>
              <input type="text" placeholder="Email" name="email"/>
            </div>
            <div className="field">
              <label>Password</label>
              <input type="password" placeholder="Password" name="password"/>
            </div>
            <button type="submit" className="ui button">Submit</button>
            </form>
            <div style={{paddingTop:20}}>
              <div>Already have account? Please <a onClick={this.handleLogin}>Login</a></div>
            </div>
        </div>
      </div>
    )
  }
}

export default Register;

Login.js

import React, { Component } from 'react'

class Login extends Component {
  constructor(props){
    super(props)
    this.handleRegister = this.props.handleRegister.bind(this);
  }
  render(){
    return (
      <div>
          <form action="/auth/login" method="post" className="ui form">
            <div className="field">
              <label>Email</label>
              <input type="text" placeholder="Email" name="email"/>
            </div>
            <div className="field">
              <label>Password</label>
              <input type="password" placeholder="Password" name="password"/>
            </div>
            <button type="submit" className="ui button">Submit</button>
          </form>
          <div style={{paddingTop:20}}>
            <div>Don't have an account? Please <a onClick={this.handleRegister}>Register</a></div>
          </div>
      </div>

    )
  }
}
export default Login;

Iпопытался использовать открытое поле для модального режима и установить состояние «показ» в зависимости от того, установлен ли триггер, но он никогда не закрывается.Кажется, что когда я перехожу из реестра к компонентам входа через щелчок «Вход», это вызывает событие закрытия, и я не могу понять, почему.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Обходной путь: добавьте closeOnDimmerClick={false} в качестве модальной опоры.

Источник: https://github.com/Semantic-Org/Semantic-UI-React/issues/2493#issuecomment-362972834

Есть некоторые проблемы с модальным компонентом Semantic UI React.Определенно.

Репро шаги:

  1. https://codesandbox.io/s/30n2v379r1
  2. откройте модальное окно, нажав кнопку «Вход» (верхний левый угол, также уменьшите масштаб, чтобы увидеть ссылки модального окна)
  3. нажмите ссылку Регистрация модального
  4. нажмите ссылку входа модального

Факт: модальный закрыт

Ожидается: модальный открыт и зарегистрируйтесьотображается форма

IMO, после изменения разметки (в форме регистра больше входных данных) навигационная ссылка имеет новые координаты, выходящие за пределы начальных координат модальной зоны.Поэтому нажатие на эту ссылку теперь рассматривается как нажатие где-то за пределами модального окна.

PS: еще один способ избежать этого режима автоматического закрытия - сделать разметку обеих форм более или менее похожей: например,удалите первые два ввода из формы регистрации, чтобы она выглядела точно так же, как форма входа в систему (конечно, это не решение для начинающего с темы, просто к сведению), есть несколько комментариев в компоненте регистрации в https://codesandbox.io/s/30n2v379r1

upd:выпуск по репозиторию SUIR https://github.com/Semantic-Org/Semantic-UI-React/issues/2888

0 голосов
/ 06 июня 2018

Используйте свойство open, логическое значение, если true будет держать ваш модальным открытым. демонстрационная ссылка для поддержания модального режима

<Modal
        trigger={<Button onClick={this.handleOpen}>Show Modal</Button>}
        open={this.state.modalOpen}
        onClose={this.handleClose}
        basic
        size='small'
      >
...