এন্টার কী টিপুন পরে চেঞ্জ ইভেন্টটি কল করতে


204

আমি বুটস্ট্র্যাপে নতুন এবং এই সমস্যায় আটকে আছি। আমার একটি ইনপুট ক্ষেত্র রয়েছে এবং আমি মাত্র একটি ডিজিট প্রবেশ করার সাথে সাথে ফাংশনটি কল করা 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
});

উত্তর:


404

প্রতিক্রিয়া ডকের মতে , আপনি কীবোর্ডের ইভেন্টগুলি শুনতে পেলেন , পছন্দ করেন 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');
    }
  }
});

আপডেট: ব্যবহার করুন প্রতিক্রিয়া। উপাদান

এখানে প্রতিক্রিয়া ব্যবহার করে কোডটি দেওয়া হচ্ছে যা একই জিনিসটি করে

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

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

এখানে জিসফিল

আপডেট 2: একটি কার্যকরী উপাদান ব্যবহার করুন

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

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

2
এবং আপনি onBlurইভেন্টটির বৈধতা প্রক্রিয়াটিও আবদ্ধ করতে চান ।
wct

5
ইনপুট পাঠ্যের রেফারেন্স সহ আরও কমপ্যাক্ট উপায়ে একই সমাধান:<input ref='reference' onKeyPress={(e) => {(e.key === 'Enter' ? doSomething(this.refs.reference.value) : null)}} />
যাদুঘর

5
@ মিউজমাইন্ড আসলে আপনার ব্যবহারের দরকার নেই ref<input onKeyPress={e => doSomething(e.target.value)}পর্যাপ্ত.
আবদ্ধ

4
@ মিউজমাইন্ড একটি ইনলাইন ফাংশনের পরিবর্তে কোনও শ্রেণি পদ্ধতি ব্যবহার করার বিষয়টি onKeyPressহ'ল ট্রিগার হওয়ার সময় প্রতিবার একটি নতুন ফাংশন তৈরি করা এড়ানো । এটি একটি সূক্ষ্ম পারফেক্ট উন্নতি।
মুছে ফেলুন

1
সংযুক্ত ফিডাল আর কাজ করছে না, দয়া করে পরীক্ষা করুন, যাইহোক সুন্দর উত্তর
পারদীপ জৈন

52

আপনি সরাসরি ইনপুট ক্ষেত্রে onPress কী ব্যবহার করতে পারেন। onChange ফাংশন প্রতিটি ইনপুট ক্ষেত্র পরিবর্তনে রাষ্ট্রীয় মান পরিবর্তন করে এবং এন্টার টিপানোর পরে এটি একটি ফাংশন অনুসন্ধান () অনুসন্ধান করবে।

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

এই উত্তরটি উপরের স্বীকৃত উত্তরের চেয়ে আমার পক্ষে কাজ করে।
কার্তিক শঙ্কর

আপনার যদি ভারী ফর্ম থাকে তবে আমি বাইরে রেন্ডার পদ্ধতির বাইরে ফাংশন তৈরি করতে এবং এটি রেফারেন্স হিসাবে পাস করার পরামর্শ দেব, onKeyPress={this.yourFunc}অন্যথায় প্রতিটি রেন্ডারে ফ্যাট অ্যারো ফাংশন তৈরি হবে।
ভিক্টর

এটি সেই ক্ষেত্রে কাজ করছে যেখানে অনকিপ্রেস ইভেন্টটি ইনপুট এবং পিতামাতার ক্ষেত্রেও লিখিত। ধন্যবাদ।
নবীন কুমার পিজি

বাonKeyPress={event => event.key === 'Enter' && this.search()}
ক্যামডেন_কিড

24

টিপে লিখুন যখন একটি ফর্ম নিয়ন্ত্রণ (ইনপুট) সালে ফোকাস সাধারণত একটি আরম্ভ করে submitফর্ম নিজেই (না ইনপুট) উপর (onsubmit) ঘটনা যাতে আপনি আপনার বেঁধে রাখতে পারত this.handleInputফর্ম onsubmit করতে।

