Bir React bileşenini setState öğesini çağırmadan yeniden oluşturmaya zorlayabilir misiniz?


690

Değişiklikleri dinlemek istediğim harici (bileşene), gözlemlenebilir bir nesnem var. Nesne güncellendiğinde değişiklik olayları yayar ve herhangi bir değişiklik algılandığında bileşeni yeniden göndermek istiyorum.

Bir üst seviye ile React.renderbu mümkün olmuştur, ancak bir bileşen içinde işe yaramaz ( renderyöntem sadece bir nesne döndürdüğü için mantıklıdır ).

İşte bir kod örneği:

export default class MyComponent extends React.Component {

  handleButtonClick() {
    this.render();
  }

  render() {
    return (
      <div>
        {Math.random()}
        <button onClick={this.handleButtonClick.bind(this)}>
          Click me
        </button>
      </div>
    )
  }
}

Düğmeyi dahili olarak tıklatmak this.render(), ancak gerçekte renderlemenin gerçekleşmesine neden olan şey değildir (tarafından oluşturulan metin {Math.random()}değişmediği için bunu eylemde görebilirsiniz ). Ancak, sadece this.setState()yerine aramak this.render(), iyi çalışıyor.

Benim soru olduğunu, So: do Tepki bileşenler ihtiyaç rerender amacıyla devlet var mı? Durumu değiştirmeden bileşeni talep üzerine güncellemeye zorlamanın bir yolu var mı?


7
Kabul cevabı diyor this.forceUpdate()tüm cevapları ve çok sayıda yorumların kalanı kullanılmasına karşıdır oysa doğru çözümdür forceUpdate(). O zaman sorunun henüz uygun bir çözüm / cevap alamadığını söylemek iyi olur mu?
adi

7
İstisna cevap o zaman sorumu yanıtladı. Teknik olarak aradığım cevap, ve hala doğru cevabı düşünüyorum. Sanırım diğer cevaplar da aynı soruyu bilenler için iyi ek bilgilerdir.
Philip Walton

İlginçtir ki, STATE'DE HERHANGİ BİR ŞEYİ düz bir nesneye başlatmak dışında bir şeye İHTİYACINIZ YOKTUR, ardından this.setState ({}) çağrısı yeni bir render işlemini tetikler. Tepki harika ama bazen garip. Bu nedenle, fazladan tesisat olmadan veya bileşen örneği başına veriler hakkında endişelenmeden bir değişikliği tetiklediğinde doğrudan depo verileri arasında geçiş yapabilirsiniz.
Jason Sebring

Genel olarak evet derdim. Zorla güncelleme kullanıyorsanız, bu, uygulamanızın durum yönetimi dışındaki değişikliklere bağlı olabilecek bileşenleri güncellemek içindir. Buna iyi bir örnek düşünemiyorum. Gerçi bilmek yararlı.
Daniel

Yanıtlar:


765

Bileşeninizde, this.forceUpdate()bir yeniden göndereni zorlamak için arayabilirsiniz .

Belgeler: https://facebook.github.io/react/docs/component-api.html


169
Başka bir yol this.setState (this.state);
kar

25
Forceupdate kullanmak önerilmez, lütfen son cevaba bakınız.
Varand Pezeshkian

42
İken this.forceUpdate()Asker ailesi sorununa çok iyi bir çözüm değildir, bu başlıkta yöneltilen soruya doğru cevap bu. Genellikle kaçınılması gerekirken, forceUpdate'in iyi bir çözüm olduğu durumlar vardır.
ArneHugo

8
@kar Aslında, çözümünüzü boşa çıkarmak için ek mantık uygulanabilir shouldComponentUpdate().
Qwerty

4
Maksimum çağrı yığını boyutu aşıldı
IntoTheDeep

326

forceUpdatebir React zihniyetinden saptığı için kaçınılmalıdır. React dokümanları ne zaman forceUpdatekullanılabileceğine bir örnek verir :

