Skip to content

Commit 9e670c7

Browse files
committed
Modified no-did-X-set-state rules to enforce only for direct calls to this.setState; references/assignment are allowed.
Extra credit: ensure the reference is not used to be called thereafter. (not part of this commit.)
1 parent d79eadc commit 9e670c7

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@ module.exports = function(context) {
1616

1717
return {
1818

19-
'MemberExpression': function(node) {
20-
if (node.object.type !== 'ThisExpression' || node.property.name !== 'setState') {
19+
'CallExpression': function(node) {
20+
var callee = node.callee;
21+
if (callee.type !== 'MemberExpression') {
2122
return;
2223
}
23-
var ancestors = context.getAncestors(node);
24+
if (callee.object.type !== 'ThisExpression' || callee.property.name !== 'setState') {
25+
return;
26+
}
27+
var ancestors = context.getAncestors(callee);
2428
for (var i = 0, j = ancestors.length; i < j; i++) {
2529
if (ancestors[i].type !== 'Property' || ancestors[i].key.name !== 'componentDidMount') {
2630
continue;
2731
}
28-
context.report(node, 'Do not use setState in componentDidMount');
32+
context.report(callee, 'Do not use setState in componentDidMount');
2933
}
3034
}
3135
};

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@ module.exports = function(context) {
1616

1717
return {
1818

19-
'MemberExpression': function(node) {
20-
if (node.object.type !== 'ThisExpression' || node.property.name !== 'setState') {
19+
'CallExpression': function(node) {
20+
var callee = node.callee;
21+
if (callee.type !== 'MemberExpression') {
2122
return;
2223
}
23-
var ancestors = context.getAncestors(node);
24+
if (callee.object.type !== 'ThisExpression' || callee.property.name !== 'setState') {
25+
return;
26+
}
27+
var ancestors = context.getAncestors(callee);
2428
for (var i = 0, j = ancestors.length; i < j; i++) {
2529
if (ancestors[i].type !== 'Property' || ancestors[i].key.name !== 'componentDidUpdate') {
2630
continue;
2731
}
28-
context.report(node, 'Do not use setState in componentDidUpdate');
32+
context.report(callee, 'Do not use setState in componentDidUpdate');
2933
}
3034
}
3135
};

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ eslintTester.addRuleTest('lib/rules/no-did-mount-set-state', {
4040
ecmaFeatures: {
4141
jsx: true
4242
}
43+
}, {
44+
code: '\
45+
var Hello = React.createClass({\
46+
componentDidMount: function() {\
47+
this.someHandler = this.setState;\
48+
},\
49+
render: function() {\
50+
return <div>Hello {this.props.name}</div>;\
51+
}\
52+
});',
53+
ecmaFeatures: {
54+
jsx: true
55+
}
4356
}
4457
],
4558

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ eslintTester.addRuleTest('lib/rules/no-did-update-set-state', {
4040
ecmaFeatures: {
4141
jsx: true
4242
}
43+
}, {
44+
code: '\
45+
var Hello = React.createClass({\
46+
componentDidUpdate: function() {\
47+
this.someHandler = this.setState;\
48+
},\
49+
render: function() {\
50+
return <div>Hello {this.props.name}</div>;\
51+
}\
52+
});',
53+
ecmaFeatures: {
54+
jsx: true
55+
}
4356
}
4457
],
4558

0 commit comments

Comments
 (0)