2014-07-22 65 views
29

Reaksiyon.js yazılımında oldukça yeniyim ve bir duvar tasarımı düzenleyerek deneme aşamasındayım.React.js: setState üzerine yazılıyor, birleştirilmiyor

Her öğeyi DOM'a yerleştiriyorum, sonra her öğenin üzerine dönmem ve önceki öğelere göre x ve y konumlarını uygulamam gerekiyor.

ilk modeli şöyle görünür:

[ 
    { 
    "title": "The Forrest", 
    "description": "some cool text", 
    "imgSmallSrc": "/img/img4-small.jpg", 
    "imgAlt": "Placeholder image", 
    "tags": [ 
     "Design", 
     "Mobile", 
     "Responsive" 
    ], 
    "date": 1367154709885, 
    "podStyle": { 
     "width": 253 
    } 
    } 
] 

(sadece kısa tutmak için bir öğe gösterdik).

Döngüyü tamamladıktan ve x ve y verilerimi aldığımda bunu podStyle nesnesine uygulamak istiyorum. Aşağıdaki verilerle setstate çağrı: Bu modelden tüm güncel verileri kaldırmak ve sadece podStyle verilerle beni terk etmek gibi görünüyor

[ 
    { 
    "podStyle": { 
     "x": 0, 
     "y": 0, 
     "height": 146, 
     "width": 253 
    } 
    } 
] 

. Bu birleşmenin nasıl çalıştığını yanlış anladım mı?

Yardımlarınız için şimdiden teşekkür ederiz!

+3

[Değişkenlik yardımcılarını] deneyin (https: //facebook.githu b.io/react/docs/update.html) React'ın karmaşık hal nesnelerini değiştirmenin bildirimsel bir yolunu ekler. –

cevap

54

sizin devlet bir nesne ise:

getInitialState: function() { 
    return { x: 0, y: 0 }; 
} 

söz konusu nesne üzerinde bireysel tuşları ayarlamak için setState kullanabilirsiniz:

this.setState({ x: 1 }); // y still == 0 

senin devletin hiçbir akıllı birleştirilmesi yapar vermek; örneğin, bu işe yaramazsa:

var newState = React.addons.update(this.state, { 
    point: { x: {$set: 10} } 
}); 
this.setState(newState); 

this JSFiddle bakınız: sonra

@ssorallen tarafından belirtildiği gibi
getInitialState: function() { 
    return { 
    point: { x: 0, y: 0 }, 
    radius: 10 
    }; 
} 

this.setState({point: {x: 1}}); 
// state is now == {point: {x: 1}, radius: 10} (point.y is gone) 

[Düzenle]

, sen sen etkiyi elde etmek the immutability helpers kullanabilirsiniz bir örnek için: http://jsfiddle.net/BinaryMuse/HW6w5/

+0

Bu yüzden eminim ki, ikinci örneğinize göre durumu ayarlıyorum, ancak bu durumda 'yarıçap' kaldırılıyor. Bu gece evdeyken etrafımda bir oyun oynayacağım ve doğru ayarlandığından emin olacağım. Yardımın için teşekkürler Brandon! – DanV

+1

@DanV İşte cevabımdaki kodu göstermek için bir JSFiddle. http://jsfiddle.net/BinaryMuse/HW6w5/ Ayrıca, ssorallen tarafından belirtilen değişmezlik yardımcılarını kullanmak için bir düğme ekledim. –

+0

Yardımlarınız için çok teşekkürler Brandon. Bu kesinlikle beni doğru yöne gönderdi. Modelim biraz farklı olduğu için $ merge yardımcısını kullanarak bitirdim ve ayrıca güncellemeleri birkaç çocuk ürününe de uyguluyordum. Yine de güzel çalışıyor. – DanV

3

Şun gibi bir şey:

01 o/özyinelemeli derin yerine ağaç kodlama zordu eğer

daha iyi olurdu, ama okuyucuya bu kadar bırakacaktır :)

+0

Dış 'Object.assign' aslında atadığınız' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'aslında hiçbir şey yapmaz. Ayrıca, nesneleri doğrudan eyalette değiştirmemelisiniz. Yine de 'setState' dediğinizden bu yana sorun olmayabilir, ama temiz değil. Ayrıca, tam durum nesnesi yerine "setState" için kısmi güncellemeler sağlayabilirsiniz. – herman

+3

Bunu biraz daha düşünün: 'this.state' kelimesini değiştirmek ve "this.state" referansıyla "setState" i çağırmak kesinlikle TAMAM DEĞİLDİR. Bunun nedeni, bir sonraki durumu bir önceki duruma göre karşılaştırabilen "shouldComponentUpdate" kodunun kırılmasıdır (her ikisi de aynı nesneye başvurduğu için bu durumda her zaman eşit olacaktır). – herman

10

birleştirilmesi sığ, böylece this.setState({point}) yapraklar (ed: bu. state.radius) sağlam, ancak tamamen değiştirir (ed: this.state.point).

https://facebook.github.io/react/docs/state-and-lifecycle.html#state-updates-are-merged

Object.assign() yerine transform-object-rest-spread kullanılarak, daha önce verilen yanıtlar bir ES7 + bakış açısı sunmak için:

class MyComponent extends React.Component { 
    state = { 
     point: { 
      x: 0, 
      y: 0, 
     }, 
     radius: 10, 
    } 

    handleChange =() => { 
     this.setState({ 
      point: { 
       // rest operator (...) expands out to: 
       ...this.state.point, // x:0, y:0, 
       y: 1, // overwrites old y 
      }, 
      // radius is not overwritten by setState 
     }); 
    } 

    render() { 
     // omitted 
    } 
} 

.babelrc

(aynı zamanda kargaşa önceden aşama 2 transform-class-properties gerektirir)
{ 
    "presets": ["es2015", "stage-2", "react"], 
    "plugins": ["transform-object-rest-spread"], 
} 
+0

Teşekkür ederiz! İnanılmaz bir çözüm olduğunu düşünüyorum. –