Skip to content

Commit c2dfef5

Browse files
committed
Allow stateless components to return null in React 15
1 parent ba987db commit c2dfef5

File tree

2 files changed

+76
-7
lines changed

2 files changed

+76
-7
lines changed

lib/rules/prefer-stateless-function.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
'use strict';
88

99
var Components = require('../util/Components');
10+
var versionUtil = require('../util/version');
1011

1112
// ------------------------------------------------------------------------------
1213
// Rule Definition
@@ -209,7 +210,15 @@ module.exports = Components.detect(function(context, components, utils) {
209210
}
210211
scope = scope.upper;
211212
}
212-
if (!blockNode || !blockNode.key || blockNode.key.name !== 'render' || utils.isReturningJSX(node, true)) {
213+
var isRender = blockNode && blockNode.key && blockNode.key.name === 'render';
214+
var allowNull = versionUtil.test(context, '15.0.0'); // Stateless components can return null since React 15
215+
var isReturningJSX = utils.isReturningJSX(node, !allowNull);
216+
var isReturningNull = node.argument && (node.argument.value === null || node.argument.value === false);
217+
if (
218+
!isRender ||
219+
(allowNull && (isReturningJSX || isReturningNull)) ||
220+
(!allowNull && isReturningJSX)
221+
) {
213222
return;
214223
}
215224
markReturnAsInvalid(node);

tests/lib/rules/prefer-stateless-function.js

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ ruleTester.run('prefer-stateless-function', rule, {
154154
].join('\n'),
155155
parser: 'babel-eslint'
156156
}, {
157-
// Can return null (ES6)
157+
// Can return null (ES6, React 0.14.0)
158158
code: [
159159
'class Foo extends React.Component {',
160160
' render() {',
@@ -165,9 +165,14 @@ ruleTester.run('prefer-stateless-function', rule, {
165165
' }',
166166
'}'
167167
].join('\n'),
168-
parser: 'babel-eslint'
168+
parser: 'babel-eslint',
169+
settings: {
170+
react: {
171+
version: '0.14.0'
172+
}
173+
}
169174
}, {
170-
// Can return null (ES5)
175+
// Can return null (ES5, React 0.14.0)
171176
code: [
172177
'var Foo = React.createClass({',
173178
' render: function() {',
@@ -178,17 +183,27 @@ ruleTester.run('prefer-stateless-function', rule, {
178183
' }',
179184
'});'
180185
].join('\n'),
181-
parserOptions: parserOptions
186+
parserOptions: parserOptions,
187+
settings: {
188+
react: {
189+
version: '0.14.0'
190+
}
191+
}
182192
}, {
183-
// Can return null (shorthand if in return)
193+
// Can return null (shorthand if in return, React 0.14.0)
184194
code: [
185195
'class Foo extends React.Component {',
186196
' render() {',
187197
' return true ? <div /> : null;',
188198
' }',
189199
'}'
190200
].join('\n'),
191-
parser: 'babel-eslint'
201+
parser: 'babel-eslint',
202+
settings: {
203+
react: {
204+
version: '0.14.0'
205+
}
206+
}
192207
}, {
193208
code: [
194209
'export default (Component) => (',
@@ -341,6 +356,51 @@ ruleTester.run('prefer-stateless-function', rule, {
341356
errors: [{
342357
message: 'Component should be written as a pure function'
343358
}]
359+
}, {
360+
// Can return null (ES6)
361+
code: [
362+
'class Foo extends React.Component {',
363+
' render() {',
364+
' if (!this.props.foo) {',
365+
' return null;',
366+
' }',
367+
' return <div>{this.props.foo}</div>;',
368+
' }',
369+
'}'
370+
].join('\n'),
371+
parser: 'babel-eslint',
372+
errors: [{
373+
message: 'Component should be written as a pure function'
374+
}]
375+
}, {
376+
// Can return null (ES5)
377+
code: [
378+
'var Foo = React.createClass({',
379+
' render: function() {',
380+
' if (!this.props.foo) {',
381+
' return null;',
382+
' }',
383+
' return <div>{this.props.foo}</div>;',
384+
' }',
385+
'});'
386+
].join('\n'),
387+
parserOptions: parserOptions,
388+
errors: [{
389+
message: 'Component should be written as a pure function'
390+
}]
391+
}, {
392+
// Can return null (shorthand if in return)
393+
code: [
394+
'class Foo extends React.Component {',
395+
' render() {',
396+
' return true ? <div /> : null;',
397+
' }',
398+
'}'
399+
].join('\n'),
400+
parser: 'babel-eslint',
401+
errors: [{
402+
message: 'Component should be written as a pure function'
403+
}]
344404
}
345405
]
346406
});

0 commit comments

Comments
 (0)