浏览代码

1. fixed TagCloud unmount setState
2. fixed PageHeader key warning
3. fixed MiniArea key warning

nikogu 8 年之前
父节点
当前提交
5ade223021
共有 3 个文件被更改,包括 36 次插入9 次删除
  1. 18 2
      src/components/Charts/MiniArea/index.js
  2. 17 6
      src/components/Charts/TagCloud/index.js
  3. 1 1
      src/layouts/PageHeaderLayout.js

+ 18 - 2
src/components/Charts/MiniArea/index.js

@@ -56,8 +56,24 @@ export default class MiniArea extends React.Component {
               data={data}
               padding={padding}
             >
-              <Axis name="x" label={false} line={false} tickLine={false} grid={false} {...xAxis} />
-              <Axis name="y" label={false} line={false} tickLine={false} grid={false} {...yAxis} />
+              <Axis
+                key="axis-x"
+                name="x"
+                label={false}
+                line={false}
+                tickLine={false}
+                grid={false}
+                {...xAxis}
+              />
+              <Axis
+                key="axis-y"
+                name="y"
+                label={false}
+                line={false}
+                tickLine={false}
+                grid={false}
+                {...yAxis}
+              />
               <Tooltip showTitle={false} crosshairs={false} />
               <Geom
                 type="area"

+ 17 - 6
src/components/Charts/TagCloud/index.js

@@ -31,6 +31,7 @@ class TagCloud extends Component {
   }
 
   componentWillUnmount() {
+    this.isUnmount = true;
     window.removeEventListener('resize', this.resize);
   }
 
@@ -87,18 +88,14 @@ class TagCloud extends Component {
     const h = height * 4;
     const w = this.root.offsetWidth * 4;
 
-    const imageMask = new Image();
-    imageMask.crossOrigin = '';
-    imageMask.src = imgUrl;
-
-    imageMask.onload = () => {
+    const onload = () => {
       const dv = new DataSet.View().source(data);
       const range = dv.range('value');
       const [min, max] = range;
       dv.transform({
         type: 'tag-cloud',
         fields: ['name', 'value'],
-        imageMask,
+        imageMask: this.imageMask,
         font: 'Verdana',
         size: [w, h], // 宽高设置最好根据 imageMask 做调整
         padding: 5,
@@ -112,12 +109,26 @@ class TagCloud extends Component {
         },
       });
 
+      if (this.isUnmount) {
+        return;
+      }
+
       this.setState({
         dv,
         w,
         h,
       });
     };
+
+    if (!this.imageMask) {
+      this.imageMask = new Image();
+      this.imageMask.crossOrigin = '';
+      this.imageMask.src = imgUrl;
+
+      this.imageMask.onload = onload;
+    } else {
+      onload();
+    }
   };
 
   render() {

+ 1 - 1
src/layouts/PageHeaderLayout.js

@@ -6,7 +6,7 @@ import styles from './PageHeaderLayout.less';
 export default ({ children, wrapperClassName, top, ...restProps }) => (
   <div style={{ margin: '-24px -24px 0' }} className={wrapperClassName}>
     {top}
-    <PageHeader {...restProps} linkElement={Link} />
+    <PageHeader key="pageheader" {...restProps} linkElement={Link} />
     {children ? <div className={styles.content}>{children}</div> : null}
   </div>
 );