প্রতিক্রিয়া ইনপুট ডিফল্টভ্যালু রাষ্ট্রের সাথে আপডেট হয় না


99

আমি প্রতিক্রিয়া সহ একটি সাধারণ ফর্ম তৈরি করার চেষ্টা করছি, তবে ফর্মটির ডিফল্টভ্যালুতে সঠিকভাবে বাঁধাই করা ডেটা হওয়াতে সমস্যা হচ্ছে।

আমি যে আচরণটি সন্ধান করছি তা হ'ল:

  1. আমি যখন আমার পৃষ্ঠাটি খুলি, পাঠ্য ইনপুট ক্ষেত্রটি আমার ডেটাবেজে আমার অ্যাওমেসেজের পাঠ্য দিয়ে পূরণ করা উচিত। এটি "নমুনা পাঠ্য"
  2. আদর্শভাবে আমি টেক্সট ইনপুট ক্ষেত্রে কোনও স্থানধারক পেতে চাই যদি আমার ডাটাবেসে অ্যাওমেসেজের কোনও পাঠ্য না থাকে।

তবে, এখনই, আমি খুঁজে পাচ্ছি যে প্রতিবার পৃষ্ঠাটি রিফ্রেশ করার সময় পাঠ্য ইনপুট ক্ষেত্রটি ফাঁকা। (যদিও আমি ইনপুটটিতে যা টাইপ করি তা সঠিকভাবে সংরক্ষণ করে এবং অবিচল থাকে I) আমি মনে করি কারণ এটি ইনপুট পাঠ্য ক্ষেত্রের এইচটিএমএল লোড হয় যখন অ্যাভমেসেজ একটি খালি অবজেক্ট থাকে তবে রিমুশ করে না যখন দূরেমেসেজ লোড হয়। এছাড়াও, আমি ক্ষেত্রের জন্য একটি ডিফল্ট মান নির্দিষ্ট করতে অক্ষম।

