Skip to content

Commit 3bf3d68

Browse files
committed
example: Not mutate state and correctly handle selectedIndex [skip ci]
1 parent f63c7af commit 3bf3d68

File tree

1 file changed

+44
-44
lines changed

1 file changed

+44
-44
lines changed

examples/dyno/app.js

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import Modal from 'react-modal';
44
import { Tab, Tabs, TabList, TabPanel } from '../../src/main';
55

66
Modal.setAppElement(document.getElementById('example'));
7-
Modal.injectCSS();
87

98
const App = React.createClass({
109
getInitialState() {
@@ -20,25 +19,57 @@ const App = React.createClass({
2019
};
2120
},
2221

22+
openModal() {
23+
this.setState({
24+
isModalOpen: true,
25+
});
26+
},
27+
28+
closeModal() {
29+
this.setState({
30+
isModalOpen: false,
31+
});
32+
},
33+
34+
addTab() {
35+
const label = this.refs.label.value;
36+
const content = this.refs.content.value;
37+
38+
this.setState({
39+
tabs: [
40+
...this.state.tabs,
41+
{ label, content },
42+
],
43+
selectedIndex: this.state.tabs.length,
44+
});
45+
this.closeModal();
46+
},
47+
48+
removeTab(index) {
49+
this.setState({
50+
tabs: this.state.tabs.filter((tab, i) => i !== index),
51+
selectedIndex: this.state.selectedIndex - 1,
52+
});
53+
},
54+
2355
render() {
2456
return (
2557
<div style={{ padding: 50 }}>
2658
<p>
2759
<button onClick={this.openModal}>+ Add</button>
2860
</p>
29-
<Tabs selectedIndex={this.state.selectedIndex}>
61+
<Tabs
62+
selectedIndex={this.state.selectedIndex}
63+
onSelect={selectedIndex => this.setState({ selectedIndex })}
64+
>
3065
<TabList>
31-
{this.state.tabs.map((tab, i) => {
32-
return (
33-
<Tab key={i}>
34-
{tab.label} <a href="#" onClick={this.removeTab.bind(this, i)}></a>
35-
</Tab>
36-
);
37-
})}
66+
{this.state.tabs.map((tab, i) => (
67+
<Tab key={i}>
68+
{tab.label} <a href="#" onClick={() => this.removeTab(i)}></a>
69+
</Tab>
70+
))}
3871
</TabList>
39-
{this.state.tabs.map((tab, i) => {
40-
return <TabPanel key={i}>{tab.content}</TabPanel>;
41-
})}
72+
{this.state.tabs.map((tab, i) => <TabPanel key={i}>{tab.content}</TabPanel>)}
4273
</Tabs>
4374
<Modal
4475
isOpen={this.state.isModalOpen}
@@ -49,44 +80,13 @@ const App = React.createClass({
4980
<label htmlFor="label">Label:</label><br />
5081
<input id="label" type="text" ref="label" /><br /><br />
5182
<label htmlFor="content">Content:</label><br />
52-
<textarea id="content" ref="content" rows="10" cols="50"></textarea><br /><br />
83+
<textarea id="content" ref="content" rows="10" cols="50" /><br /><br />
5384
<button onClick={this.addTab}>OK</button>{' '}
5485
<button onClick={this.closeModal}>Cancel</button>
5586
</Modal>
5687
</div>
5788
);
5889
},
59-
60-
openModal() {
61-
this.setState({
62-
isModalOpen: true,
63-
});
64-
},
65-
66-
closeModal() {
67-
this.setState({
68-
isModalOpen: false,
69-
});
70-
},
71-
72-
addTab() {
73-
const label = this.refs.label.value;
74-
const content = this.refs.content.value;
75-
76-
this.state.tabs.push({
77-
label: label,
78-
content: content,
79-
});
80-
this.setState({
81-
selectedIndex: this.state.tabs.length - 1,
82-
});
83-
this.closeModal();
84-
},
85-
86-
removeTab(index) {
87-
this.state.tabs.splice(index, 1);
88-
this.forceUpdate();
89-
},
9090
});
9191

9292
ReactDOM.render(<App />, document.getElementById('example'));

0 commit comments

Comments
 (0)