зателефонувати на подію Змінити після натискання клавіші Enter


204

Я новачок у Bootstrap і стикався з цією проблемою. У мене є поле введення, і як тільки я ввожу лише одну цифру, функція з onChangeвикликається, але я хочу, щоб вона була викликана, коли я натискаю "Enter", коли було введено ціле число. Та сама проблема з функцією перевірки - вона дзвонить занадто рано.

var inputProcent = React.CreateElement(bootstrap.Input, {type: "text",
  //bsStyle: this.validationInputFactor(),
  placeholder: this.initialFactor,
  className: "input-block-level",
  onChange: this.handleInput,
  block: true,
  addonBefore: '%',
  ref:'input',
  hasFeedback: true
});

Відповіді:


404

За словами React Doc , ви могли слухати події на клавіатурі, на кшталт onKeyPressчи onKeyUpні onChange.

var Input = React.createClass({
  render: function () {
    return <input type="text" onKeyDown={this._handleKeyDown} />;
  },
  _handleKeyDown: function(e) {
    if (e.key === 'Enter') {
      console.log('do validate');
    }
  }
});

Оновлення: використовуйте React.Component

Ось код за допомогою React.Component, який робить те саме

class Input extends React.Component {
  _handleKeyDown = (e) => {
    if (e.key === 'Enter') {
      console.log('do validate');
    }
  }

  render() {
    return <input type="text" onKeyDown={this._handleKeyDown} />
  }
}

Ось jsfiddle .

Оновлення 2: Використовуйте функціональний компонент

const Input = () => {
  const handleKeyDown = (event) => {
    if (event.key === 'Enter') {
      console.log('do validate')
    }
  }

  return <input type="text" onKeyDown={handleKeyDown} />
}

2
І ви також хотіли б прив’язати процес перевірки до onBlurподії.
увійти

5
Це ж рішення більш компактним чином з посиланням на вхідний текст:<input ref='reference' onKeyPress={(e) => {(e.key === 'Enter' ? doSomething(this.refs.reference.value) : null)}} />
musemind

5
@musemind Насправді вам не потрібно користуватися ref. <input onKeyPress={e => doSomething(e.target.value)}є достатнім.
увійти

4
@musemind Сенс використання методу класу замість вбудованої функції полягає в тому, щоб уникнути створення нової функції кожного разу, коли onKeyPressвона спрацьовує. Це тонке покращення перф.
провів

1
додана скрипка більше не працює, будь ласка, перевірте, будь-яка приємна відповідь
Pardeep Jain

52

Ви можете використовувати onKeyPress безпосередньо у полі введення. Функція onChange змінює значення стану при кожній зміні поля введення і після натискання клавіші Enter викличе пошук функції ().

<input
    type="text"
    placeholder="Search..."
    onChange={event => {this.setState({query: event.target.value})}}
    onKeyPress={event => {
                if (event.key === 'Enter') {
                  this.search()
                }
              }}
/>

ця відповідь працює для мене, а не прийнята відповідь вище.
karthik shankar

Якщо у вас є важка форма, я рекомендую створити функцію поза методом візуалізації та передавати її як орієнтир, як onKeyPress={this.yourFunc}інакше функція стрілки жиру буде створена для кожного візуалізації.
Віктор

це працює для випадку, коли подія onKeyPress написано також для введення та батьківського випадку. Дякую.
Naveen Kumar PG

АбоonKeyPress={event => event.key === 'Enter' && this.search()}
camden_kid

24

натискання клавіші Enter, коли фокусування на контролі форми (введенні) зазвичай запускає submitподію (onSubmit) на самій формі (а не на вході), щоб ви могли прив’язати this.handleInputформу до подачі форми.

Крім того, ви можете прив'язати його до blurподії (onBlur), inputщо відбувається, коли фокус видалено (наприклад, вкладка до наступного елемента, який може отримати фокус)


3
Це набагато більш чисто, ніж використання onKeyPress.
Блекус

1
Думка, оскільки ціль інша, event.target.valueнедоступна
Ізката

@Izkata, що ви говорите, абсолютно правильно; моя відповідь може вимагати іншого способу поводження з речами в handleInputметоді контролера . Виконання відповідно до моєї відповіді охоплюватиме вас як тоді, коли користувач натискає клавішу вводу, фокусуючись на вході, так і при активації submitкнопки / вводу.
Лука

У більшості ситуацій у веб-додатках немає форм, а лише введення, тому ця відповідь не стосується більшості випадків використання, IMHO
vsync

@vsync це може бути нерелевантним для більшості, але все-таки справедливе для порції - і, безумовно, невірне, я не думаю, що це варте зниження?
Лука

8

Можна використовувати event.key

function Input({onKeyPress}) {
  return (
    <div>
      <h2>Input</h2>
      <input type="text" onKeyPress={onKeyPress}/>
    </div>
  )
}

class Form extends React.Component {
  state = {value:""}

  handleKeyPress = (e) => {
    if (e.key === 'Enter') {
      this.setState({value:e.target.value})
    }
  }

  render() {
    return (
      <section>
        <Input onKeyPress={this.handleKeyPress}/>
        <br/>
        <output>{this.state.value}</output>
      </section>
    );
  }
}