আমি স্বচ্ছতার জন্য কিছু কোড সরিয়েছি (যেমন: টগলচ্যাঞ্জ)

    window.Pages ||= {}

    Pages.AwayMessages = React.createClass

      getInitialState: ->
        App.API.fetchAwayMessage (data) =>
        @setState awayMessage:data.away_message
        {awayMessage: {}}

      onTextChange: (event) ->
        console.log "VALUE", event.target.value

      onSubmit: (e) ->
        window.a = @
        e.preventDefault()
        awayMessage = {}
        awayMessage["master_toggle"]=@refs["master_toggle"].getDOMNode().checked
        console.log "value of text", @refs["text"].getDOMNode().value
        awayMessage["text"]=@refs["text"].getDOMNode().value
        @awayMessage(awayMessage)

      awayMessage: (awayMessage)->
        console.log "I'm saving", awayMessage
        App.API.saveAwayMessage awayMessage, (data) =>
          if data.status == 'ok'
            App.modal.closeModal()
            notificationActions.notify("Away Message saved.")
            @setState awayMessage:awayMessage

      render: ->
        console.log "AWAY_MESSAGE", this.state.awayMessage
        awayMessageText = if this.state.awayMessage then this.state.awayMessage.text else "Placeholder Text"
        `<div className="away-messages">
           <div className="header">
             <h4>Away Messages</h4>
           </div>
           <div className="content">
             <div className="input-group">
               <label for="master_toggle">On?</label>
               <input ref="master_toggle" type="checkbox" onChange={this.onToggleChange} defaultChecked={this.state.awayMessage.master_toggle} />
             </div>
             <div className="input-group">
               <label for="text">Text</label>
               <input ref="text" onChange={this.onTextChange} defaultValue={awayMessageText} />
             </div>
           </div>
           <div className="footer">
             <button className="button2" onClick={this.close}>Close</button>
             <button className="button1" onClick={this.onSubmit}>Save</button>
           </div>
         </div>

অ্যাওম্যাসেজের জন্য আমার কনসোল.লগ নিম্নলিখিতটি দেখায়:

AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}

উত্তর:


63

defaultValue শুধুমাত্র প্রাথমিক লোডের জন্য

আপনি যদি ইনপুটটি আরম্ভ করতে চান তবে আপনার ডিফল্টভ্যালু ব্যবহার করা উচিত, তবে আপনি যদি মানটি পরিবর্তন করতে রাষ্ট্র ব্যবহার করতে চান তবে আপনাকে মানটি ব্যবহার করতে হবে। ব্যক্তিগতভাবে আমি কেবলমাত্র ডিফল্টভ্যালুটি ব্যবহার করতে চাই যদি আমি কেবল এটি আরম্ভ করি এবং তারপরে আমি জমা দেওয়ার সময় মানটি পেতে রেফ ব্যবহার করি। রিএ্যাক্ট ডক্সের রেফস এবং ইনপুট সম্পর্কিত আরও তথ্য রয়েছে, https://facebook.github.io/react/docs/forms.html এবং https://facebook.github.io/react/docs/working-with-the- ব্রাউজারhtml

আমি এখানে আপনার ইনপুটটি কীভাবে আবার লিখব:

awayMessageText = if this.state.awayMessage then this.state.awayMessage.text else ''
<input ref="text" onChange={this.onTextChange} placeholder="Placeholder Text" value={@state.awayMessageText} />

এছাড়াও আপনি নিজের মতো স্থানধারক পাঠ্যটি পাস করতে চান না কারণ এটি আসলে 'স্থানধারক পাঠ্যের' মান নির্ধারণ করবে। আপনাকে এখনও ইনপুটটিতে একটি ফাঁকা মান পাস করতে হবে কারণ অপরিজ্ঞাত এবং শূন্যকরণটি মূলত মানটিকে ডিফল্টভ্যালুতে পরিণত করে। https://facebook.github.io/react/tips/controlled-input-null-value.html

getInitialState এপিআই কল করতে পারে না

GetInitialState চালানোর পরে আপনাকে এপিআই কল করা দরকার। আপনার কেসটির জন্য আমি এটি কম্পোনেন্টডিডমাউন্টে করব। এই উদাহরণটি অনুসরণ করুন, https://facebook.github.io/react/tips/initial-ajax.html

আমি প্রতিক্রিয়া সহ উপাদান লাইফসাইকেলে পড়ার পরামর্শ দিই। https://facebook.github.io/react/docs/comp घटक-specs.html

পরিবর্তন এবং লোডিং রাষ্ট্রের সাথে পুনরায় লিখুন

ব্যক্তিগতভাবে আমি পুরোটা করতে পছন্দ করি না যদি অন্যথায় রেন্ডারে যুক্তি যুক্ত হয় এবং আমার রাজ্যে 'লোডিং' ব্যবহার করতে এবং ফর্মের লোডের আগে একটি ফন্ট ভয়ঙ্কর স্পিনার রেন্ডার করতে পছন্দ করে, http://fortawesome.github.io/Font- দুর্দান্ত / উদাহরণ / । আমি কী বলতে চাইছি তা আপনাকে এখানে দেখানোর জন্য একটি পুনর্লিখন এখানে। আমি সিজেএসএক্সের জন্য টিক্সগুলি যদি ভুল করে ফেলেছি তবে এটি সাধারণত কারণ আমি কেবল কফিস্ক্রিপ্ট ব্যবহার করি,।

window.Pages ||= {}

Pages.AwayMessages = React.createClass

  getInitialState: ->
    { loading: true, awayMessage: {} }

  componentDidMount: ->
    App.API.fetchAwayMessage (data) =>
      @setState awayMessage:data.away_message, loading: false

  onToggleCheckbox: (event)->
    @state.awayMessage.master_toggle = event.target.checked
    @setState(awayMessage: @state.awayMessage)

  onTextChange: (event) ->
    @state.awayMessage.text = event.target.value
    @setState(awayMessage: @state.awayMessage)

  onSubmit: (e) ->
    # Not sure what this is for. I'd be careful using globals like this
    window.a = @
    @submitAwayMessage(@state.awayMessage)

  submitAwayMessage: (awayMessage)->
    console.log "I'm saving", awayMessage
    App.API.saveAwayMessage awayMessage, (data) =>
      if data.status == 'ok'
        App.modal.closeModal()
        notificationActions.notify("Away Message saved.")
        @setState awayMessage:awayMessage

  render: ->
    if this.state.loading
      `<i className="fa fa-spinner fa-spin"></i>`
    else
    `<div className="away-messages">
       <div className="header">
         <h4>Away Messages</h4>
       </div>
       <div className="content">
         <div className="input-group">
           <label for="master_toggle">On?</label>
           <input type="checkbox" onChange={this.onToggleCheckbox} checked={this.state.awayMessage.master_toggle} />
         </div>
         <div className="input-group">
           <label for="text">Text</label>
           <input ref="text" onChange={this.onTextChange} value={this.state.awayMessage.text} />
         </div>
       </div>
       <div className="footer">
         <button className="button2" onClick={this.close}>Close</button>
         <button className="button1" onClick={this.onSubmit}>Save</button>
       </div>
     </div>

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

