2015-05-19 12 views
12

kullanılarak işlenirken tepki içeriği tanımlanmamıştır React'ta gerçekten rahatsız edici bir davranışla karşı karşıyayım. Bağlamı, üst bileşenden çocuk bileşenine getChildContext kullanarak geçirmek istiyorum. Her şey, render işlevinde {this.props.children} kullanmadığım sürece iyi çalışır. Bunu yaparsam, çocuk bileşeninin içeriği tanımsızdır.Çocuklar, this.props.children

Bu davranışı yeniden üreten bir kod örneği ekliyorum. Baz bileşeninin bağlamında neden dosyalanmış bar'un undefined olduğunu anlayamıyorum.

var Baz = React.createClass({ 
contextTypes: { 
    bar: React.PropTypes.any 
}, 
render: function() { 
    console.log(this.context); 
    return <div />; 
} 
}); 

var Bar = React.createClass({ 
childContextTypes: { 
    bar: React.PropTypes.any 
}, 

getChildContext: function() { 
    return { 
    bar: "BAR" 
    }; 
}, 

render: function() { 
    return (<div>{this.props.children}</div>); 
} 
}); 

var Foo = React.createClass({ 
render: function() { 
    return <Bar> 
     <Baz /> 
    </Bar>; 
} 
}); 

console.log(React.version); 

React.render(<Foo />, document.body); 

Konsol Çıktı:

Warning: owner-based and parent-based contexts differ (values: `undefined` vs `BAR`) for key (bar) while mounting Baz (see: http://fb.me/react-context-by-parent) 
Inline JSX script:10 Object {bar: undefined} 

JSFiddle: https://jsfiddle.net/3h7pxnkx/1/

cevap

12

Yani tüm bileşenlerini oluşturuldukları nerede çocuk bağlamını olsun görünür. Bu durumda <Baz />, Foo'un bir parçası olarak oluşturulur, bu nedenle, Foo'dan çocuk bağlamını alır, bu nedenle tanımlanmamıştır.

Seçeneklerin bir çift.

1) Çocuk bağlamını Foo olarak ayarlayın.
2) Bar'da <Baz> çocuğunu yeniden oluşturun. Bunu cloneWithProps ile yapabilirsiniz.

render: function() { 
    console.log(this); 
    return React.addons.cloneWithProps(this.props.children) 
} 

Güncelleme keman: projesini tepki üzerine https://jsfiddle.net/crob611/3h7pxnkx/2/

Sayı görüştükten: https://github.com/facebook/react/issues/3392

+3

uyarı işaret olarak, plan, dikkat çekerek Sadece değer bu davranış içinde değişeceğini v0.14 Tepki Böylece, Baz 'kendi içeriğini“ Foo ”sahibi yerine kendi“ Bar ”dan alacaktır. –