react.js에서 Enter 키를 사용하여 양식을 제출하는 방법은 무엇입니까?


102

다음은 내 양식과 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>

답변:


192

변경 <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
why onSubmit = {this.onCommentSubmit}>? @Dominic
Istiak Morsalin

1
@JasonBourne 콜백에 원하는 이름을 지정할 수 있습니다. 때로는 변경되거나 변경되는 것처럼 메서드의 이름을 지정하는 대신 항상 onSomethingClick, onMouseMove, onFormKeyPress 등과 같은 이벤트 콜백 이름을 지정합니다. 다른 방법 (더 검증)
도미닉

2
@JasonBourne 이것은 정확하고 모범 사례 방법이며 두 경우 모두에서 작동합니다. jsfiddle.net/ferahl/b125o4z0
Dominic

25
에서 onCommentSubmit, 당신은 또한 호출해야 event.preventDefault()하고 event.stopPropagation()(빈과의 형태부터 페이지를 다시로드에서 양식을 방지하기 위해 action가장 가능성 속성)
jamesfzhang

1
요소에 대한 action='#'속성을 사용하여 페이지를 다시로드하지 마십시오 form.
Terje Norderhaug

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>
      );
    }

14

이 질문이 마지막으로 답변 된 지 꽤 오래되었습니다. React는 2017 년에 "Hooks"를 도입했으며 "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하면 구성 요소가 처음로드 될 때 이벤트 에 리스너가 등록 됩니다. 구성 요소가 파괴되면 이벤트 리스너를 제거합니다.


9

"Enter"키를 들으려면 이렇게합니다. 사용할 수있는 onKeydown 소품이 있으며 반응 문서 에서 이에 대해 읽을 수 있습니다.

그리고 여기에있다 codeSandbox은

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>
);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.