diff --git a/.eslintrc.js b/.eslintrc.js
index 3d024694320dde59bc622ac0c00008d733bbe4d6..9c1cf5f7fba297725d766633790417f120a9280d 100755
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -10,6 +10,7 @@ module.exports = {
   },
   rules: {
     'jsx-a11y/href-no-hash': [0],
+    'react/sort-comp': 1,
   },
   settings: {
     polyfills: ['fetch', 'promises'],
diff --git a/src/components/CountDown/index.js b/src/components/CountDown/index.js
index 4d63d3565fad39ff56143bccb029ee1a4c3f7404..53815c9eb81e2770cfc1e7f5352b3d5a40db13fb 100644
--- a/src/components/CountDown/index.js
+++ b/src/components/CountDown/index.js
@@ -23,9 +23,6 @@ const initTime = props => {
 };
 
 class CountDown extends Component {
-  timer = 0;
-
-  interval = 1000;
 
   constructor(props) {
     super(props);
@@ -35,6 +32,16 @@ class CountDown extends Component {
     };
   }
 
+  static getDerivedStateFromProps(nextProps, preState) {
+    const { lastTime } = initTime(nextProps);
+    if (preState.lastTime !== lastTime) {
+      return {
+        lastTime,
+      };
+    }
+    return null;
+  }
+
   componentDidMount() {
     this.tick();
   }
@@ -51,15 +58,9 @@ class CountDown extends Component {
     clearTimeout(this.timer);
   }
 
-  static getDerivedStateFromProps(nextProps, preState) {
-    const { lastTime } = initTime(nextProps);
-    if (preState.lastTime !== lastTime) {
-      return {
-        lastTime,
-      };
-    }
-    return null;
-  }
+  timer = 0;
+
+  interval = 1000;
 
   // defaultFormat = time => (
   //  {moment(time).format('hh:mm:ss')}
diff --git a/src/components/TagSelect/index.js b/src/components/TagSelect/index.js
index b7aea130fa5f2cf17e6e0ea5d80f1f7884c6d72a..dff382423f68fd0a2e6c125cff90e303d173faa4 100644
--- a/src/components/TagSelect/index.js
+++ b/src/components/TagSelect/index.js
@@ -26,6 +26,13 @@ class TagSelect extends Component {
     };
   }
 
+  static getDerivedStateFromProps(nextProps) {
+    if ('value' in nextProps && nextProps.value) {
+      return { value: nextProps.value };
+    }
+    return null;
+  }
+
   onChange = value => {
     const { onChange } = this.props;
     if (!('value' in this.props)) {
@@ -44,13 +51,6 @@ class TagSelect extends Component {
     this.onChange(checkedTags);
   };
 
-  static getDerivedStateFromProps(nextProps) {
-    if ('value' in nextProps && nextProps.value) {
-      return { value: nextProps.value };
-    }
-    return null;
-  }
-
   getAllTags() {
     let { children } = this.props;
     children = React.Children.toArray(children);
diff --git a/src/layouts/BasicLayout.js b/src/layouts/BasicLayout.js
index 148092c90b18df79caebb19a11acd81b6c62491a..9754ebd203df1fe79a3f28e7fd7f7be17f581f6f 100644
--- a/src/layouts/BasicLayout.js
+++ b/src/layouts/BasicLayout.js
@@ -64,9 +64,6 @@ const query = {
 };
 
 class BasicLayout extends React.PureComponent {
-  state = {
-    rendering: true,
-  };
   constructor(props) {
     super(props);
     const { menuData } = this.props;
@@ -74,6 +71,28 @@ class BasicLayout extends React.PureComponent {
     // Because there are many places to be. So put it here
     this.breadcrumbNameMap = getBreadcrumbNameMap(menuData);
   }
+
+  state = {
+    rendering: true,
+  };
+
+  componentDidMount() {
+    this.renderRef = requestAnimationFrame(() => {
+      this.setState({
+        rendering: false,
+      });
+    });
+  }
+
+  componentDidUpdate() {
+    const { menuData } = this.props;
+    this.breadcrumbNameMap = getBreadcrumbNameMap(menuData);
+  }
+
+  componentWillUnmount() {
+    cancelAnimationFrame(this.renderRef);
+  }
+
   getContext() {
     const { location } = this.props;
     return {
@@ -81,10 +100,7 @@ class BasicLayout extends React.PureComponent {
       breadcrumbNameMap: this.breadcrumbNameMap,
     };
   }
-  componentDidUpdate() {
-    const { menuData } = this.props;
-    this.breadcrumbNameMap = getBreadcrumbNameMap(menuData);
-  }
+
   getPageTitle = pathname => {
     let currRouterData = null;
     // match params path
@@ -149,16 +165,7 @@ class BasicLayout extends React.PureComponent {
       payload: collapsed,
     });
   };
-  componentDidMount() {
-    this.renderRef = requestAnimationFrame(() => {
-      this.setState({
-        rendering: false,
-      });
-    });
-  }
-  componentWillUnmount() {
-    cancelAnimationFrame(this.renderRef);
-  }
+
   render() {
     const {
       isMobile,
diff --git a/src/pages/Account/Settings/Info.js b/src/pages/Account/Settings/Info.js
index 23cedd8d3dca594c98edfce0209d988ab3f3003d..948349b7be55949ed6056c8afebd904810687d61 100644
--- a/src/pages/Account/Settings/Info.js
+++ b/src/pages/Account/Settings/Info.js
@@ -41,15 +41,6 @@ export default class Info extends Component {
     });
   }
 
-  componentDidMount() {
-    window.addEventListener('resize', this.resize);
-    this.resize();
-  }
-
-  componentWillUnmount() {
-    window.removeEventListener('resize', this.resize);
-  }
-
   static getDerivedStateFromProps(props, state) {
     const { match, location } = props;
     let selectKey = location.pathname.replace(`${match.path}/`, '');
@@ -60,6 +51,15 @@ export default class Info extends Component {
     return null;
   }
 
+  componentDidMount() {
+    window.addEventListener('resize', this.resize);
+    this.resize();
+  }
+
+  componentWillUnmount() {
+    window.removeEventListener('resize', this.resize);
+  }
+
   getmenu = () => {
     const { menuMap } = this.state;
     return Object.keys(menuMap).map(item => - {menuMap[item]}
 );
diff --git a/src/pages/Forms/TableForm.js b/src/pages/Forms/TableForm.js
index 068fe0154141069c712e81cfbec8786ad8bf7eb5..3ad0a79126acd66794f5fbb908a4a99e17181a5b 100644
--- a/src/pages/Forms/TableForm.js
+++ b/src/pages/Forms/TableForm.js
@@ -4,9 +4,6 @@ import isEqual from 'lodash.isequal';
 import styles from './style.less';
 
 export default class TableForm extends PureComponent {
-  index = 0;
-
-  cacheOriginData = {};
 
   constructor(props) {
     super(props);
@@ -29,6 +26,10 @@ export default class TableForm extends PureComponent {
     };
   }
 
+  index = 0;
+
+  cacheOriginData = {};
+
   getRowByKey(key, newData) {
     const { data } = this.state;
     return (newData || data).filter(item => item.key === key)[0];
diff --git a/src/pages/List/BasicList.js b/src/pages/List/BasicList.js
index 3e95a1f301577bf05a3dafc04830230f09508272..3c80c72a99a9cb4ba0f721924af9ba37b7b1c0d8 100644
--- a/src/pages/List/BasicList.js
+++ b/src/pages/List/BasicList.js
@@ -38,10 +38,6 @@ const { Search, TextArea } = Input;
 }))
 @Form.create()
 export default class BasicList extends PureComponent {
-  formLayout = {
-    labelCol: { span: 7 },
-    wrapperCol: { span: 13 },
-  };
 
   state = { visible: false, done: false };
 
@@ -55,6 +51,11 @@ export default class BasicList extends PureComponent {
     });
   }
 
+  formLayout = {
+    labelCol: { span: 7 },
+    wrapperCol: { span: 13 },
+  };
+
   showModal = () => {
     this.setState({
       visible: true,
diff --git a/src/pages/List/TableList.js b/src/pages/List/TableList.js
index 531fc7c71e2202fd0a9124472deb4df5bb2e0651..60c5abebe64acf66677ce7218df01e3ac2cf82a3 100644
--- a/src/pages/List/TableList.js
+++ b/src/pages/List/TableList.js
@@ -272,6 +272,22 @@ class UpdateForm extends PureComponent {
 }))
 @Form.create()
 export default class TableList extends PureComponent {
+  state = {
+    modalVisible: false,
+    updateModalVisible: false,
+    expandForm: false,
+    selectedRows: [],
+    formValues: {},
+    stepFormValues: {},
+  };
+
+  componentDidMount() {
+    const { dispatch } = this.props;
+    dispatch({
+      type: 'rule/fetch',
+    });
+  }
+
   columns = [
     {
       title: '规则名称',
@@ -333,22 +349,6 @@ export default class TableList extends PureComponent {
     },
   ];
 
-  state = {
-    modalVisible: false,
-    updateModalVisible: false,
-    expandForm: false,
-    selectedRows: [],
-    formValues: {},
-    stepFormValues: {},
-  };
-
-  componentDidMount() {
-    const { dispatch } = this.props;
-    dispatch({
-      type: 'rule/fetch',
-    });
-  }
-
   handleStandardTableChange = (pagination, filtersArg, sorter) => {
     const { dispatch } = this.props;
     const { formValues } = this.state;