সামগ্রিকভাবে আমি পুরোপুরি প্রতিক্রিয়া ডক্সটি পড়ার পরামর্শ দেব এবং কিছু টিউটোরিয়াল করব। সেখানে প্রচুর ব্লগ রয়েছে এবং http://www.egghead.io এর কিছু ভাল টিউটোরিয়াল রয়েছে। আমার সাইটে http://www.openmindedinnovations.com- তেও কিছু জিনিস রয়েছে ।


শুধু কৌতূহল কেন প্রাথমিক অবস্থায় পেতে ভাল কোনও এপি কল করছে না? getInitialState কম্পোনেন্টডিডমাউন্টের ঠিক আগে কার্যকর করা হয় এবং এপিআই কল আসিঙ্ক হয়। এটি কি আরও প্রচলিত নাকি এর পিছনে অন্য কোনও কারণ রয়েছে?
মাচেল মাকারেভ 11'15

4
আমি কোথায় পড়েছি তা আমি ঠিক জানি না তবে আমি জানি আপনি সেখানে এপি কল করেন না। এখানে একটি গ্রন্থাগার রয়েছে যা এটি মোকাবেলার জন্য তৈরি করা হয়েছিল, github.com/andreypopp/react-async । তবে আমি সেই লাইব্রেরিটি ব্যবহার করব না এবং এটি কেবল উপাদান ডিডমাউন্টে রেখে দেব। আমি জানি যে প্রতিক্রিয়া সংক্রান্ত ডকুমেন্টেশনের টিউটোরিয়ালে এপিআই কলটিও কমপিউটারডিডমাউন্টে করে।
ব্লেইন হাতাব

@ মাচায়েলম্যাকারভ - কারণ এপিআই কলগুলি অ্যাসিঙ্ক, এবং গেটইনিশিয়াল স্টেট সমকালীনভাবে রাষ্ট্রটি ফিরিয়ে দেয়। সুতরাং, আপনার প্রাথমিক অবস্থাটি এপিআই কলটি শেষ হওয়ার আগে সেট আপ করা হবে।
ড্রাগন

4
মান সহ ডিফল্টভ্যালু প্রতিস্থাপন করা কি নিরাপদ? আমি জানি ডিফল্টভ্যালু কেবল আরম্ভের উপর চাপ দেয় তবে মানটি এটি করে বলে মনে হয়।
স্টিলথিসনে্যাকস

4
@ স্টেথলিসন্যাক্স মান ব্যবহার করা ঠিক আছে তবে এখন আপনাকে ইনপুটটির জন্য এমনকি কাজ করতে মানটি সেট করতে হবে। ডিফল্টভ্যালু কেবলমাত্র প্রাথমিক মান নির্ধারণ করে এবং ইনপুট পরিবর্তন করতে সক্ষম হবে তবে মানটি ব্যবহার করার সময় এটি এখন 'নিয়ন্ত্রিত'
ব্লেইন হাটাব

62

এটি ঠিক করার আরেকটি উপায় হ'ল ইনপুটটির পরিবর্তন key

<input ref="text" key={this.state.awayMessage ? 'notLoadedYet' : 'loaded'} onChange={this.onTextChange} defaultValue={awayMessageText} />

