2016-04-04 20 views
1

React the this.setState yöntemi durumu ayarlar. Mesela ben name için Thomas için durumu ayarladım.Durum ayarlandığında olay

this.setState({'name': 'Thomas'}) 

Başka bir nesneye ihtiyacım var. Diğer devlet özelliklerinden oluşan bir devlet mülkü. Mesela aşağıda.

let name = 'Thomas' 
this.setState({name}) 

console.log(this.state.data) // => undefined 

let age = '26' 
let data = {age} 
this.setState(data) 

console.log(this.state.data) {data: {age: '26'}} 

this.stateChanged(state => { 
    let data = state.data || {} 
    if (state.name) data.name = state.name 
    this.setState({data}) 
}) 

this.setState({name}) 

console.log(this.state.data) // => {data: {age: '26', name: 'Thomas'}} 

Tepki herhangi eşdeğer this.stateChanged yöntem var mı?

+0

Genellikle, tek devlet değişiklikleri üzerinde tekrar yayınlama olan render' 'devlet değişiklikleri önemsiyoruz. Başka bir nedenden ötürü bunu önemserseniz, React görüş bileşenine ihtiyaç duyan ayakkabı çekmeye çalışmak iyi bir yol olabilir veya olmayabilir (iyi bir yöntem değil, bağlamı bilmediğimden emin değilim). . – Cymen

cevap

2

React, durumun değiştiğini veya bileşeninin ne zaman güncellendiğini belirlemek için bize birkaç açık seçenek sunar. Üçüncü seçenek size bu durumun örtük bir yaklaşımın daha olma:

  1. setState(function|object nextState, [function callback]) sağlanan geri arama kullanın: documentation Başına

    onClick(e) { 
        this.setState({ 
         foobar: e.target.value 
        }, this.doAfter) 
    } 
    doAfter() { 
        console.log(`Just set FOOBAR to ${this.state.foobar}`) 
    } 
    

    , biz sonra çağırılacak bu yöntem güvenebilirsiniz Durum eşzamansız olarak ayarlandı. bileşeni böylece en son durum değişiklikleri erişebilir garanti kendisini kılmış sonra documentation Başına

    componentDidUpdate() { 
        console.log(`Component updated: Foobar is ${this.state.foobar}`) 
    } 
    

    bu işlev derhal çağrılır:

  2. componentDidUpdate yaşam döngüsü yöntemi kullanın.

  3. render() yöntemindeki tüm gerekli state bilgilerini derleyin.

    render() { 
        const compilation = {foobar: `${this.state.foobar}-bar`} 
        return (
         <div>...</div> 
        ) 
    } 
    

    Temelde, sadece bununla yukarıdaki ilk iki seçenek ihtiyaçlarınız için daha iyi yeterli olabilir, render() bir JSX nesnesi dönmeden önce seveceğini nasıl nesneyi oluşturur.

Örnek

http://codepen.io/mikechabot/pen/KzyVVw?editors=0011

+0

Gerçekten çok iyi, teşekkürler işte bunu yapmanın basit bir yolu da http://codepen.io/reggi/pen/qZVZmv?editors=0011 – ThomasReggi

+0

@ThomasReggi Yep, bu çok basit, eşzamanlı durumlarda kullanılabilir, ancak aslında setState güncellemeyi bir sıraya koyar, * yarış koşullarıyla karşılaşırdınız. Docs: 'setState(), this.state öğesini hemen değiştirmez, ancak bekleyen bir durum geçişi oluşturur. Bu yöntemi çağırdıktan sonra this.state'e erişme potansiyel olarak varolan değeri geri getirebilir. ' – lux

+0

Kalemi' this.setState (state, this.stateChanged()) 'olarak değiştirebilir ve aynı etkiyi bir garantiyle de olur. Okunabilir ve güzel! :-) – lux