Varsayılan olarak, bileşeninizin durumu veya destekleri değiştiğinde, bileşeniniz yeniden oluşturulur. Ancak, bunlar dolaylı olarak değişirse (örn: bir nesnenin içindeki veriler nesnenin kendisini değiştirmeden değişirse) veya render () yönteminiz başka bazı verilere bağlıysa, React'a çağırarak render () yöntemini yeniden çalıştırması gerektiğini söyleyebilirsiniz. güncellemeyi zorla().

Bununla birlikte, derin iç içe nesnelerle bile forceUpdategereksiz olduğu fikrini teklif etmek istiyorum . Değişmez bir veri kaynağı kullanarak izleme değişiklikleri ucuz hale gelir; bir değişiklik her zaman yeni bir nesneye neden olur, bu nedenle yalnızca nesneye yapılan başvurunun değişip değişmediğini kontrol etmemiz gerekir. Değişmez veri nesnelerini uygulamanıza uygulamak için Immutable JS kütüphanesini kullanabilirsiniz .

Normalde forceUpdate () öğesinin tüm kullanımlarından kaçınmaya çalışmalı ve yalnızca this.props ve render.s) içindeki this.state öğelerini okumalısınız. Bu, bileşeninizi "saf" hale getirir ve uygulamanızı çok daha basit ve verimli hale getirir. güncellemeyi zorla()

Yeniden oluşturulmasını istediğiniz öğenin anahtarını değiştirmek işe yarayacaktır. Öğenizdeki tuş desteğini durum ve ardından ayar durumunu yeni bir anahtar olacak şekilde güncellemek istediğinizde ayarlayın.

<Element key={this.state.key} /> 

Sonra bir değişiklik olur ve anahtarı sıfırlarsınız

this.setState({ key: Math.random() });

Bunun, anahtarın değiştiği öğenin yerini alacağını belirtmek isterim. Bunun yararlı olabileceği bir örnek, resim yüklendikten sonra sıfırlamak istediğiniz bir dosya giriş alanına sahip olmanızdır.

OP'nin sorusuna gerçek cevap forceUpdate()bu çözümü farklı durumlarda yararlı buldum. Ayrıca, eğer kendinizi kullanarak forceUpdatebulursanız, kodunuzu gözden geçirmek ve bir şeyler yapmanın başka bir yolu olup olmadığını görmek isteyebilirsiniz.

NOT 1-9-2019:

Yukarıdaki (anahtarın değiştirilmesi) elemanın tamamen yerini alacaktır. Kendinizi değişiklik yapmak için anahtarı güncellerken bulursanız, muhtemelen kodunuzda başka bir yerde bir sorununuz vardır. Math.random()Anahtarda kullanıldığında , her oluşturmayla öğeyi yeniden oluşturur. Tepki, şeyleri yeniden işlemek için en iyi yolu belirlemek için anahtar kullanır gibi anahtar böyle güncelleştirilmesini tavsiye ETMEM.


16
Bunun neden bir düşüş yaptığını bilmek isterdim? Ekran okuyucularının aria uyarılarına yanıt vermesini sağlamaya çalışıyorum ve bu, güvenilir bir şekilde çalıştığını bulduğum tek teknik. Kullanıcı arayüzünüzde her tıklandığında aynı uyarıyı üreten bir şey varsa, varsayılan olarak tepki DOM'u yeniden oluşturmaz, böylece ekran okuyucu değişikliği duyurmaz. Benzersiz bir anahtar ayarlamak, çalışmasını sağlar. Belki de aşağı oy, hala durum belirlemeyi içerdiği içindi. Ancak anahtarı ayarlayarak DOM'u yeniden oluşturmaya zorlamak altındır!
Martin Bayly