বিকল্পভাবে আপনি এটিকে blur(অনব্লুর) ইভেন্টের সাথে আবদ্ধ করতে পারেন inputযা ঘটে যখন ফোকাসটি সরানো হয় (উদাহরণস্বরূপ পরবর্তী উপাদানটিতে ট্যাবিং করা যা ফোকাস পেতে পারে)


3
এটি ব্যবহারের চেয়ে অনেক বেশি পরিষ্কার onKeyPress
ব্ল্যাকাস

1
লক্ষ্য যেহেতু পৃথক, event.target.valueউপলভ্য নয়
ইজকাটা

@ ইজকাটা আপনি যা বলছেন তা একেবারে সঠিক; আমার উত্তরটির জন্য নিয়ামক handleInputপদ্ধতিতে জিনিসগুলি হ্যান্ডল করার ভিন্ন উপায়ের প্রয়োজন হতে পারে । আমার উত্তর অনুসারে করাটি আপনাকে উভয়ই কভার করবে যখন যখন ব্যবহারকারী চাপবে ইনপুটটিতে ফোকাস করার সময় প্রবেশ করবে এবং যখন একটি submitবোতাম / ইনপুট সক্রিয় করবে ।
লুকা

ইন অধিকাংশ ওয়েব পরিস্থিতিতে কোনো ফর্ম নেই, শুধু ইনপুট, আছে তাই এই উত্তর ব্যবহার-মামলা সংখ্যাগরিষ্ঠ এই প্রোগ্রামটিতে সাথে প্রাসঙ্গিক নয় অ্যাপ
VSync

@vncnc এটি সংখ্যাগরিষ্ঠের সাথে প্রাসঙ্গিক নাও হতে পারে তবে একটি অংশের জন্য এখনও বৈধ - এবং অবশ্যই ভুল নয়, আমি ভাবি না যে এটি একটি ডাউনটাওয়েটের মূল্য?
লুকা

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

আপনি হয় প্রতিটি কীস্ট্রোকের জন্য আপডেট করতে চান, বা মান জমা দিতে হবে। উপাদানটিতে মূল ইভেন্টগুলি যুক্ত করা কাজ করে তবে অফিসিয়াল ডক্সে প্রস্তাবিত বিকল্প রয়েছে।

নিয়ন্ত্রিত বনাম অনিয়ন্ত্রিত উপাদান

নিয়ন্ত্রিত

ডক্স থেকে - ফর্ম এবং নিয়ন্ত্রিত উপাদানগুলি :

এইচটিএমএলে, ইনপুট, টেক্সারিয়ার মতো উপাদান তৈরি করুন এবং সাধারণত তাদের নিজস্ব রাজ্য বজায় রাখুন এবং ব্যবহারকারীর ইনপুটের ভিত্তিতে আপডেট করুন। প্রতিক্রিয়া হিসাবে, পরিবর্তনীয় স্থিতি সাধারণত উপাদানগুলির রাজ্যের সম্পত্তিতে রাখা হয় এবং কেবল সেটস্টেট () দ্বারা আপডেট হয়।

প্রতিক্রিয়া রাষ্ট্রটিকে "সত্যের একক উত্স" হিসাবে তৈরি করে আমরা দুটোকে একত্রিত করতে পারি। তারপরে প্রতিক্রিয়াযুক্ত উপাদান যা কোনও ফর্ম রেন্ডার করে তা পরবর্তী ব্যবহারকারী ইনপুটতে সেই ফর্মটিতে কী ঘটে তাও নিয়ন্ত্রণ করে। একটি ইনপুট ফর্ম উপাদান যার মান এইভাবে প্রতিক্রিয়া দ্বারা নিয়ন্ত্রিত হয় তাকে "নিয়ন্ত্রিত উপাদান" বলা হয়।

