您可以將展開狀態保留在C組件中,並使用通過C組件的道具傳遞的回調來更新B組件的可拖動狀態。 通過這種方式,兩個組件都保持其自己的狀態,不需要在A組件或App狀態(Redux之一)上添加狀態。
下面是一個例子:https://jsfiddle.net/snahedis/69z2wepo/28567/
var sampleList = [{id: 1, draggable: true},{id: 2, draggable: false}];
var Acomponent = React.createClass({
render: function() {
return (
<div>
{sampleList.map(function(component) {
if (component.draggable) {
return <Bcomponent key={component.id} />;
} else {
return <Ccomponent key={component.id} />;
}
})}
</div>
);
}
});
var Bcomponent = React.createClass({
getInitialState: function() {
return {
draggable: true
}
},
hasBeenToggled: function() {
this.setState({
draggable: !this.state.draggable
});
},
render: function() {
return <Ccomponent draggable={this.state.draggable} toggleExpandableCallback={this.hasBeenToggled} />;
}
});
var Ccomponent = React.createClass({
getInitialState: function() {
return {
expanded: false
}
},
toggleExpandable: function() {
this.setState({
expanded: !this.state.expanded
});
if (typeof this.props.toggleExpandableCallback === "function") {
this.props.toggleExpandableCallback();
}
},
render: function() {
return (
<div>
<div>I'm the C component and my expanded state is : {this.state.expanded.toString()}</div>
<div>{(this.props.draggable) ? "oh, and I'm draggable !" : "and I'm saddly not draggable"}</div>
<button onClick={this.toggleExpandable}>Change expandable state</button>
</div>
);
}
});
ReactDOM.render(
<Acomponent />,
document.getElementById('container')
);
你能解釋一下爲什麼好,你不想「養在應用程序狀態」?爲什麼你需要一個組件B?你可以使用道具進行條件渲染而不需要額外的組件。 –
如果您不想使用狀態,您可能會對React產生錯誤想法:https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#components-are-just-state應用程序狀態 –
我的意思是Redux。我正在使用REDX來保持整個應用程序的狀態,但保持展開/摺疊狀態可以並且應該在組件級別完成,這正是我現在所做的。這就是爲什麼我需要以某種方式將此信息發送到其父組件 – mezod