Es6 sınıflarını kullanırken React'teki “super ()” ve “super (sahne)” arasındaki fark nedir?


Yanıtlar:


709

Tek geçmek gerekiyor bir nedeni sadece vardır propsiçin super():

Yapıcıda erişmek istediğinizde this.props.

Geçen:

class MyComponent extends React.Component {    
    constructor(props) {
        super(props)

        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

Geçmiyor:

class MyComponent extends React.Component {    
    constructor(props) {
        super()

        console.log(this.props)
        // -> undefined

        // Props parameter is still available
        console.log(props)
        // -> { icon: 'home', … }
    }

    render() {
        // No difference outside constructor
        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

Geçen ya da değil geçen o Not propsiçin supervardır hiçbir etkisi daha sonraki kullanımları üzerine this.propsdışarıdan constructor. Olduğunu render, shouldComponentUpdateya da olay işleyicileri her zaman bu bilgilere erişimi vardır.

Bu, Sophie Alpert'in benzer bir soruya verdiği cevapta açıkça söyleniyor .


Ayrıca dokümantasyon Sınıf, nokta 2'ye Yerel Devleti ekleme Devlet ve Yaşam Döngüsü, -recommends:

Sınıf bileşenleri her zaman taban yapıcısını ile çağırmalıdır props.

Ancak, hiçbir neden belirtilmez. Ya alt sınıflama ya da gelecekteki uyumluluk nedeniyle olduğunu tahmin edebiliriz.

(Bağlantı için teşekkürler @MattBrowne)


16
Diğer cevapların daha fazla oy almasına rağmen haklı olduğunu düşünüyorum. this.propsolduğu undefinedgeçirilen sürece super(). Her iki durumda da this.props, render()işlevin daha sonra oluşturulmasını veya kullanılabilirliğini etkilemez .
Micros

3
@Rotareti, hayır, aslında sınıfın geri kalanı bu yapıya bağlı değil, mesele bu. Bileşen, sahne yapısını yapıcı parametresinden farklı bir yolla alır. Ve ilk destekleri geçtiğiniz superiçin yapıcıda bunlara referansınız olur.
Robin Pokorny

7
Belgeleri Tepki göre, her zaman geçirmesi gerektiğini propsetmek super(): facebook.github.io/react/docs/... . Neden emin değilim, çünkü this.propsher iki şekilde de diğer yöntemlerde erişilebilir olduğu için ... belki de React'ın gelecekteki sürümlerinin propsyapıcıda bir şey yapmak isteyebileceği durumlarda gelecekteki uyumluluk için bunu öneriyoruz ?
Matt Browne

23
Belki burada solucanlar bir kutu açıyorum ama neden şimdiye geçmesi propsiçin supersize belirttiği gibi, ne zaman propsparametresi bize yapıcı içerisinde kullanmak için orada mevcuttur ve this.propsdiğer her yerde çalışır? Kullanarak hiç bir faydası var mıdır this.propsbiraz üzerinde props? Yapıcıda yıkım yapmak kötü bir uygulama mı props? Ben hala Hiç geçmesi gerekiyordu ne zaman bir dava görmeye başarısız düşünüyorum propsiçin super, ama ha sadece benim cehalet bahse hazırım.
indiesquidge

9
Eğer kullanırsanız super(props), bu kullanım yöntemlerini çağırabilir this.props yapıcı dan gibi this.doStuffUsingThisDotProps()bu yöntemler / işlevlerine sahne parametreye geçmek zorunda kalmadan,. super(props)Bu soruya verilen cevaplara göre, ilk önce kullanmamı gerektirecek gibi görünen bir yapıcı yazdım .
Victor Zamanian

54

Bu örnekte, React.Componentsınıfı genişletiyorsunuz ve ES2015 belirtimine göre, bir alt sınıf kurucusu çağrılıncaya thiskadar yararlanamıyor super(); ayrıca, ES2015 sınıfı yapıcıları super()alt sınıflarsa çağırmalıdırlar .

class MyComponent extends React.Component {
  constructor() {
    console.log(this); // Reference Error
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

Aksine:

class MyComponent extends React.Component {
  constructor() {
    super();
    console.log(this); // this logged to console
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

Bu mükemmel yığın taşma cevabına göre daha fazla detay

React.ComponentSınıfı genişleterek yaratılmayan bileşenlerin örneklerini görebilirsiniz, super()ancak bunların bir constructornedeninin olmadığını, dolayısıyla neden gerekli olmadığını fark edeceksiniz .

class MyOtherComponent extends React.Component {
  render() {
    return <div>Hi {this.props.name}</div>;
  }
}

Konuştuğum bazı geliştiricilerden gördüğüm bir karışıklık noktası, hiçbir yere sahip olmayan constructorve bu nedenle hiçbir super()yerde aramayan bileşenlerin hala yöntemde this.propsmevcut olmasıdır render(). Unutmayın ki bu kural ve bunun thisiçin constructorsadece bir bağlayıcı oluşturmak gerekir constructor.


15
Cevabınız için çok teşekkürler, ancak orijinal soruma cevap vermiyor ( super()ve arasındaki fark super(props)).
Misha Moroshko

46

Sınavı geçtikten sonra propsiçin super, sahne atanmış olsun this. Aşağıdaki senaryoya bir göz atın:

constructor(props) {
    super();
    console.log(this.props) //undefined
}

Ne zaman yaparsan yap:

constructor(props) {
    super(props);
    console.log(this.props) //props will get logged.
}

Listedeki en iyi cevap.
Basavaraj Hadimani

Bu cevap yarı doğrudur, Bu örnek yalnızca yapıcı yöntemi içindir. Örneğin, süper (sahne) yazmasanız bile, oluşturma yönteminin altındaki this.props yine de atanır ve kullanılabilir. Yukarıda belirtilen tek neden bunu yapıcıda kullanmaktır.
Ofear

12

Gereğince kaynak kodu

function ReactComponent(props, context) {
  this.props = props;
  this.context = context;
}

Eğer geçmelidir propsEğer sahne var her zaman ve içine koymayın this.propselden.


1
Bu konuda hala net değilim. bu iki bileşene bakarsanız, bir çağrı görürken diğeri göremezsiniz super(props). Ama tüketicileri de sahne kurdu. Fark ne?
Kyeotic

Bu demek oluyor this.props = propsve super(props)aynı şey mi?
reectrix

1
Bu doğru değil. ReactElement aslında this.propsyapıcıda ne yapıldığına bakılmaksızın 'dışarıdan' başlar.
Robin Pokorny

11

Dan Abramov bu konuda bir makale yazdı:

Neden süper (sahne) yazıyoruz?

Ve işin özü, bu senaryodan kaçınmak için onu geçirme alışkanlığına sahip olmanın yararlı olması , dürüst olmak gerekirse, bunun gerçekleşme olasılığını görmüyorum:

// Inside React
class Component {
  constructor(props) {
    this.props = props;
    // ...
  }
}

// Inside your code
class Button extends React.Component {
  constructor(props) {
    super(); // 😬 We forgot to pass props
    console.log(props);      // ✅ {}
    console.log(this.props); // 😬 undefined 
  }
  // ...
}


7

Bir constructor()React bileşeninin içindeki fonksiyonu uygularken super()bir gerekliliktir. MyComponentBileşeninizin React.Componenttemel sınıftan işlevselliği genişlettiğini veya ödünç aldığını unutmayın .

Bu temel sınıf, constructor()React bileşenimizi bizim için kurmak için kendi içinde bazı kodlara sahip bir işleve sahiptir.

Biz tanımladığınızda constructor()bizim iç işlevini MyComponentsınıf, biz geçersiz kılma veya değiştirme, esasen vardır constructor()içinde olan işlevi React.Componentsınıfının, ama biz hala tüm bu kurulum kodu içeriden sağlamak için gerekenconstructor() işlevi hala çağrılır.

Bu yüzden React.Component' constructor()işlevinin çağrılmasını sağlamak için çağırıyoruz super(props). super(props)ebeveyn constructor()işlevine bir referans , hepsi bu.

Sınıf tabanlı bir bileşenin içinde bir işlev super(props)tanımladığımız her seferinde eklememiz gerekir constructor().

Eğer yapmazsak, aramamız gerektiğini söyleyen bir hata göreceğiz super(props).

Bu constructor()cismi tanımlamanın tüm nedeni devlet nesnesini başlatmaktır.

Bu yüzden devlet nesnesini başlatmak için süper çağrının altına şunu yazacağım:

class App extends React.Component {
  constructor(props) {
      super(props);

      this.state = {};
   }

  // React says we have to define render()
  render() {
    return <div>Hello world</div>;
  }
};

Bu nedenle constructor()yöntemimizi tanımladık , bir JavaScript nesnesi oluşturarak, ona bir özellik veya anahtar / değer çifti atayarak, bunun sonucunu atayarak durum nesnesini başlattık this.state. Şimdi elbette bu sadece bir örnek, bu yüzden gerçekten durum nesnesine bir anahtar / değer çifti atamadım, sadece boş bir nesne.


4

İşte yaptığım keman: jsfiddle.net . Sahne öğelerinin varsayılan olarak yapıcıda atanmadığını gösterir. Anladığım kadarıyla yöntemde değerlendiriliyorlar React.createElement. Dolayısıyla super(props)yalnızca üst sınıfının en yapıcı elle atayacaktır çağrılmalıdır propsiçin this.props. Sadece React.Componentaramayı super(props)uzatırsanız sahne ile hiçbir şey yapmazsınız. Belki React'ın sonraki sürümlerinde değişecektir.


3

Burada bunu yapıcıda elde edemeyiz, böylece tanımsız dönecek, ancak bunu yapıcı işlevinin dışında getirebileceğiz.

class MyComponent extends React.Component {
  constructor() {
    console.log(this); // Reference Error i.e return undefined
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

Eğer super () kullanıyorsanız, yapıcı içindeki "this" değişkenini de getirebiliriz

class MyComponent extends React.Component {
  constructor() {
    super();
    console.log(this); // this logged to console
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

Yani super () kullandığımızda; bunu getirebileceğiz, ancak this.props yapıcıda tanımsız olacaktır. Ancak yapıcı dışında, bu.props tanımsız döndürmez.

Eğer süper (sahne) kullanırsak, bunu kullanabiliriz. Yapıcı içinde de değer değeri

Sophie Alpert'in Cevabı

Bunu kullanmak istiyorsanız. Yapıcıdakirops, pro'ları super'e geçirmeniz gerekir. Aksi takdirde, önemli değildir, çünkü React yapıcı çağrıldıktan hemen sonra örnek üzerinde .props değerini dışarıdan ayarlar.


3

Reaksiyon 16.6.3 sürümü için, durum öğesi adını başlatmak için süper (sahne) kullanıyoruz : this.props.name

constructor(props){
    super(props);        
}
state = {
  name:this.props.name 
    //otherwise not defined
};
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.