আপনি যদি একটি নিয়ন্ত্রিত উপাদান ব্যবহার করেন তবে আপনাকে মানকে প্রতিটি পরিবর্তনের জন্য রাষ্ট্র আপডেট রাখতে হবে। এটি হওয়ার জন্য, আপনি একটি ইভেন্ট হ্যান্ডলারটিকে উপাদানটির সাথে আবদ্ধ করেন। দস্তাবেজের উদাহরণগুলিতে, সাধারণত অন চেঞ্জ ইভেন্ট।

উদাহরণ:

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তবে সঠিক স্থিতি আপডেট করতে এবং রাখার জন্য আপনার ফাংশনটি সর্বদা বরখাস্ত করা হবে। রাজ্যের সর্বদা আপডেট হওয়া মান থাকবে এবং ফর্মটি জমা দেওয়ার পরে, মানটি রাজ্য থেকে নেওয়া হবে। আপনার ফর্মটি খুব দীর্ঘ হলে এটি একটি কন হতে পারে, কারণ আপনাকে প্রতিটি উপাদানগুলির জন্য একটি ফাংশন তৈরি করতে হবে, বা এমন একটি সাধারণ লিখতে হবে যা প্রতিটি উপাদানটির মান পরিবর্তন করে।

অবশ

দস্তাবেজ থেকে - অনিয়ন্ত্রিত উপাদান

বেশিরভাগ ক্ষেত্রে, আমরা ফর্মগুলি প্রয়োগ করতে নিয়ন্ত্রিত উপাদানগুলি ব্যবহার করার পরামর্শ দিই। একটি নিয়ন্ত্রিত উপাদানগুলিতে, ফর্ম ডেটা একটি প্রতিক্রিয়া উপাদান দ্বারা পরিচালিত হয়। বিকল্পটি অনিয়ন্ত্রিত উপাদান, যেখানে ফর্ম ডেটা নিজেই ডিওএম দ্বারা পরিচালিত হয়।

একটি অনিয়ন্ত্রিত উপাদান লিখতে, প্রতিটি রাজ্যের আপডেটের জন্য ইভেন্ট হ্যান্ডলার লেখার পরিবর্তে, আপনি ডিওএম থেকে ফর্মের মান পেতে একটি রেফ ব্যবহার করতে পারেন।

এখানে মূল পার্থক্যটি হ'ল আপনি onChangeফাংশনটি ব্যবহার করবেন না , বরং onSubmitমানগুলি পেতে ফর্মটি ব্যবহার করুন এবং প্রয়োজনীয় হলে যাচাই করুন।

উদাহরণ:

1) ইভেন্ট হ্যান্ডলারকে আবদ্ধ করুন এবং কনস্ট্রাক্টরের ইনপুট থেকে ইনপুট তৈরি করুন (কোনও মানই রাজ্যে রাখা হয় না)

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ফাংশন বাঁধতে হবে না। ফর্মটি জমা দেওয়া হলে, মানটি ডিওএম থেকে নেওয়া হবে এবং প্রয়োজনীয় বৈধতা এই মুহুর্তে ঘটতে পারে। ইনপুট উপাদানগুলির জন্য কোনও হ্যান্ডলার ফাংশন তৈরি করার দরকার নেই।

আপনার সমস্যা

এখন, আপনার ইস্যুর জন্য:

... আমি যখন পুরো নম্বরটি প্রবেশ করানো হয় তখন 'এন্টার' চাপলে এটিকে ডাকতে চাই

আপনি যদি এটি অর্জন করতে চান তবে একটি অনিয়ন্ত্রিত উপাদান ব্যবহার করুন। এটি প্রয়োজন না হলে অন চেঞ্জ হ্যান্ডলারগুলি তৈরি করবেন না। enterকী ফর্ম জমা করবে এবং handleSubmitফাংশন বহিস্কার করা হবে না।

আপনার যে পরিবর্তনগুলি করতে হবে:

আপনার এলিমেন্টে অন চেঞ্জ কলটি সরিয়ে ফেলুন

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)}/>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.