React giriş metin alanına yazılamıyor


111

İlk React.js parçamı deniyorum ve erkenden şaşkına döndüm ... Aşağıdaki koda sahibim, bu da içinde bir arama formu oluşturuyor <div id="search"></div>. Ancak arama kutusuna yazmak hiçbir şey yapmaz.

Muhtemelen sahne ve durumları yukarı ve aşağı geçerken bir şeyler eksik oluyor ve bu yaygın bir sorun gibi görünüyor. Ama şaşkınım - eksik olanı göremiyorum.

var SearchFacet = React.createClass({
  handleChange: function() {
    this.props.onUserInput(
      this.refs.searchStringInput.value
    )
  },
  render: function() {
    return (
      <div>
        Search for:
        <input
          type="text"
          value={this.props.searchString}
          ref="searchStringInput"
          onchange={this.handleChange} />
      </div>
    );
  }
});

var SearchTool = React.createClass({
  render: function() {
    return (
      <form>
        <SearchFacet 
          searchString={this.props.searchString}
          onUserInput={this.props.onUserInput}
         />
        <button>Search</button>
      </form>
    );
  }
});

var Searcher = React.createClass({
  getInitialState: function() {
    return {
      searchString: ''
    }
  },

  handleUserInput: function(searchString) {
    this.setState({
      searchString: searchString
    })
  },

  render: function() {
    return (
      <div>
        <SearchTool 
          searchString={this.state.searchString}
          onUserInput={this.handleUserInput}
        />
      </div>
    );
  }
});

ReactDOM.render(
  <Searcher />,
  document.getElementById('searcher')
);

(Sonunda başka türlere sahip SearchFacet*olacağım ama sadece bunu çalıştırmaya çalışıyorum.)


thisMetin alanını girerken günlüğe kaydetmeyi deneyin . Artık bileşen o thisolmayabilir Searcher.
FaureHu

Teşekkürler FaureHu - thiskodun hangi noktasında oturum açmak ? Oturum açmaya çalışıyor Searcher.handleUserInput()veya SearchFacet.handleChange()hiçbir şey yapmıyor.
Phil Gyford

benzer sorular için cevabımı görebilirsiniz. Ayrıntılı açıklamayı bulabilirsiniz: stackoverflow.com/questions/34713718/…
prudhvi seeramreddi

Yanıtlar:


80

Sen düzgün kasalı değil onchangede pervane input. onChangeJSX biçiminde olması gerekir.

<input
  type="text"
  value={this.props.searchString}
  ref="searchStringInput"
  onchange={this.handleChange} <--[should be onChange]
/>  

Bir valuepervaneyi an'a geçirme <input>ve ardından bir onChangeişleyici kullanarak kullanıcı etkileşimine yanıt olarak iletilen değeri bir şekilde değiştirme konusu , belgelerde oldukça iyi ele alınmıştır .

Kontrollü Bileşenler olarak bu tür girdilere atıfta bulunurlar ve bunun yerine DOM'un, girdinin değerini ve kullanıcıdan sonraki değişiklikleri Kontrolsüz Bileşenler olarak yerel olarak işlemesine izin veren girdilere atıfta bulunurlar .

Bir değişkenin valuepropunu bir inputdeğişkene ayarladığınızda, Kontrollü Bileşeniniz olur . Bu , değişkenin değerini bazı programatik yollarla değiştirmeniz gerektiği anlamına gelir, aksi takdirde girdi bu değeri her zaman tutacaktır ve siz yazsanız bile asla değişmeyecektir - yazarken değerini güncellemek için girdinin yerel davranışı geçersiz kılınır React burada.

Yani, bu değişkeni durumdan doğru bir şekilde alıyorsunuz ve tüm iyi ayarlanmış durumu güncellemek için bir işleyiciniz var. Sorun, işleyiciye sahip onchangeolup olmadığınız ve onChangeişleyicinin asla çağrılmaması ve bu nedenle valuegirdiyi yazdığınızda hiçbir zaman güncellenmemesiydi. Kullanmak yaptığınızda onChangeişleyicisi olan denilen value edilir yazarken güncellenen ve değişiklikleri görmek.


201

Kullanmak value={whatever}onu giriş alanına yazamayacağınız şekilde yapacaktır. Kullanmalısınız defaultValue="Hello!".

