no-will-update-set-state.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /**
  2. * @fileoverview Prevent usage of setState in componentWillUpdate
  3. * @author Yannick Croissant
  4. */
  5. 'use strict';
  6. // ------------------------------------------------------------------------------
  7. // Requirements
  8. // ------------------------------------------------------------------------------
  9. const rule = require('../../../lib/rules/no-will-update-set-state');
  10. const RuleTester = require('eslint').RuleTester;
  11. const parserOptions = {
  12. ecmaVersion: 2018,
  13. sourceType: 'module',
  14. ecmaFeatures: {
  15. jsx: true
  16. }
  17. };
  18. require('babel-eslint');
  19. // ------------------------------------------------------------------------------
  20. // Tests
  21. // ------------------------------------------------------------------------------
  22. const ruleTester = new RuleTester({parserOptions});
  23. ruleTester.run('no-will-update-set-state', rule, {
  24. valid: [{
  25. code: `
  26. var Hello = createReactClass({
  27. render: function() {
  28. return <div>Hello {this.props.name}</div>;
  29. }
  30. });
  31. `
  32. }, {
  33. code: `
  34. var Hello = createReactClass({
  35. componentWillUpdate: function() {}
  36. });
  37. `
  38. }, {
  39. code: `
  40. var Hello = createReactClass({
  41. componentWillUpdate: function() {
  42. someNonMemberFunction(arg);
  43. this.someHandler = this.setState;
  44. }
  45. });
  46. `
  47. }, {
  48. code: `
  49. var Hello = createReactClass({
  50. componentWillUpdate: function() {
  51. someClass.onSomeEvent(function(data) {
  52. this.setState({
  53. data: data
  54. });
  55. })
  56. }
  57. });
  58. `
  59. }, {
  60. code: `
  61. var Hello = createReactClass({
  62. componentWillUpdate: function() {
  63. function handleEvent(data) {
  64. this.setState({
  65. data: data
  66. });
  67. }
  68. someClass.onSomeEvent(handleEvent)
  69. }
  70. });
  71. `,
  72. parser: 'babel-eslint'
  73. }],
  74. invalid: [{
  75. code: `
  76. var Hello = createReactClass({
  77. componentWillUpdate: function() {
  78. this.setState({
  79. data: data
  80. });
  81. }
  82. });
  83. `,
  84. errors: [{
  85. message: 'Do not use setState in componentWillUpdate'
  86. }]
  87. }, {
  88. code: `
  89. class Hello extends React.Component {
  90. componentWillUpdate() {
  91. this.setState({
  92. data: data
  93. });
  94. }
  95. }
  96. `,
  97. parser: 'babel-eslint',
  98. errors: [{
  99. message: 'Do not use setState in componentWillUpdate'
  100. }]
  101. }, {
  102. code: `
  103. var Hello = createReactClass({
  104. componentWillUpdate: function() {
  105. this.setState({
  106. data: data
  107. });
  108. }
  109. });
  110. `,
  111. options: ['disallow-in-func'],
  112. errors: [{
  113. message: 'Do not use setState in componentWillUpdate'
  114. }]
  115. }, {
  116. code: `
  117. class Hello extends React.Component {
  118. componentWillUpdate() {
  119. this.setState({
  120. data: data
  121. });
  122. }
  123. }
  124. `,
  125. parser: 'babel-eslint',
  126. options: ['disallow-in-func'],
  127. errors: [{
  128. message: 'Do not use setState in componentWillUpdate'
  129. }]
  130. }, {
  131. code: `
  132. var Hello = createReactClass({
  133. componentWillUpdate: function() {
  134. someClass.onSomeEvent(function(data) {
  135. this.setState({
  136. data: data
  137. });
  138. })
  139. }
  140. });
  141. `,
  142. options: ['disallow-in-func'],
  143. errors: [{
  144. message: 'Do not use setState in componentWillUpdate'
  145. }]
  146. }, {
  147. code: `
  148. class Hello extends React.Component {
  149. componentWillUpdate() {
  150. someClass.onSomeEvent(function(data) {
  151. this.setState({
  152. data: data
  153. });
  154. })
  155. }
  156. }
  157. `,
  158. parser: 'babel-eslint',
  159. options: ['disallow-in-func'],
  160. errors: [{
  161. message: 'Do not use setState in componentWillUpdate'
  162. }]
  163. }, {
  164. code: `
  165. var Hello = createReactClass({
  166. componentWillUpdate: function() {
  167. if (true) {
  168. this.setState({
  169. data: data
  170. });
  171. }
  172. }
  173. });
  174. `,
  175. errors: [{
  176. message: 'Do not use setState in componentWillUpdate'
  177. }]
  178. }, {
  179. code: `
  180. class Hello extends React.Component {
  181. componentWillUpdate() {
  182. if (true) {
  183. this.setState({
  184. data: data
  185. });
  186. }
  187. }
  188. }
  189. `,
  190. parser: 'babel-eslint',
  191. errors: [{
  192. message: 'Do not use setState in componentWillUpdate'
  193. }]
  194. }, {
  195. code: `
  196. var Hello = createReactClass({
  197. componentWillUpdate: function() {
  198. someClass.onSomeEvent((data) => this.setState({data: data}));
  199. }
  200. });
  201. `,
  202. parser: 'babel-eslint',
  203. options: ['disallow-in-func'],
  204. errors: [{
  205. message: 'Do not use setState in componentWillUpdate'
  206. }]
  207. }, {
  208. code: `
  209. class Hello extends React.Component {
  210. componentWillUpdate() {
  211. someClass.onSomeEvent((data) => this.setState({data: data}));
  212. }
  213. }
  214. `,
  215. parser: 'babel-eslint',
  216. options: ['disallow-in-func'],
  217. errors: [{
  218. message: 'Do not use setState in componentWillUpdate'
  219. }]
  220. }]
  221. });