2
Bu yanıtı çok sevdim çünkü - 1: forceupdate () kullanımı önerilmez ve 2: bu şekilde npm yoluyla yüklediğiniz 3. taraf bileşenleri için çok yararlıdır, yani kendi bileşenleriniz değil. React-resizable-and-movable, kullandığım bir 3. taraf bileşenidir, ancak bileşen set durumuma tepki vermiyor. bu harika bir çözüm.
Varand Pezeshkian

81
Bu bir hack ve kötüye kullanımı key. Birincisi, niyet belirsiz. Kodunuzun bir okuyucusunun neden keybu şekilde kullandığınızı anlamak için çok çalışması gerekir . İkincisi, bu daha saf değil forceUpdate. "Saf" Reaksiyon, bileşeninizin görsel sunumunun durumuna% 100 bağlı olduğu anlamına gelir, bu nedenle herhangi bir durumu değiştirirseniz güncellenir. Bununla birlikte, derinden iç içe geçmiş nesneleriniz varsa ( forceUpdatedokümanlar bunu kullanmak için bir neden gösterir), bunu kullanarak forceUpdatebunu netleştirir. Üçüncüsü, Math.random()... rastgele. Teorik olarak, aynı rastgele sayıyı üretebilir.
atomkirk

8
@xtraSimplicity Bunun bir şeyi yapmanın React yöntemine uygun olduğunu kabul edemiyorum. forceUpdatebunu yapmanın Tepki yoludur.
Rob Grant

3
@ Robert Grant, geriye dönüp baktığımda katılıyorum. Eklenen karmaşıklık gerçekten buna değmez.
XtraSimplicity

80

Aslında forceUpdate()sadece doğru çözümdür setState()kudretini değil ek mantık uygulanır, yeniden işlemek tetikleyebilir shouldComponentUpdate()veya basitçe döner false.

güncellemeyi zorla()

Arama , bileşende atlanmaya forceUpdate()neden olur . Daha...render()shouldComponentUpdate()

setState ()

setState()koşullu oluşturma mantığı uygulanmadığı sürece her zaman yeniden oluşturmayı tetikler shouldComponentUpdate(). Daha...


forceUpdate() tarafından bileşeninizden çağrılabilir this.forceUpdate()


Kancalar: Bileşeni React'teki kancalarla yeniden oluşturmaya nasıl zorlayabilirim?


BTW: Mutasyon durumu mu yoksa iç içe geçmiş özellikleriniz yayılmıyor mu?


1
dikkat edilmesi gereken ilginç bir nokta, bu.state.foo = 'bar' gibi setState dışındaki durum değerlendirmelerinin render yaşam döngüsü yöntemini tetiklemeyeceğidir
lfender6445

4
@ lfender6445 Durumu doğrudan kurucu dışıyla atamak this.stateda bir hata atmalıdır . 2016 yılında bunu yapmamış olabilirsiniz; ama şimdi eminim.
Tyler

Doğrudan durum ödevleri üzerinde çalışmak için bazı bağlantılar ekledim.
Qwerty

36

forceUpdateAşağıdakileri yaparak kaçındım

YANLIŞ YOL : dizin olarak anahtar kullanmayın

this.state.rows.map((item, index) =>
   <MyComponent cell={item} key={index} />
)

DOĞRU YOL : Veri kimliğini anahtar olarak kullanın, bazı guid vb.

this.state.rows.map((item) =>
   <MyComponent item={item} key={item.id} />
)

bu nedenle bu tür bir kod iyileştirmesi yaparak bileşeniniz BENZERSİZ olacak ve doğal olarak


this.state.rows.map((item) => <MyComponent item={item} key={item.id} /> )
Tal

Beni doğru yöne sürüklediğiniz için çok teşekkür ederim. Dizini anahtar olarak kullanmak gerçekten benim sorunumdu.
RoiEX

Aşağı oyumu haklı çıkarmak için, bu yaklaşımı kullanmak iyi bir uygulama olmasına rağmen, bu cevap soru ile ilgili değildir.
micnic