Bkz https://facebook.github.io/react/docs/uncontrolled-components.html#default-values

Ayrıca, @davnicwil'in onchangebelirttiği onChangegibi olmalıdır .


2
Gereksinimimde, enable yazarak alanı girmek istedim ve bunun bir durum değişkeninden gelen varsayılan değere ayarlanması gerekiyor. defaultValue özniteliği iyiydi ancak durum değişikliklerine göre varsayılan değeri güncellemede bir sorun var, varsayılan değeri değiştirmeye zorlamanın bir yolu var mı?
semira

1
Bu sorunu Stackoverflow'da başka bir soru olarak göndermelisiniz.
Ivan

1
@GeoffreyHale Ne kadar yanıltıcı olduğundan ne demek istediğinizden tam olarak emin değilim. State: codepen.io/anon/pen/BQJZwr?editors=0010 kullanmayan bu örneğe bakın . Ya da bunu yapan: codepen.io/anon/pen/JbMJMX?editors=0010
Ivan

4
@Ivan Haklısın, ikisi de değişmez: value={whatever}ve value={this.state.myvalue} . Bunun yerine şu açıklamayı yapmalıydım : kullanma onChange={this.handleChange}ve benzeri herhangi bir şey handleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },alanları yeniden değişken hale getirir.
Geoffrey Hale

1
@Ivan Bu sadece bana yardımcı oldu çok teşekkür defaultValueederim günümü kurtarmak.
Code Cooker

11

Bunun nedeni, onChange işlevinin girdide belirtilen doğru değeri güncellemiyor olması olabilir.

Misal:

<input type="text" value={this.state.textValue} onChange = {this.changeText}></input>

 changeText(event){
        this.setState(
            {textValue : event.target.value}
        );
    }

onChange işlevinde belirtilen değer alanını güncelleyin.


Teşekkürler, çok yardımcı. Sadece cevabınız sorunun nasıl çözüleceğini tam olarak açıklar.
M3RS

bu changeText işlevi nerede tanımlanır?
Jitendra Pancholi

İşlevin içinde durumsuz bir bileşense ve yapıcının içinde bir sınıf bileşeniyse.
Gal Grünfeld

setState içine this.state yazmanıza gerek yok. SetState içinde yalnızca textValue: event.target.value yazarsanız, aynı zamanda mükemmel çalışır
Pardeep Sharma

4

Benim de aynı problemim var ve benim durumumda redüktörü düzgün enjekte ettim ama yine de sahada yazamadım. Bu kullanıyorsanız çıkıyor immutablekullanmak zorunda redux-form/immutable.

import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{

    form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */

Durumunuzun state->formaksi halde olduğu gibi olması gerektiğine dikkat edin , kütüphaneyi açıkça yapılandırmanız gerekir, aynı zamanda state için de olmalıdır form. bu sorunu gör


4

Benim için aşağıdaki basit değişiklik mükemmel çalıştı

<input type="text" 
        value={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* does not work */}

Değiştir ... değer = {myPropVal}, ... defaultValue = {myPropVal}

<input type="text" 
        defaultValue={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}

Bu benim için sorunu çözdü.
mikeym

Formik içinde kullanıldığında onChange düzgün çalışmıyor diye düşünüyorum. Bunu ben de deniyordum ama benim için işe yaramadı. Lütfen buraya bir bakar mısınız? stackoverflow.com/questions/61689720/…
a125

0

Sınıf bileşeni bağlamında ...

ChangeHandler yöntemi normal bir işlevse:

handleChange(e){
    this.setState({[e.target.name]:[e.target.value]});
}

bunun gibi kullanılabilir ...onChange={(e)=>this.handleChange(e)}

<input type="text" name="any" value={this.state.any} onChange={(e)=>this.handleChange(e)}></input>

ChangeHandler yöntemi bir ok işleviyse:

handle = (e) =>{
        this.setState({[e.target.name]:[e.target.value]});
    }

bu şekilde kullanılabilir ... onChange={this.handle}

 <input type="text" name="any2" value={this.state.any2} onChange={this.handle} ></input>

Ve bu benim "React giriş metin alanına yazamıyorum" sorunumu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.