จะส่งแบบฟอร์มโดยใช้ปุ่ม Enter ใน react.js ได้อย่างไร?


111

นี่คือแบบฟอร์มของฉันและวิธีการ onClick ฉันต้องการใช้วิธีนี้เมื่อกดปุ่ม Enter ของแป้นพิมพ์ อย่างไร?

หมายเหตุ: ไม่มีการชื่นชม 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>

คำตอบ:


204

เปลี่ยน<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
Istiak Morsalin

1
@JasonBourne คุณสามารถโทรกลับชื่อใดก็ได้ที่คุณต้องการฉันเพียงแค่ให้ชื่อเรียกกลับเหตุการณ์เช่น onSomethingClick, onMouseMove, onFormKeyPress เป็นต้นแทนที่จะตั้งชื่อวิธีการตามสิ่งที่ควรทำภายในเนื่องจากบางครั้งอาจมีการเปลี่ยนแปลงหรืออยู่ใน วิธีอื่น (ทดสอบได้มากกว่า)
โดมินิก

2
@JasonBourne นี่เป็นวิธีการปฏิบัติที่ถูกต้องและดีที่สุดและใช้ได้ทั้งสองกรณีโปรดดูที่jsfiddle.net/ferahl/b125o4z0
Dominic

26
นอกจากonCommentSubmitนี้คุณควรเรียกevent.preventDefault()และevent.stopPropagation()เพื่อป้องกันไม่ให้แบบฟอร์มโหลดหน้าซ้ำ (เนื่องจากเป็นแบบฟอร์มที่มีactionแอตทริบิวต์ว่างเปล่า)
jamesfzhang

1
หลีกเลี่ยงการโหลดหน้าซ้ำด้วยaction='#'แอตทริบิวต์ของformองค์ประกอบ
Terje Norderhaug

18

ใช้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>
      );
    }

18

เป็นเวลาไม่กี่ปีแล้วที่คำถามนี้ได้รับคำตอบล่าสุด React เปิดตัว "Hooks" ในปี 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เหตุการณ์เมื่อคอมโพเนนต์ถูกโหลดเป็นครั้งแรก จะลบตัวฟังเหตุการณ์เมื่อคอมโพเนนต์ถูกทำลาย


10

นี่คือวิธีที่คุณทำได้หากคุณต้องการฟังคีย์ "Enter" มี onKeydown prop ที่คุณสามารถใช้ได้และคุณสามารถอ่านเกี่ยวกับมันได้ในreact doc

และนี่คือ 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>
);
}

1

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

ป้อนรหัส heres บางครั้งใน popus มันจะใช้ไม่ได้กับการผูกแบบฟอร์มและส่งต่อ onSubmit ไปยังแบบฟอร์มเนื่องจากแบบฟอร์มอาจไม่มีการป้อนข้อมูลใด ๆ ในกรณีนี้หากคุณผูกเหตุการณ์เข้ากับเอกสารโดยการทำเช่น document.addEventListenerนี้จะทำให้เกิดปัญหาในส่วนอื่นของแอปพลิเคชันในการนับจำนวนนี้เพื่อแก้ปัญหานี้เราควรห่อแบบฟอร์มและควรใส่ข้อมูลที่ซ่อนไว้โดย css .. จากนั้นคุณ foucus กับอินพุตนั้นโดยการอ้างอิงมันจะทำงานได้อย่างไม่ถูกต้อง


0

ฉันได้สร้างคำตอบของ @ user1032613 และจากคำตอบนี้และสร้างตะขอ "เมื่อกด Enter click ที่มีสตริงข้อความค้นหา" สนุก!

const { useEffect } = require("react");

const useEnterKeyListener = ({ querySelectorToExecuteClick }) => {
    useEffect(() => {
        //https://stackoverflow.com/a/59147255/828184
        const listener = (event) => {
            if (event.code === "Enter" || event.code === "NumpadEnter") {
                handlePressEnter();
            }
        };

        document.addEventListener("keydown", listener);

        return () => {
            document.removeEventListener("keydown", listener);
        };
    }, []);

    const handlePressEnter = () => {
        //https://stackoverflow.com/a/54316368/828184
        const mouseClickEvents = ["mousedown", "click", "mouseup"];
        function simulateMouseClick(element) {
            mouseClickEvents.forEach((mouseEventType) =>
                element.dispatchEvent(
                    new MouseEvent(mouseEventType, {
                        view: window,
                        bubbles: true,
                        cancelable: true,
                        buttons: 1,
                    })
                )
            );
        }

        var element = document.querySelector(querySelectorToExecuteClick);
        simulateMouseClick(element);
    };
};

export default useEnterKeyListener;

นี่คือวิธีที่คุณใช้:

useEnterKeyListener({
    querySelectorToExecuteClick: "#submitButton",
});

https://codesandbox.io/s/useenterkeylistener-fxyvl?file=/src/App.js:399-407

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.