34

Bir ilişkiyle (ebeveyn-çocuk) bağlı olmayan iki React bileşeninin iletişim kurmasını istediğinizde, Flux veya benzer mimariler kullanılması önerilir .

Ne yapmak istediğiniz değişiklikleri için dinlemektir gözlemlenebilir bileşen modeli ve onun arayüzü ve aynı değişime işlemek neden verilerini kaydetmeye tutan mağazada, stateiçinde MyComponent. Mağaza yeni verileri ittiğinde, oluşturma işlemini otomatik olarak tetikleyen bileşeninizin durumunu değiştirirsiniz.

Normalde kullanmaktan kaçınmaya çalışmalısınız forceUpdate(). Belgelerden:

Normalde forceUpdate () öğesinin tüm kullanımlarından kaçınmaya çalışmalı ve yalnızca this.props ve render.s) içindeki this.state öğelerini okumalısınız. Bu, uygulamanızı çok daha basit ve daha verimli hale getirir


2
Bileşen durumunun bellek durumu nedir? Bir sayfada beş bileşenim varsa ve hepsi tek bir mağazayı dinliyorsa, veriler bellekte beş kez var mı yoksa referanslar mı? Ve bu dinleyicilerin hepsi hızlı bir şekilde toplanmıyor mu? Veriyi hedefinize iletmekten neden "aşağı çekmek" daha iyidir?
AJFarkas

5
Aslında öneriler, depo verilerini bileşen desteklerine aktarmak ve bileşen durumunu yalnızca kaydırma durumu ve diğer ui'ye özgü diğer şeyler için kullanmaktır. Eğer kullanırsanız redux (bunu tavsiye), kullanabilirsiniz bağlantı işlevini react-reduxotomatik olarak tedarik bir eşleme fonksiyonu göre gerektiğinde her bileşen sahne için mağaza durumunu eşleştirmek için.
Stijn de Witt

1
@AJFarkas durumu, bir mağazanın verilerine zaten atanmış bir göstergedir, böylece klonlamadığınız sürece bellek bir sorun olmaz.
Jason Sebring

4
"forceUpdate () her zaman önlenmelidir" yanlış. Belgeler açıkça şöyle diyor: "Normalde forceUpdate () 'in tüm kullanımlarından kaçınmaya çalışmalısınız". Geçerli kullanım örnekleri vardırforceUpdate
AJP

2
@AJP kesinlikle haklısın, kişisel önyargı konuşuyordu :) Cevabı düzenledim.
gcedo

18

kanca kullanın veya HOC seçiminizi yapın

Kullanılması kancaları veya HOC (yüksek mertebeden bileşeni) desen senin saklar değiştirmek zaman otomatik güncelleştirmeler olabilir. Bu, çerçevesiz çok hafif bir yaklaşımdır.

useStore Kancalar mağaza güncellemeleri halletmenin yolu

interface ISimpleStore {
  on: (ev: string, fn: () => void) => void;
  off: (ev: string, fn: () => void) => void;
}

export default function useStore<T extends ISimpleStore>(store: T) {
  const [storeState, setStoreState] = useState({store});
  useEffect(() => {
    const onChange = () => {
      setStoreState({store});
    }
    store.on('change', onChange);
    return () => {
      store.off('change', onChange);
    }
  }, []);
  return storeState.store;
}

withStores HOC tanıtıcı deposu güncellemeleri