ReactDOM.render(
  <Form />,
  document.getElementById("react")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>


5

Реагуйте на користувачів, ось відповідь на повноту.

Реактивна версія 16.4.2

Ви або хочете оновити для кожного натискання клавіші, або отримаєте значення лише після надсилання. Додавання ключових подій до компонента працює, але є альтернативи, як рекомендовано в офіційних документах.

Контрольовані проти неконтрольованих компонентів

Контрольована

Від Документів - Форми та контрольовані компоненти :

У HTML формують такі елементи, як введення, textarea та select, як правило, підтримують власний стан та оновлюють його на основі введення користувача. У React змінний стан зазвичай зберігається у властивості стану компонентів та оновлюється лише за допомогою setState ().

Ми можемо поєднати ці два, зробивши стан Реагу "єдиним джерелом істини". Потім компонент React, який надає форму, також контролює, що відбувається в цій формі при наступному введенні користувача. Елемент форми введення, значення якого таким чином контролюється React, називається "контрольованим компонентом".

Якщо ви використовуєте контрольований компонент, вам доведеться постійно оновлювати стан для кожної зміни значення. Щоб це сталося, ви прив’язуєте обробник події до компонента. У прикладах документів, як правило, подія onChange.

Приклад:

1) Прив'язує обробник подій у конструкторі (значення зберігається у стані)

constructor(props) {
    super(props);
    this.state = {value: ''};

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

2) Створіть функцію обробника

handleChange(event) {
    this.setState({value: event.target.value});
}

3) Створити функцію надсилання форми (значення береться від штату)

handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
}

4) Візуалізація

<form onSubmit={this.handleSubmit}>
    <label>
      Name:
      <input type="text" value={this.state.value} onChange={this.handleChange} />
    </label>
    <input type="submit" value="Submit" />
</form>

Якщо ви використовуєте контрольовані компоненти, ваша handleChangeфункція завжди буде запущена, щоб оновити та підтримувати належний стан. У штаті завжди буде оновлене значення, і коли форма подається, значення буде взято від держави. Це може бути наслідком, якщо ваша форма дуже довга, тому що вам доведеться створити функцію для кожного компонента або написати просту, яка обробляє зміну значення кожного компонента.

Безконтрольний

З Документів - Неконтрольований компонент

У більшості випадків ми рекомендуємо використовувати контрольовані компоненти для реалізації форм. У контрольованому компоненті дані форми обробляються компонентом React. Альтернативою є неконтрольовані компоненти, де дані форми обробляє сам DOM.

Щоб написати неконтрольований компонент, замість того, щоб писати обробник подій для кожного оновлення стану, ви можете використовувати ref, щоб отримати значення форми від DOM.

Основна відмінність тут полягає в тому, що ви не використовуєте onChangeфункцію, а скоріше onSubmitформу, щоб отримати значення, і перевірити, якщо це необхідно.

Приклад:

1) Зв’яжіть обробник подій та створіть ref для введення в конструктор (значення не зберігається у стані)

constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
}

2) Створити функцію надсилання форми (значення береться з компонента DOM)

handleSubmit(event) {
    alert('A name was submitted: ' + this.input.current.value);
    event.preventDefault();
}

3) Візуалізація

<form onSubmit={this.handleSubmit}>
    <label>
      Name:
      <input type="text" ref={this.input} />
    </label>
    <input type="submit" value="Submit" />
</form>

Якщо ви використовуєте неконтрольовані компоненти, не потрібно зв'язувати handleChangeфункцію. Після подання форми значення буде взято з DOM і необхідні перевірки можуть відбутися в цей момент. Не потрібно створювати ніяких функцій обробника для будь-якого з вхідних компонентів.

Ваше питання

Тепер для вашого питання:

... Я хочу, щоб його викликали, коли я натискаю "Enter", коли було введено ціле число

Якщо ви хочете цього досягти, використовуйте неконтрольований компонент. Не створюйте обробників onChange, якщо це не потрібно. enterКлюч представлятиме форму і handleSubmitфункцію звільнять.

Зміни, які потрібно зробити:

Видаліть виклик onChange у своєму елементі

var inputProcent = React.CreateElement(bootstrap.Input, {type: "text",
    //    bsStyle: this.validationInputFactor(),
    placeholder: this.initialFactor,
    className: "input-block-level",
    // onChange: this.handleInput,
    block: true,
    addonBefore: '%',
    ref:'input',
    hasFeedback: true
});

Обробляйте форму подання та підтверджуйте свої дані. Вам потрібно отримати значення від вашого елемента у функції подання форми, а потім перевірити. Переконайтеся, що ви створили посилання на свій елемент у конструкторі.

  handleSubmit(event) {
      // Get value of input field
      let value = this.input.current.value;
      event.preventDefault();
      // Validate 'value' and submit using your own api or something
  }

Приклад використання неконтрольованого компонента:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    // bind submit function
    this.handleSubmit = this.handleSubmit.bind(this);
    // create reference to input field
    this.input = React.createRef();
  }

  handleSubmit(event) {
    // Get value of input field
    let value = this.input.current.value;
    console.log('value in input field: ' + value );
    event.preventDefault();
    // Validate 'value' and submit using your own api or something
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <NameForm />,
  document.getElementById('root')
);

3

Ви також можете написати невелику функцію обгортки, як це

const onEnter = (event, callback) => event.key === 'Enter' && callback()

Потім споживайте його на своїх введеннях

<input 
    type="text" 
    placeholder="Title of todo" 
    onChange={e => setName(e.target.value)}
    onKeyPress={e => onEnter(e, addItem)}/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.