Как получить входное значение, используя ссылки в форме реакции-загрузки?

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

function FieldGroup({id, label, help, ...props}) {
    return (
        <ReactBootstrap.FormGroup controlId={id}>
            <ReactBootstrap.ControlLabel>{label}</ReactBootstrap.ControlLabel>
            <ReactBootstrap.FormControl {...props} />
            {help && <ReactBootstrap.HelpBlock>{help}</ReactBootstrap.HelpBlock>}
        </ReactBootstrap.FormGroup>
    );
}

const formInstance = (
    <form>
        <FieldGroup
            id="formControlsText"
            type="text"
            label="Text"
            placeholder="Recipe Name"
            inputRef={ref => { this.input = ref; }}
        />
        <ReactBootstrap.FormGroup controlId="formControlsTextarea">
            <ReactBootstrap.ControlLabel>Ingredients</ReactBootstrap.ControlLabel>
            <ReactBootstrap.FormControl componentClass="textarea" placeholder="Enter Ingredients" />
        </ReactBootstrap.FormGroup>
    </form>
);  

Как я прочитал в учебнике по начальной загрузке React, я должен добавить
<FormControl inputRef={ref => { this.input = ref; }} /> к свойствам FormControl. Но после его добавления я получаю сообщение об ошибке при вызове модальной формы:

`введите здесь описание изображения


person Taras Yaremkiv    schedule 11.12.2016    source источник


Ответы (7)


Я только что сделал эту проблему. Мой код:

<FormControl
    componentClass="input"
    placeholder="Enter recipe title"
    inputRef={(ref) => {this.input = ref}}
    defaultValue={title}/>
</FormGroup>

И затем вы можете получить значение из <FormControl> в каком-то обработчике, например:

console.log(this.input.value);

Подробности можно найти в моем репозитории: https://github.com/kerf007/recipebook

person Eugene Kulakov    schedule 13.12.2016

У меня такая же проблема, как и у вас, и это мое решение

const FieldGroup = ({id, label, help, inputRef, ...props}) =>
  <FormGroup controlId={id}>
    <ControlLabel>{label}</ControlLabel>
    <FormControl {...props} inputRef={inputRef}/>
    {help && <HelpBlock>{help}</HelpBlock>}
  </FormGroup>

и моя форма

<form>
    <FieldGroup
        id="bookName"
        type="text"
        label="Name"
        placeholder="Enter name..."
        inputRef = {(input) => this.inputName = input }
     />
    <FieldGroup
        id="bookAuthor"
        label="Author"
        type="text"
        placeholder="author 's name..."
        inputRef={(input) => this.inputAuthor = input}
     />
</form>

то вы можете получить имя книги и имя автора:

this.inputName.value and this.inputAuthor.value
person M.Tae    schedule 13.04.2017

Эта проблема (или, скорее, изменение способа ее работы) связана с React-Bootstrap. То, как вы это делаете, больше не сработает.

Компонент <FormControl> напрямую отображает указанный или другой компонент. Если вам нужно получить доступ к значению неконтролируемого <FormControl>, прикрепите к нему ссылку, как если бы вы использовали неконтролируемый ввод, а затем вызовите ReactDOM.findDOMNode(ref), чтобы получить узел DOM. Затем вы можете взаимодействовать с этим узлом, как и с любым другим неконтролируемым входом.

Вот пример:

var React = require('react');
var ReactDOM = require('react-dom');
var FormControl = require('react-bootstrap').FormControl;

React.createClass({
  render: function() {
    return (<FormControl ref="formControl" />);
  },
  getFormControlNode: function() {
    // Get the underlying <input> DOM element
    return ReactDOM.findDOMNode(this.refs.formControl);
  }
});

Как только вы получите элемент DOM, вы сможете получить значение: this.getFormControlNode().value или сделать что-нибудь еще, что захотите.

PS: Вот связанная с github проблема по этой теме.

person Kaloyan Kosev    schedule 11.12.2016

Это сработало для меня, используя https://reactjs.org/docs/refs-and-the-dom.html

 constructor(props) {
        super(props);
        this.email = React.createRef();
    }

submit() {
        var email = this.email.current.value;
        console.log(email);
}
render() {
   return (
            <Form>
            <Form.Control type="email" placeholder="Your email" ref={this.email} />
            <Button variant="primary" onClick={()=>this.submit()}>Send</Button>
            </Form>
           );
}
person Steven Luong C    schedule 02.08.2019
comment
Как я могу взять это значение непосредственно в переменной состояния? @steven - person coderzzz18; 26.07.2020

Я думаю, что он предлагает использовать атрибут обратного вызова ref, поэтому просто измените inputRef на ref.

К сведению: https://facebook.github.io/react/docs/refs-and-the-dom.html

person BryceSi    schedule 11.12.2016
comment
Ничего не меняется, та же ошибка. Я думаю, проблема в том, что вы не можете использовать атрибут ref для функциональных компонентов, потому что у них нет экземпляров. - person Taras Yaremkiv; 11.12.2016
comment
Вы можете использовать атрибут ref для функциональных компонентов без сохранения состояния: robinwieruch.de/react-ref-attribute-dom-node - person Robin Wieruch; 11.05.2017

Здравствуйте, это решение сработало для меня!

<Form
  noValidate
  validated={validated}
  onSubmit={(e) => this.handleSubmit(e)}
  style={{ width: '100%' }}
>
  <Form.Group controlId="formBasicEmail">
   <Form.Label>Email address</Form.Label>
   <Form.Control type="email" placeholder="Enter email" inputRef={(ref) => { this.email = ref }} required />
   <Form.Text className="text-muted"> Well never share your email with anyone else.
   </Form.Text>
  </Form.Group>
</Form>

handleSubmit(event) {
    console.log(event.target.elements.formBasicPassword.value)
}
person Yakup Ad    schedule 04.07.2019

Кажется, я нашел, как получить ref из React-Bootstrap <Form/>.

 import React, {createRef} from 'react'  

    interface definedProps {} 
    interface definedState {
                  myRef: Object //I didn't found the more accurate type
              } 
    export default class SomeClass extends React.Component<definedProps,definedState> {
        state = {
            myRef: React.createRef<Form<any>>() //That's it!
        }

    const handleClose = () => {
        console.log('this.state.myRef: ', this.state.myRef); //Here we can take data from Form
        debugger; //todo: remove
    }

        render() {

            return (
                <div>
                     <Form ref={this.state.myRef}> { /*Here we're connecting the form's ref to State*/}
                        <Form.Group controlId='formName'>
                            <Form.Control
                                type='text'
                                placeholder='Enter Name'
                            />
                        </Form.Group>
                          ...
                        <Button
                            variant='primary'
                            onClick={handleClose}
                            >
                            Save Changes
                        </Button>
                        </Form>
                </div>
            )
        }
    }
person ptnz    schedule 15.10.2019
comment
Если вы используете «стандартную» ‹form/›, а не ‹From/› React-Bootstrap, тогда значение myRef в состоянии должно быть инициализировано следующим образом: myRef: React.createRef‹HTMLFormElement›() - person ptnz; 15.10.2019