Skip to content

Commit f0d71ee

Browse files
committed
Fix no-did-mount/update-set-state rules for ES6 classes
1 parent c791caa commit f0d71ee

File tree

4 files changed

+95
-2
lines changed

4 files changed

+95
-2
lines changed

lib/rules/no-did-mount-set-state.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ module.exports = function(context) {
3434
depth++;
3535
}
3636
if (
37-
ancestors[i].type !== 'Property' ||
37+
(ancestors[i].type !== 'Property' && ancestors[i].type !== 'MethodDefinition') ||
3838
ancestors[i].key.name !== 'componentDidMount' ||
3939
(mode === 'allow-in-func' && depth > 1)
4040
) {

lib/rules/no-did-update-set-state.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ module.exports = function(context) {
2626
}
2727
var ancestors = context.getAncestors(callee);
2828
for (var i = 0, j = ancestors.length; i < j; i++) {
29-
if (ancestors[i].type !== 'Property' || ancestors[i].key.name !== 'componentDidUpdate') {
29+
if (
30+
(ancestors[i].type !== 'Property' && ancestors[i].type !== 'MethodDefinition') ||
31+
ancestors[i].key.name !== 'componentDidUpdate'
32+
) {
3033
continue;
3134
}
3235
context.report(callee, 'Do not use setState in componentDidUpdate');

tests/lib/rules/no-did-mount-set-state.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,20 @@ ruleTester.run('no-did-mount-set-state', rule, {
104104
errors: [{
105105
message: 'Do not use setState in componentDidMount'
106106
}]
107+
}, {
108+
code: [
109+
'class Hello extends React.Component {',
110+
' componentDidMount() {',
111+
' this.setState({',
112+
' data: data',
113+
' });',
114+
' }',
115+
'}'
116+
].join('\n'),
117+
parser: 'babel-eslint',
118+
errors: [{
119+
message: 'Do not use setState in componentDidMount'
120+
}]
107121
}, {
108122
code: [
109123
'var Hello = React.createClass({',
@@ -121,6 +135,21 @@ ruleTester.run('no-did-mount-set-state', rule, {
121135
errors: [{
122136
message: 'Do not use setState in componentDidMount'
123137
}]
138+
}, {
139+
code: [
140+
'class Hello extends React.Component {',
141+
' componentDidMount() {',
142+
' this.setState({',
143+
' data: data',
144+
' });',
145+
' }',
146+
'}'
147+
].join('\n'),
148+
parser: 'babel-eslint',
149+
options: ['allow-in-func'],
150+
errors: [{
151+
message: 'Do not use setState in componentDidMount'
152+
}]
124153
}, {
125154
code: [
126155
'var Hello = React.createClass({',
@@ -139,6 +168,22 @@ ruleTester.run('no-did-mount-set-state', rule, {
139168
errors: [{
140169
message: 'Do not use setState in componentDidMount'
141170
}]
171+
}, {
172+
code: [
173+
'class Hello extends React.Component {',
174+
' componentDidMount() {',
175+
' someClass.onSomeEvent(function(data) {',
176+
' this.setState({',
177+
' data: data',
178+
' });',
179+
' })',
180+
' }',
181+
'}'
182+
].join('\n'),
183+
parser: 'babel-eslint',
184+
errors: [{
185+
message: 'Do not use setState in componentDidMount'
186+
}]
142187
}, {
143188
code: [
144189
'var Hello = React.createClass({',
@@ -157,6 +202,22 @@ ruleTester.run('no-did-mount-set-state', rule, {
157202
errors: [{
158203
message: 'Do not use setState in componentDidMount'
159204
}]
205+
}, {
206+
code: [
207+
'class Hello extends React.Component {',
208+
' componentDidMount() {',
209+
' if (true) {',
210+
' this.setState({',
211+
' data: data',
212+
' });',
213+
' }',
214+
' }',
215+
'}'
216+
].join('\n'),
217+
parser: 'babel-eslint',
218+
errors: [{
219+
message: 'Do not use setState in componentDidMount'
220+
}]
160221
}, {
161222
code: [
162223
'var Hello = React.createClass({',
@@ -172,5 +233,17 @@ ruleTester.run('no-did-mount-set-state', rule, {
172233
errors: [{
173234
message: 'Do not use setState in componentDidMount'
174235
}]
236+
}, {
237+
code: [
238+
'class Hello extends React.Component {',
239+
' componentDidMount() {',
240+
' someClass.onSomeEvent((data) => this.setState({data: data}));',
241+
' }',
242+
'}'
243+
].join('\n'),
244+
parser: 'babel-eslint',
245+
errors: [{
246+
message: 'Do not use setState in componentDidMount'
247+
}]
175248
}]
176249
});

tests/lib/rules/no-did-update-set-state.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,22 @@ ruleTester.run('no-did-update-set-state', rule, {
7777
errors: [{
7878
message: 'Do not use setState in componentDidUpdate'
7979
}]
80+
}, {
81+
code: [
82+
'class Hello extends React.Component {',
83+
' componentDidUpdate() {',
84+
' this.setState({',
85+
' name: this.props.name.toUpperCase()',
86+
' });',
87+
' }',
88+
' render() {',
89+
' return <div>Hello {this.state.name}</div>;',
90+
' }',
91+
'}'
92+
].join('\n'),
93+
parser: 'babel-eslint',
94+
errors: [{
95+
message: 'Do not use setState in componentDidUpdate'
96+
}]
8097
}]
8198
});

0 commit comments

Comments
 (0)