export default function (...stores: SimpleStore[]) {
  return function (WrappedComponent: React.ComponentType<any>) {
    return class WithStore extends PureComponent<{}, {lastUpdated: number}> {
      constructor(props: React.ComponentProps<any>) {
        super(props);
        this.state = {
          lastUpdated: Date.now(),
        };
        this.stores = stores;
      }

      private stores?: SimpleStore[];

      private onChange = () => {
        this.setState({lastUpdated: Date.now()});
      };

      componentDidMount = () => {
        this.stores &&
          this.stores.forEach((store) => {
            // each store has a common change event to subscribe to
            store.on('change', this.onChange);
          });
      };

      componentWillUnmount = () => {
        this.stores &&
          this.stores.forEach((store) => {
            store.off('change', this.onChange);
          });
      };

      render() {
        return (
          <WrappedComponent
            lastUpdated={this.state.lastUpdated}
            {...this.props}
          />
        );
      }
    };
  };
}

SimpleStore sınıfı

import AsyncStorage from '@react-native-community/async-storage';
import ee, {Emitter} from 'event-emitter';

interface SimpleStoreArgs {
  key?: string;
  defaultState?: {[key: string]: any};
}

export default class SimpleStore {
  constructor({key, defaultState}: SimpleStoreArgs) {
    if (key) {
      this.key = key;
      // hydrate here if you want w/ localState or AsyncStorage
    }
    if (defaultState) {
      this._state = {...defaultState, loaded: false};
    } else {
      this._state = {loaded: true};
    }
  }
  protected key: string = '';
  protected _state: {[key: string]: any} = {};
  protected eventEmitter: Emitter = ee({});
  public setState(newState: {[key: string]: any}) {
    this._state = {...this._state, ...newState};
    this.eventEmitter.emit('change');
    if (this.key) {
      // store on client w/ localState or AsyncStorage
    }
  }
  public get state() {
    return this._state;
  }
  public on(ev: string, fn:() => void) {
    this.eventEmitter.on(ev, fn);
  }
  public off(ev: string, fn:() => void) {
    this.eventEmitter.off(ev, fn);
  }
  public get loaded(): boolean {
    return !!this._state.loaded;
  }
}

Nasıl kullanılır

Kanca durumunda:

// use inside function like so
const someState = useStore(myStore);
someState.myProp = 'something';

HOC söz konusu olduğunda:

// inside your code get/set your store and stuff just updates
const val = myStore.myProp;
myOtherStore.myProp = 'something';
// return your wrapped component like so
export default withStores(myStore)(MyComponent);

EMİN OLUN Küresel değişimden faydalanabilmek için mağazalarınızı tekil olarak ihraç etmek:

class MyStore extends SimpleStore {
  public get someProp() {
    return this._state.someProp || '';
  }
  public set someProp(value: string) {
    this.setState({...this._state, someProp: value});
  }
}
// this is a singleton
const myStore = new MyStore();
export {myStore};

Bu yaklaşım oldukça basit ve benim için çalışıyor. Ayrıca büyük ekiplerde çalışıyorum ve Redux ve MobX kullanıyorum ve bunların da iyi olduğunu düşünüyorum, ancak çok fazla kazan plakası buluyorum. Ben şahsen benim kendi yaklaşımımı seviyorum çünkü olması gerektiğinde basit olabilecek bir şey için her zaman çok koddan nefret ediyordum.


2
Ben şöyle yöntemin ilk satırı yazmak zorunda güncelleme stilini Mağaza sınıf örneğinde bir yazım hatası olduğunu düşünüyorum: this._data = {...this._data, ...newData}.
Norbert

2
Reaksiyon, mirasın kompozisyon lehine caydırılır. reaktjs.org/docs/composition-vs-inheritance.html
Fred

1
Sadece netlik / okunabilirlik hakkında merak ederek, this.setState (this.state) öğesinin bundan daha iyi olması ne kadar coud?
Zoman

17

Sanırım sorum şu: React bileşenlerinin yeniden oluşturmak için durumu olmalı mı? Durumu değiştirmeden bileşeni talep üzerine güncellemeye zorlamanın bir yolu var mı?