আপডেট: যেহেতু এটি উপবিষ্ট হয়, তাই আপনাকে বলতে হবে যে সামগ্রীটি লোড করার সময় আপনার সঠিকভাবে একটি disabledবা প্রপস থাকা উচিত readonly, তাই আপনি ux এর অভিজ্ঞতা হ্রাস করবেন না।

এবং হ্যাঁ, এটি সম্ভবত একটি হ্যাক, তবে এটি কাজটি সম্পন্ন করে .. ;-)


নিষ্পাপ বাস্তবায়ন - কী মান পরিবর্তিত হওয়ার সাথে সাথে একটি ইনপুট ফিল্ডের ফোকাস (উদাহরণস্বরূপ কী-আপ চলে গেল)
আর্থার কুশমান

4
হ্যাঁ, এটি কিছু ত্রুটিগুলি পেয়েছে তবে সহজেই কাজটি সম্পন্ন করে।
13:57

এটি স্মার্ট। আমি এটা ব্যবহার selectসঙ্গে keyযেমন defaultValueযা আসলে value
আভি

ইনপুটটির পরিবর্তনটি keyনতুন ইনপুটটিতে প্রতিফলিত হওয়ার মূল কী key আমি এটি type="text"সফলভাবে ব্যবহার করেছি ।
জ্যাকব নেলসন

3

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

<MagicInput type="text" binding={[this, 'awayMessage.text']} />

উপাদানটি দেখতে পারে:

window.MagicInput = React.createClass

  onChange: (e) ->
    state = @props.binding[0].state
    changeByArray state, @path(), e.target.value
    @props.binding[0].setState state

  path: ->
    @props.binding[1].split('.')
  getValue: ->
    value = @props.binding[0].state
    path = @path()
    i = 0
    while i < path.length
      value = value[path[i]]
      i++
    value

  render: ->
    type = if @props.type then @props.type else 'input'
    parent_state = @props.binding[0]
    `<input
      type={type}
      onChange={this.onChange}
      value={this.getValue()}
    />`

যেখানে অ্যারে দ্বারা পরিবর্তন হ'ল একটি অ্যারে দ্বারা প্রকাশিত পথ দ্বারা হ্যাশ অ্যাক্সেস ফাংশন

changeByArray = (hash, array, newValue, idx) ->
  idx = if _.isUndefined(idx) then 0 else idx
  if idx == array.length - 1
    hash[array[idx]] = newValue
  else
    changeByArray hash[array[idx]], array, newValue, ++idx 

0

প্রাথমিক মান নির্ধারণের সবচেয়ে নির্ভরযোগ্য উপায় হ'ল রেন্ডার () {addition ছাড়াও কম্পোনেন্টডিডমাউন্ট () {use ব্যবহার করা:

... 
componentDidMount(){

    const {nameFirst, nameSecond, checkedStatus} = this.props;

    document.querySelector('.nameFirst').value          = nameFirst;
    document.querySelector('.nameSecond').value         = nameSecond;
    document.querySelector('.checkedStatus').checked    = checkedStatus;        
    return; 
}
...

আপনি কোনও উপাদানকে ধ্বংস করা এবং এটির সাথে নতুনটি প্রতিস্থাপন করা সহজ মনে করতে পারেন

<input defaultValue={this.props.name}/>

এটার মত:

if(document.querySelector("#myParentElement")){
    ReactDOM.unmountComponentAtNode(document.querySelector("#myParentElement"));
    ReactDOM.render(
        <MyComponent name={name}  />,
        document.querySelector("#myParentElement")
    );
};

আপনি আনমাউন্ট পদ্ধতির এই সংস্করণটিও ব্যবহার করতে পারেন:

ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);

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

0

"প্লেসহোল্ডার" প্যারামিটারকে মান দিন। উদাহরণ স্বরূপ :-

 <input 
    type="text"
    placeHolder="Search product name."
    style={{border:'1px solid #c5c5c5', padding:font*0.005,cursor:'text'}}
    value={this.state.productSearchText}
    onChange={this.handleChangeProductSearchText}
    />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.