React.js ফর্ম উপাদানগুলিতে রাজ্য বা রেফ ব্যবহার করবেন?


116

আমি React.js দিয়ে শুরু করছি এবং আমি একটি সহজ ফর্মটি করতে চাই তবে নথিপত্রে আমি এটি করার দুটি উপায় খুঁজে পেয়েছি।

প্রথম এক ব্যবহার করছে refs :

var CommentForm = React.createClass({
  handleSubmit: function(e) {
    e.preventDefault();
    var author = React.findDOMNode(this.refs.author).value.trim();
    var text = React.findDOMNode(this.refs.text).value.trim();
    if (!text || !author) {
      return;
    }
    // TODO: send request to the server
    React.findDOMNode(this.refs.author).value = '';
    React.findDOMNode(this.refs.text).value = '';
    return;
  },
  render: function() {
    return (
      <form className="commentForm" onSubmit={this.handleSubmit}>
        <input type="text" placeholder="Your name" ref="author" />
        <input type="text" placeholder="Say something..." ref="text" />
        <input type="submit" value="Post" />
      </form>
    );
  }
});

এবং দ্বিতীয়টি প্রতিক্রিয়া উপাদানটির অভ্যন্তরে রাষ্ট্র ব্যবহার করছে :

var TodoTextInput = React.createClass({
  getInitialState: function() {
    return {
      value: this.props.value || ''
    };
  },

  render: function() /*object*/ {
    return (
      <input className={this.props.className}
      id={this.props.id}
      placeholder={this.props.placeholder}
      onBlur={this._save}
      value={this.state.value}
      />
    );
  },

  _save: function() {
    this.props.onSave(this.state.value);
    this.setState({value: ''
  });
});

আমি দুটি বিকল্পের পক্ষে মতামত দেখতে পাচ্ছি না, যদি কিছু বিদ্যমান থাকে। ধন্যবাদ।


আমি কি এখানে কিছু মিস করছি? আপনি ফর্মের মানগুলি পেতে ইভেন্ট অবজেক্টটি কেন ব্যবহার করবেন না? এখানে প্রথম স্থানে ফর্মটি ব্যবহার করার একমাত্র কারণ বলে মনে হয়। আপনি যদি ডিফল্ট সাবমিট আচরণ ব্যবহার না করে থাকেন এবং ইনপুটগুলিতে রেফ ব্যবহার করেন তবে আপনাকে সেগুলিকে কোনও ফর্মে মোড়ানোর দরকার নেই।
অমৃতসফট

উত্তর:


143

সংক্ষিপ্ত সংস্করণ: রেফারস এড়ানো।


এগুলি রক্ষণাবেক্ষণের পক্ষে খারাপ, এবং ডাব্লুওয়াইএসআইওয়াইওয়াইজি মডেল রেন্ডারগুলির সরলতার অনেকটাই হারায়।

আপনার একটি ফর্ম আছে। ফর্মটি পুনরায় সেট করতে আপনাকে একটি বোতাম যুক্ত করতে হবে।

  • refs:
    • ডিওএম চালনা
    • রেন্ডারটি বর্ণনা করে যে 3 মিনিট আগে ফর্মটি কেমন দেখাচ্ছে
  • অবস্থা
    • setState
    • রেন্ডারটি বর্ণনা করে যে ফর্মটি কেমন দেখাচ্ছে

আপনার কাছে একটি ইনপুটটিতে একটি সিসিভি নম্বর ক্ষেত্র এবং আপনার অ্যাপ্লিকেশনটিতে এমন কিছু ক্ষেত্র রয়েছে যা সংখ্যা। এখন আপনি কেবল সংখ্যা প্রবেশ করে ব্যবহারকারীকে প্রয়োগ করতে হবে।

  • refs:
    • একটি অন চেঞ্জ হ্যান্ডলার যুক্ত করুন (আমরা কি এড়াতে রেফ ব্যবহার করছি না?)
    • যদি এটির সংখ্যা না হয় তবে onChange এ ডমটি ম্যানিপুলেট করুন
  • অবস্থা
    • আপনার ইতিমধ্যে একটি অন চেঞ্জ হ্যান্ডলার রয়েছে
    • একটি if বিবৃতি যোগ করুন, যদি এটি অবৈধ কিছু না করে
    • রেন্ডার কেবল তখনই বলা হয় যদি এটির ভিন্ন ফলাফল হতে চলে

হ্যাঁ, কোনও বিষয় নয়, প্রধানমন্ত্রী চান যে এটি কেবলমাত্র একটি রেড বক্স-শ্যাডো অবৈধ হলে।

  • refs:
    • অন ​​চেঞ্জ হ্যান্ডলারটি কেবল ফোর্সআপটেট বা কিছু কল করুন?
    • উপর ভিত্তি করে আউটপুট রেন্ডার করা ... হাহ?
    • আমরা কোথায় রেন্ডারে যাচাইয়ের মান পাই?
    • কোনও উপাদানটির ক্লাসের নাম ডোম সম্পত্তিটি ম্যানুয়ালি ব্যবহার করতে চান?
    • আমি শেষ
    • রেফস ছাড়া নতুন করে লিখুন?
    • রেন্ডারে ডোম থেকে পড়ুন আমরা মাউন্ট করা থাকলে অন্যথায় বৈধ বলে ধরে নিই?
  • অবস্থা:
    • যদি বিবৃতি অপসারণ
    • এই স্টেটের উপর ভিত্তি করে রেন্ডারটি বৈধতা তৈরি করুন

আমাদের পিতামাতার কাছে নিয়ন্ত্রণ ফিরিয়ে দেওয়া দরকার। ডেটা এখন প্রপসগুলিতে রয়েছে এবং আমাদের পরিবর্তনের ক্ষেত্রে প্রতিক্রিয়া জানাতে হবে।

  • refs:
    • কম্পোনেন্টডিডমাউন্ট, উপাদান-উইলআপডেট এবং কম্পোনেন্টডিডআপেট প্রয়োগ করুন
    • পূর্ববর্তী প্রপস ম্যানুয়ালি পৃথক
    • পরিবর্তনগুলির সর্বনিম্ন সেট দিয়ে ডোমকে হেরফের করুন
    • Hey! আমরা প্রতিক্রিয়া প্রতিক্রিয়া বাস্তবায়ন করছি ...
    • আরও আছে, তবে আমার আঙ্গুলগুলি আঘাত করেছে
  • অবস্থা:
    • sed -e 's/this.state/this.props/' 's/handleChange/onChange/' -i form.js

লোকেরা মনে করে রেফগুলি এটিকে রাজ্যে রাখার চেয়ে 'সহজ'। এটি প্রথম 20 মিনিটের জন্য সত্য হতে পারে, এটি আমার অভিজ্ঞতা পরে সত্য নয়। "হ্যাঁ, আমি এটি 5 মিনিটের মধ্যে শেষ করে ফেলব" বলার মতো অবস্থানে আপনার নিজেকে রাখুন "অবশ্যই, আমি কেবলমাত্র কয়েকটি উপাদান পুনর্লিখন করব"।


3
আপনি সেড-এর / এই.স্টেট / এই.পড়লগুলি / 'এর / হ্যান্ডেলচঞ্জ / অন চেঞ্জ /' -আই ফর্ম.জেএস সম্পর্কে আরও কিছু ব্যাখ্যা করতে পারেন?
গ্যাব্রিয়েলগিউসি

1
না আমি ডোমের আসল পরিবর্তন বলতে চাইছি। React.findDOMNode(this.refs.foo)। আপনি যদি পরিবর্তন করেন তবে this.refs.foo.props.barকিছুই হবে না।
ব্রিগেন্ড

1
উদাহরণস্বরূপ, যদি আপনি প্রপসগুলিতে কলব্যাক (গুলি) কল করতে আপনার হ্যান্ডেল চেঞ্জ ফাংশন (গুলি) এ <input onChange={this.handleChange} value={this.state.foo} />এটি পরিবর্তন করেন <input onChange={this.props.handleChange} value={this.props.foo} />বা পরিবর্তন করেন। যেভাবেই হোক, এটি কয়েকটি ছোট স্পষ্ট পরিবর্তন changes
ব্রিগেন্ড

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

2
কোনও স্ক্রিনে 50+ ইনপুট থাকা যেকোনো রাষ্ট্রীয় পরিবর্তনের জন্য প্রতিটি রেন্ডারিং অনাকাঙ্ক্ষিত। প্রতিটি inputক্ষেত্রের সমন্বিতকরণ যেখানে প্রতিটি তার নিজস্ব রাষ্ট্র বজায় রাখে তা আদর্শ। এক পর্যায়ে আমাদের কয়েকটি বৃহত্তর মডেলের সাথে এই বিভিন্ন স্বাধীন রাষ্ট্রের পুনর্মিলন করা দরকার। হতে পারে আমাদের একটি টাইমার উপর একটি অটোসভ আছে, বা আমরা কেবল componentWillUnmountএটিই সংরক্ষণ করি যেখানে আমি refsআদর্শ পাই , পুনর্বিবেচনার সময় আমরা stateপ্রত্যেকের কাছ থেকে মানটি কেড়ে ফেলি ref, এবং বুদ্ধিমান কেউ নয়। আমি বেশিরভাগ ক্ষেত্রেই একমত stateউত্তর, কিন্তু একটি বড় সংখ্যা দিয়ে inputs, একটি সঠিক ব্যবহার refsপ্যাটার্ন একটি কার্যকারিতা বর
হাল্কা

105

আমি কিছু লোক উপরের উত্তরটিকে "কখনই রেফ ব্যবহার করি না" এর কারণ হিসাবে উদ্ধৃত করে দেখেছি এবং আমি আমার (পাশাপাশি কয়েকটি অন্যান্য প্রতিক্রিয়া দেবের সাথে কথা বলেছি) মতামত দিতে চাই।

উপাদানগুলির দৃষ্টান্তের জন্য তাদের ব্যবহার করার বিষয়ে কথা বলার সময় "রেফ ব্যবহার করবেন না" অনুভূতিটি সঠিক। অর্থ, আপনার কাছে উপাদানগুলির দৃষ্টান্তগুলি ধরার উপায় এবং সেগুলি কল করার পদ্ধতি হিসাবে আপনার রেফ ব্যবহার করা উচিত নয়। এটিই রেফ ব্যবহার করার ভুল উপায় এবং যখন রেফগুলি দ্রুত দক্ষিণে চলে যায়।

রেফগুলি ব্যবহারের সঠিক (এবং খুব দরকারী) উপায়টি হল আপনি যখন ডিওএম থেকে কিছু মূল্য পেতে তাদের ব্যবহার করছেন। উদাহরণস্বরূপ, আপনার যদি কোনও ইনপুট ক্ষেত্র যদি সেই ইনপুটটিতে কোনও রেফ সংযুক্ত করে থাকে তবে পরে রেফের মাধ্যমে মানটি ধরে নেওয়া ঠিক। এই উপায় ছাড়াই, আপনার ইনপুট ক্ষেত্রটি আপনার স্থানীয় রাজ্য বা আপনার ফ্লাক্স স্টোরের সাথে আপডেট রাখার জন্য আপনাকে মোটামুটি অর্কেস্ট্রেটেড প্রক্রিয়াটি অতিক্রম করতে হবে - যা অপ্রয়োজনীয় বলে মনে হয়।

2019 সম্পাদনা: ভবিষ্যতের হ্যালো বন্ধুরা। আমি কয়েক বছর আগে যা উল্লেখ করেছি তা ছাড়াও Re, রিঅ্যাক্ট হুক্স সহ, রেফার্সগুলি রেন্ডারগুলির মধ্যে ডেটা ট্র্যাক করার একটি দুর্দান্ত উপায় এবং কেবল ডিওএম নোডগুলি ধরে রাখার মধ্যে সীমাবদ্ধ নয়।


3
আপনার শেষ অনুচ্ছেদটি নিখুঁতভাবে অনুধাবন করে, তবে আপনি কি আপনার দ্বিতীয় অনুচ্ছেদটি পরিষ্কার করতে পারেন? কোন উপাদান উদাহরণ দখল এবং ভুল হিসাবে বিবেচিত হবে এমন একটি পদ্ধতি কল করার একটি দৃ concrete় উদাহরণ কী?
ড্যানি লিবিন

2
আমি এই সাথে একমত। ক্ষেত্রের মানটির বৈধতা বা হেরফের করার প্রয়োজন না হওয়া পর্যন্ত আমি রেফগুলি ব্যবহার করি। যদি প্রোগ্রামের ভিত্তিতে পরিবর্তন বা মান পরিবর্তন করার জন্য আমার প্রয়োজন হয়, তবে আমি স্থিতি ব্যবহার করি।
ক্রিস্টোফার ডেভিস

1
আমি ভাল হিসাবে এই সঙ্গে একমত। আবিষ্কারের ধাপের সময় আমি উদ্দেশ্যমূলকভাবে নেভেটের সাথে প্রচুর সংখ্যক ইনপুট যুক্ত একটি স্ক্রিনে পৌঁছেছি। আইডি দ্বারা কীড করা মানচিত্রে (রাজ্যে) সমস্ত ইনপুট মান সংরক্ষণ করা হয়। বলা বাহুল্য, চেকবাক্স ক্লিকের কারণে এই ধরনের ছোটখাটো UI পরিবর্তনগুলিতে স্টেট সেট করা এবং 50+ ইনপুট (কিছু উপাদান-ইউআই, যা ভারী ছিল!) রেন্ডারিংয়ের পরে থেকে পারফরম্যান্স ক্ষতিগ্রস্থ হয়েছিল। প্রতিটি ইনপুট সংযুক্ত করা যা নিজের রাষ্ট্র বজায় রাখতে পারে উপযুক্ত পদ্ধতির জন্য মনে হয়েছিল। যদি পুনর্মিলন প্রয়োজন হয়, কেবল এর মধ্যে লক্ষ্য করুন refsএবং রাষ্ট্রীয় মান পান। এটি আসলে একটি দুর্দান্ত প্যাটার্নের মতো বলে মনে হচ্ছে।
লাক্স

2
আমি পুরোপুরি একমত. গৃহীত উত্তরটি আমার মতে খুব অস্পষ্ট।
জেমস রাইট

আমি রাজী. একটি সাধারণ ফর্ম উপাদান ডিজাইন করার সময়, এটি নিয়ন্ত্রিত উপাদানগুলির ব্যথা পয়েন্টগুলি আলোকিত করে এবং ফোকাস পরিচালনা করে, ত্রুটি পরিচালনা করে etc. বাস্তবে পরিষ্কার আর্কিটেকচার পাওয়া সম্ভব নয়। প্রয়োজনে আমার সাথে কথা বলুন। আমি আমার উপাদানগুলি রেফগুলিতে নিয়ে যাচ্ছি।
কুশলভম

6

টিএল; ডিআর সাধারণভাবে বলতে গেলে, refsরিএ্যাক্টের ঘোষণামূলক দর্শনের বিরুদ্ধে যান , সুতরাং আপনার এটিকে একটি শেষ অবলম্বন হিসাবে ব্যবহার করা উচিত। state / propsযখনই সম্ভব ব্যবহার করুন ।


আপনি কোথায় refsবনাম ব্যবহার করেন তা বুঝতে state / props, আসুন প্রতিক্রিয়া অনুসরণ করা কিছু নকশা নীতিগুলি দেখুন।

প্রতি প্রতিক্রিয়া ডকুমেন্টেশন সম্পর্কেrefs

ঘোষিতভাবে করা যায় এমন কোনও কিছুর জন্য রেফ ব্যবহার করা এড়িয়ে চলুন।

প্রতি প্রতিক্রিয়া ডিজাইনের মূলনীতি সম্পর্কে এস্কেপ hatches

অ্যাপস তৈরির জন্য দরকারী কিছু প্যাটার্ন যদি ঘোষণামূলক উপায়ে প্রকাশ করা শক্ত হয় তবে আমরা এটির জন্য একটি অত্যাবশ্যকীয় API সরবরাহ করব। (এবং তারা এখানে রেফারেন্স লিঙ্ক)

যার অর্থ প্রতিক্রিয়াশীলদের টিম প্রতিক্রিয়াশীল / ঘোষণামূলক উপায়ে করা যায় এমন কোনও কিছুর জন্য এড়াতে refsএবং ব্যবহার করার পরামর্শ দেয় state / props

@ টাইলার ম্যাকগিনিস খুব ভাল উত্তর দিয়েছেন , তা উল্লেখ করে

রেফ ব্যবহার করার সঠিক (এবং খুব দরকারী) উপায়টি হল আপনি যখন ডিওএম থেকে কিছু মান অর্জন করতে সেগুলি ব্যবহার করছেন ...

আপনি এটি করতে পারার সময়, আপনি প্রতিক্রিয়া দর্শনের বিরুদ্ধে কাজ করবে। আপনার যদি কোনও ইনপুটতে মান থাকে তবে তা অবশ্যই আসে state / props। কোডটি ধারাবাহিক এবং অনুমানযোগ্য রাখতে আপনার state / propsপাশাপাশি সেখানে আটকে থাকা উচিত । আমি এই সত্যটি স্বীকার করি যে refsকখনও কখনও আপনাকে দ্রুত সমাধান দেয়, সুতরাং যদি আপনি ধারণার প্রমাণ করেন তবে দ্রুত এবং নোংরা গ্রহণযোগ্য।

এটা আমাদের বিভিন্ন সঙ্গে ছেড়ে কংক্রিট ব্যবহারের ক্ষেত্রে জন্যrefs

ফোকাস, পাঠ্য নির্বাচন বা মিডিয়া প্লেব্যাক পরিচালনা করা। অপরিহার্য অ্যানিমেশনগুলি ট্রিগার করা। তৃতীয় পক্ষের ডিওএম লাইব্রেরিতে একীকরণ করা হচ্ছে।


5

এই পোস্টটি পুরানো।

আমি এই বিষয়ে একটি ক্ষেত্রে আমার ছোট অভিজ্ঞতা শেয়ার করব।

আমি প্রচুর 'গতিশীল' ইনপুট এবং প্রচুর ক্যাশে ডেটা যুক্ত করে একটি বড় উপাদান (414 লাইন) নিয়ে কাজ করছিলাম। (আমি পৃষ্ঠায় একা কাজ করছি না, এবং আমার সংবেদনগুলি আমাকে বলে যে কোডের গঠন সম্ভবত আরও ভাল বিভাজন করা যেতে পারে, তবে এটি বিন্দু নয় (ভাল, এটি হতে পারে তবে আমি এটি নিয়ে কাজ করছি))

ইনপুটগুলির মানগুলি পরিচালনা করতে আমি প্রথমে রাষ্ট্রের সাথে কাজ করেছি:

  const [inputsValues, setInputsValues] = useState([])
  const setInputValue = (id, value) => {
    const arr = [...inputsValues]
    arr[id] = value
    setInputsValues(arr)
  }

এবং অবশ্যই ইনপুট:

value={inputsValues[id] || ''}
onChange={event => setInputValue(id, event.target.value)}

রেন্ডারিং এত ভারী ছিল যে ইনপুট পরিবর্তনটি **** হিসাবে চপ্পি হয়েছিল (কীটি নীচে রাখার চেষ্টা করবেন না, পাঠ্য কেবল বিরতি দেওয়ার পরে প্রদর্শিত হবে)

আমি নিশ্চিত যে আমি রেফ ব্যবহার করে এড়াতে পারব।

এভাবে শেষ হয়েছে:

  const inputsRef = useRef([])

এবং ইনপুটগুলিতে:

ref={input => (inputsRef.current[id] = input)}

[আমার ক্ষেত্রে ইনপুটটি ম্যাটেরিয়াল-ইউআই টেক্সটফিল্ড ছিল তাই এটি ছিল:

inputRef={input => (inputsRef.current[id] = input)}

]

এর জন্য ধন্যবাদ, এখানে কোনও পুনর্নির্মাণ নেই, ইনপুটটি মসৃণ, ফানকুনিয়ালিটি একইভাবে কাজ করে। এটি চক্র এবং গণনা সংরক্ষণ করবে, তাই শক্তিও। পৃথিবীর জন্য এটি করুন x)

আমার উপসংহার: ইনপুট মানের জন্য ব্যবহারের রেফ এমনকি প্রয়োজন হতে পারে।

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