Diğer cevaplar nasıl yapabileceğinizi göstermeye çalıştı, ama asıl önemli olan, yapmamanız gerektiğidir . Anahtarı değiştirmenin hileli çözümü bile noktayı kaçırıyor. React'ın gücü, bir şeyin ne zaman oluşturulması gerektiğini manuel olarak yönetme ve bunun yerine yalnızca girdiler üzerinde bir şeyin nasıl eşlenmesi gerektiğiyle ilgili olarak kontrol etmeyi bırakıyor. Sonra giriş akışını sağlayın.

Yeniden oluşturmayı manuel olarak zorlamanız gerekiyorsa, neredeyse kesinlikle doğru bir şey yapmıyorsunuzdur.


@ art-solopov, hangi problemden bahsediyorsun? Hangi dokümanlar bunları sunuyor? Durumdaki iç içe geçmiş nesnelere atıfta bulunduğunuzu varsayarsak, yanıt durumunuzu depolamak için farklı bir yapı kullanmaktır. Bu, React'teki durumu ele almanın en iyi yoludur. Ayrıca durumu ayrı olarak yönetmemelisiniz. İşe yapmazsan Tepki büyük faydalar birini kaybediyoruz ile devlet yönetim sistemi. Güncellemeleri manuel olarak yönetmek bir anti-kalıptır.
Kyle Baker

Lütfen, bu soruyu kontrol edebilir misiniz stackoverflow.com/questions/61277292/… ?
HuLu ViCa

4

Bunu birkaç şekilde yapabilirsiniz:

1. forceUpdate()Yöntemi kullanın :

forceUpdate()Yöntemi kullanırken meydana gelebilecek bazı aksaklıklar vardır . Bir örnek, shouldComponentUpdate()yöntemi yok sayar ve shouldComponentUpdate()yanlış döndürüp döndürmediğine bakılmaksızın görünümü yeniden oluşturur . Bu nedenle forceUpdate () kullanarak mümkün olduğunca kaçınılmalıdır.

2. this.state setState()yöntemine geçiliyor

Aşağıdaki kod satırı önceki örnekteki sorunun üstesinden gelir:

this.setState(this.state);

Gerçekten tüm bu, mevcut durumun üzerine bir yeniden oluşturma işlemini tetikleyen geçerli durumun üzerine yazmaktır. Bu yine de bir şeyler yapmanın en iyi yolu olmayabilir, ancak forceUpdate () yöntemini kullanarak karşılaşabileceğiniz bazı aksaklıkların üstesinden gelir.


2
SetState harmanlandığından muhtemelen daha güvenlidir:this.setState(prevState => prevState);
Mark Galloway

1
Bunun neden bir 'aksaklık' olduğundan emin değilim. Yöntemin adı ('forceUpdate') daha net olamaz: güncellemeyi her zaman zorla.
Zoman

4

Bileşeninizi yeniden oluşturmanın birkaç yolu vardır:

En basit çözüm forceUpdate () yöntemini kullanmaktır:

this.forceUpdate()

Bir çözüm daha, durum içinde kullanılmayan anahtar (nonUsedKey) oluşturmak ve bu nonUsedKey güncellemesi ile setState işlevini çağırmaktır:

this.setState({ nonUsedKey: Date.now() } );

Veya mevcut tüm durumu yeniden yazın:

this.setState(this.state);

Sahne değiştirme ayrıca bileşen yeniden oluşturma sağlar.


3

Tamlık için, bunu fonksiyonel bileşenlerde de elde edebilirsiniz:

const [, updateState] = useState();
const forceUpdate = useCallback(() => updateState({}), []);
// ...
forceUpdate();

Veya yeniden kullanılabilir bir kanca olarak:

const useForceUpdate = () => {
  const [, updateState] = useState();
  return useCallback(() => updateState({}), []);
}
// const forceUpdate = useForceUpdate();

Bkz. Https://stackoverflow.com/a/53215514/2692307

Bir kuvvet güncelleme mekanizması kullanmanın, tepki zihniyetine aykırı olduğu için hala kötü bir uygulama olduğuna dikkat edin, bu nedenle mümkünse bundan kaçınılmalıdır.


