Ant-design: FormItem не обнаруживает управляющий ввод внутри

Созданный на 28 мар. 2017  ·  8Комментарии  ·  Источник: ant-design/ant-design

Окружающая обстановка

  • версия antd: 2.7.4
  • ОС и ее версия: OS X 10.12.3
  • Браузер и его версия: Chrome 56

Что ты сделал? Пожалуйста, предоставьте шаги, чтобы воспроизвести вашу проблему.

Мы оборачиваем поля формы в их собственные компоненты, которые содержат их логику проверки. пример

Имя пользователяInput.js

class UsernameInput extends Component {
  render() {
    return this.props.form.getFieldDecorator(this.props.id, {
      rules: [...]
    })(InputComponent);
  }
}

И мы хотим использовать их в наших формах вот так

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        <UsernameInput form={this.props.form} />
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

Это не работает, потому что FormItem.getControls не определяет компонент как элемент управления. Просто видит обертку как UsernameInput.

Чего ты ожидал?

FormItem для обнаружения UsernameInput и работы как любой элемент управления вводом. Показывать сообщения об ошибках, отзывы, справки и т. Д.

Что случилось?

FormItem не находит элемент управления внутри.

Inactive IssueHuntFest help wanted 🗣 Discussion

Самый полезный комментарий

Мы решили это, вызвав компонент как функцию

CustomForm.js

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        {UsernameInput({ form: this.props.form })}
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

Но если вы открыты для идей, я думаю, что возможным решением было бы определить контекст в FormItem и Input могут регистрироваться, когда он присутствует. пример

FormItem.js

class FormItem extends Component {
  static childContextTypes = {
    registerControl: PropTypes.func
  };

  getChildContext() {
    return { registerControl: this.registerControl }; 
  }

  registerControl(control) {
    this.controls.push(control);
  }
}

Input.js

class Input extends Component {
  static contextTypes = {
    registerControl: PropTypes.func
  };

  componentDidMount() {
    if (this.context.registerControl) {
      this.registerControl(this);
    }
  }
}

Все 8 Комментарий

Решить этот вопрос сложно. Не могли бы вы выложить здесь свой совет (как реализовать), если есть?

Мы решили это, вызвав компонент как функцию

CustomForm.js

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        {UsernameInput({ form: this.props.form })}
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

Но если вы открыты для идей, я думаю, что возможным решением было бы определить контекст в FormItem и Input могут регистрироваться, когда он присутствует. пример

FormItem.js

class FormItem extends Component {
  static childContextTypes = {
    registerControl: PropTypes.func
  };

  getChildContext() {
    return { registerControl: this.registerControl }; 
  }

  registerControl(control) {
    this.controls.push(control);
  }
}

Input.js

class Input extends Component {
  static contextTypes = {
    registerControl: PropTypes.func
  };

  componentDidMount() {
    if (this.context.registerControl) {
      this.registerControl(this);
    }
  }
}

Я постараюсь найти решение.

@gaastonsr может ли вы показать весь свой код о UsernameInput с помощью этого обходного пути?

@gaastonsr Ваше решение мне очень помогает!

Это все еще актуальная проблема? Предложение контекста мне нравится.

Только что столкнулся с этим сегодня на [email protected]. По-прежнему проблема. Обходной путь функции

Привет @gaastonsr. Нам очень нравится ваше предложение / отзыв, добро пожаловать, чтобы отправить нам запрос на слияние. Пожалуйста, отправьте запрос на слияние в соответствующую ветку (ветвь функции для новой функции, мастер для исправления ошибок и других изменений), заполните [Шаблон запроса на слияние ] здесь, при необходимости предоставьте список изменений / TypeScript / документацию / тестовые примеры и убедитесь, что CI прошел, мы скоро его рассмотрим. Цените его заранее, и мы ждем вашего сообщения!

Здравствуйте, @gaastonsr, мы полностью согласны с вашим предложением / создавать на этом складе включение для решения этой проблемы. Отправьте запрос на слияние в правильную ветку (новые функции в ветку функций, другие в главную ветвь), обязательно заполните предустановленный шаблон в запросе слияния и предоставьте соответствующий журнал изменений, определения TypeScript, тестовые примеры, документы и т. Д., Необходимые для изменений , И чтобы убедиться, что CI пройден, мы рассмотрим как можно скорее, заранее благодарим вас и с нетерпением ждем вашего вклада!

giphy

Пожалуйста, проверьте новый компонент формы в antd v4, форма v3 не будет поддерживаться в ближайшее время.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги