Как отправить форму с помощью клавиши Enter в react.js?

103

Вот моя форма и метод onClick. Я хотел бы выполнить этот метод, когда нажата кнопка Enter на клавиатуре. Как ?

NB: jquery не приветствуется.

 comment: function (e) {
        e.preventDefault();
        this.props.comment({comment: this.refs.text.getDOMNode().value, userPostId:this.refs.userPostId.getDOMNode().value})
    },


 <form className="commentForm">
     <textarea rows="2" cols="110" placeholder="****Comment Here****" ref="text"  /><br />
    <input type="text" placeholder="userPostId" ref="userPostId" /> <br />
     <button type="button" className="btn btn-success" onClick={this.comment}>Comment</button>
    </form>
Истяк Морсалин
источник

Ответы:

195

Измените <button type="button"на <button type="submit". Удалите onClick. Вместо этого сделай <form className="commentForm" onSubmit={this.onFormSubmit}>. Это должно уловить нажатие кнопки и нажатие клавиши возврата.

onFormSubmit = e => {
  e.preventDefault();
  const { name, email } = this.state;
  // send to server with e.g. `window.fetch`
}

...

<form onSubmit={this.onFormSubmit}>
  ...
  <button type="submit">Submit</button>
</form>
Доминик
источник
2
почему onSubmit = {this.onCommentSubmit}>? @Dominic
Истяк Морсалин
1
@JasonBourne, вы можете дать обратному вызову любое имя, которое захотите, я просто всегда даю имена обратных вызовов событий, такие как onSomethingClick, onMouseMove, onFormKeyPress и т. другой метод (более проверенный)
Доминик
2
@JasonBourne, это правильный и передовой метод, и он работает в обоих случаях, см. Jsfiddle.net/ferahl/b125o4z0
Доминик
26
В onCommentSubmit, вы также должны вызвать event.preventDefault()и, event.stopPropagation()чтобы форма не перезагружала страницу (так как это, actionскорее всего, форма с пустым атрибутом)
jamesfzhang
1
Избегайте перезагрузки страницы с action='#'атрибутом formэлемента.
Терье Нордерхауг,
17

Используйте keydownдля этого событие:

   input: HTMLDivElement | null = null;

   onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {
      // 'keypress' event misbehaves on mobile so we track 'Enter' key via 'keydown' event
      if (event.key === 'Enter') {
        event.preventDefault();
        event.stopPropagation();
        this.onSubmit();
      }
    }

    onSubmit = (): void => {
      if (input.textContent) {
         this.props.onSubmit(input.textContent);
         input.focus();
         input.textContent = '';
      }
    }

    render() {
      return (
         <form className="commentForm">
           <input
             className="comment-input"
             aria-multiline="true"
             role="textbox"
             contentEditable={true}
             onKeyDown={this.onKeyDown}
             ref={node => this.input = node} 
           />
           <button type="button" className="btn btn-success" onClick={this.onSubmit}>Comment</button>
         </form>
      );
    }
am0wa
источник
17

С момента последнего ответа на этот вопрос прошло уже несколько лет. React представил «хуки» еще в 2017 году, а «keyCode» устарел.

Теперь мы можем написать это:

  useEffect(() => {
    const listener = event => {
      if (event.code === "Enter" || event.code === "NumpadEnter") {
        console.log("Enter key was pressed. Run your function.");
        // callMyFunction();
      }
    };
    document.addEventListener("keydown", listener);
    return () => {
      document.removeEventListener("keydown", listener);
    };
  }, []);

Это регистрирует прослушиватель keydownсобытия, когда компонент загружается в первый раз. Он удаляет прослушиватель событий при уничтожении компонента.

user1032613
источник
10

вот как вы это делаете, если хотите слушать клавишу «Enter». Существует опора onKeydown, которую вы можете использовать, и вы можете прочитать об этом в реакционной документации.

а вот код Sandbox

const App = () => {
    const something=(event)=> {
        if (event.keyCode === 13) {
            console.log('enter')
        }
    }
return (
    <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
        <input  type='text' onKeyDown={(e) => something(e) }/>
    </div>
);
}
Сайрус Зей
источник
0

import React , {useEffect , useRef } from 'react' ; 

function Example() {

 let inp = useRef() 
 useEffect(()=>{ 
   if (!inp && !inp.current) return 
   inp.current.focus() ; 
   return () => inp = null ;  
 });
 
 const handleSubmit = () => { 
    //...  
 }

 return ( 
    <form                                                        
    onSubmit={(e) => {                                       
      e.preventDefault();                                       
      handleSubmit(e);                               
        }}                                                        > 
        <input 
           name="fakename" 
           defaultValue="...." 
           ref={inp}
           type="text"
           style={{
             position :"absolute" , 
             opacity : 0  
           }}
         />
         <button type="submit"> 
            submit
         </button>
    </form>
 )
}

введите код здесь. Иногда во всплывающем окне не работает привязка только формы и передача onSubmit в форму, потому что форма может не иметь ввода. в этом случае, если вы привяжете событие к документу, выполнив document.addEventListenerэто, это вызовет проблемы в других частях приложения, поскольку для решения этой проблемы мы должны обернуть форму и поместить ввод, скрытый css .. тогда вы foucus на этом вводе ref, он будет работать правильно.

Амир
источник