2

This.forceUpdate () yöntemini aşağıdaki gibi kullanabiliriz.

       class MyComponent extends React.Component {



      handleButtonClick = ()=>{
          this.forceUpdate();
     }


 render() {

   return (
     <div>
      {Math.random()}
        <button  onClick={this.handleButtonClick}>
        Click me
        </button>
     </div>
    )
  }
}

 ReactDOM.render(<MyComponent /> , mountNode);

DOM'daki 'Math.random' öğesi, yalnızca bileşeni yeniden oluşturmak için setState öğesini kullansanız bile güncellenir.

Buradaki tüm cevaplar anlamak için soruyu desteklemektedir. SetState ({}) kullanarak bir bileşeni yeniden oluşturmayı bildiğimiz gibi forceUpdate () kullanmaktır.

Yukarıdaki kod setState ile aşağıdaki gibi çalışır.

 class MyComponent extends React.Component {



             handleButtonClick = ()=>{
                this.setState({ });
              }


        render() {
         return (
  <div>
    {Math.random()}
    <button  onClick={this.handleButtonClick}>
      Click me
    </button>
  </div>
)
  }
 }

ReactDOM.render(<MyComponent /> , mountNode);

1

Kabul edilen cevabı yedeklemek için başka bir cevap :-)

React kullanımını caydırır forceUpdate()çünkü işlevsel programlamaya genellikle çok "bunu yapmanın tek yolu bu" yaklaşımı vardır. Çoğu durumda bu iyi, ancak birçok React geliştiricisi bir OO arka planı ile geliyor ve bu yaklaşımla, gözlemlenebilir bir nesneyi dinlemek mükemmel bir şekilde tamam.

Ve eğer yaparsanız, muhtemelen gözlemlenebilir "yangınlar" olduğunda yeniden render yapmanız gerektiğini bilirsiniz forceUpdate()ve bu nedenle, KULLANMALISINIZ ve aslında shouldComponentUpdate()burada bulunmayan bir artı .

OO yaklaşımı alan MobX gibi araçlar aslında bunu yüzeyin altında yapıyor (aslında MobX render()doğrudan çağırıyor )


0

Ben forceUpdate () önlemek için en iyi buldum. Yeniden oluşturmayı zorlamanın bir yolu, render () yönteminin geçici bir harici değişkene bağımlılığını eklemek ve bu değişkenin değerini gerektiği gibi ve gerektiğinde değiştirmektir.

İşte bir kod örneği:

class Example extends Component{
   constructor(props){
      this.state = {temp:0};

      this.forceChange = this.forceChange.bind(this);
   }

   forceChange(){
      this.setState(prevState => ({
          temp: prevState.temp++
      })); 
   }

   render(){
      return(
         <div>{this.state.temp &&
             <div>
                  ... add code here ...
             </div>}
         </div>
      )
   }
}

Yeniden oluşturmaya zorlamanız gerektiğinde this.forceChange () öğesini çağırın.


0

ES6 - Benim için yardımcı olan bir örnek ekliyorum:

"Short if ifadesinde" şu gibi boş bir işlev iletebilirsiniz:

isReady ? ()=>{} : onClick

Bu en kısa yaklaşım gibi görünüyor.

()=>{}

0

forceUpdate(); yöntem işe yarayacaktır, ancak kullanılması tavsiye edilir setState();


0

Açıkladığınız şeyi gerçekleştirmek için lütfen this.forceUpdate () öğesini deneyin.


Bu eylem ne yapıyor?
Dominique

0

Diğer bir yolu aradığını setState, VE durumunu koruduğu:

this.setState(prevState=>({...prevState}));


0

forceUpdate (), ancak birisinin onun hakkında konuştuğunu her duyduğumda, bunu asla kullanmamalısınız.


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.