no-set-state.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * @fileoverview Prevent usage of setState
  3. * @author Mark Dalgleish
  4. */
  5. 'use strict';
  6. const Components = require('../util/Components');
  7. const docsUrl = require('../util/docsUrl');
  8. const report = require('../util/report');
  9. // ------------------------------------------------------------------------------
  10. // Rule Definition
  11. // ------------------------------------------------------------------------------
  12. const messages = {
  13. noSetState: 'Do not use setState',
  14. };
  15. module.exports = {
  16. meta: {
  17. docs: {
  18. description: 'Disallow usage of setState',
  19. category: 'Stylistic Issues',
  20. recommended: false,
  21. url: docsUrl('no-set-state'),
  22. },
  23. messages,
  24. schema: [],
  25. },
  26. create: Components.detect((context, components, utils) => {
  27. /**
  28. * Checks if the component is valid
  29. * @param {Object} component The component to process
  30. * @returns {Boolean} True if the component is valid, false if not.
  31. */
  32. function isValid(component) {
  33. return Boolean(component && !component.useSetState);
  34. }
  35. /**
  36. * Reports usages of setState for a given component
  37. * @param {Object} component The component to process
  38. */
  39. function reportSetStateUsages(component) {
  40. let setStateUsage;
  41. for (let i = 0, j = component.setStateUsages.length; i < j; i++) {
  42. setStateUsage = component.setStateUsages[i];
  43. report(context, messages.noSetState, 'noSetState', {
  44. node: setStateUsage,
  45. });
  46. }
  47. }
  48. return {
  49. CallExpression(node) {
  50. const callee = node.callee;
  51. if (
  52. callee.type !== 'MemberExpression'
  53. || callee.object.type !== 'ThisExpression'
  54. || callee.property.name !== 'setState'
  55. ) {
  56. return;
  57. }
  58. const component = components.get(utils.getParentComponent());
  59. const setStateUsages = (component && component.setStateUsages) || [];
  60. setStateUsages.push(callee);
  61. components.set(node, {
  62. useSetState: true,
  63. setStateUsages,
  64. });
  65. },
  66. 'Program:exit'() {
  67. const list = components.list();
  68. Object.keys(list).filter((component) => !isValid(list[component])).forEach((component) => {
  69. reportSetStateUsages(list[component]);
  70. });
  71. },
  72. };
  73. }),
  74. };