From 41a1f85dd5a38da86efad1139c47be03b7543768 Mon Sep 17 00:00:00 2001
From: tjz <415800467@qq.com>
Date: Thu, 12 Apr 2018 22:04:55 +0800
Subject: [PATCH] add vc-tree demo
---
 components/tabs/tabs.jsx                 |   2 +-
 components/vc-tree/demo/contextmenu.less |  18 ++++
 components/vc-tree/demo/contextmenu.vue  |  75 +++++++++++++++
 components/vc-tree/demo/draggable.less   |  11 +++
 components/vc-tree/demo/draggable.vue    | 111 +++++++++++++++++++++++
 components/vc-tree/src/Tree.jsx          |  50 +++-------
 components/vc-tree/src/TreeNode.jsx      |   8 +-
 components/vc-tree/src/util.js           |   2 +-
 site/routes.js                           |   2 +-
 9 files changed, 232 insertions(+), 47 deletions(-)
 create mode 100644 components/vc-tree/demo/contextmenu.less
 create mode 100644 components/vc-tree/demo/contextmenu.vue
 create mode 100644 components/vc-tree/demo/draggable.less
 create mode 100644 components/vc-tree/demo/draggable.vue
diff --git a/components/tabs/tabs.jsx b/components/tabs/tabs.jsx
index 99bbf0f9d..e905c6895 100644
--- a/components/tabs/tabs.jsx
+++ b/components/tabs/tabs.jsx
@@ -1,7 +1,7 @@
 
 import Tabs from '../vc-tabs/src/Tabs'
 import isFlexSupported from '../_util/isFlexSupported'
-import { hasProp, getComponentFromProp, getComponentName, isEmptyElement, getSlotOptions } from '../_util/props-util'
+import { hasProp, getComponentFromProp, isEmptyElement, getSlotOptions } from '../_util/props-util'
 import warning from '../_util/warning'
 export default {
   name: 'ATabs',
diff --git a/components/vc-tree/demo/contextmenu.less b/components/vc-tree/demo/contextmenu.less
new file mode 100644
index 000000000..63295d04f
--- /dev/null
+++ b/components/vc-tree/demo/contextmenu.less
@@ -0,0 +1,18 @@
+@contextmenuPrefixCls: rc-tree-contextmenu;
+.@{contextmenuPrefixCls} {
+  position: absolute;
+  left: -9999px;
+  top: -9999px;
+  z-index: 1070;
+  display: block;
+  background-color: #fff;
+
+  &-hidden {
+    display: none;
+  }
+
+  &-inner {
+    border: 1px solid #ddd;
+    padding: 10px 20px;
+  }
+}
diff --git a/components/vc-tree/demo/contextmenu.vue b/components/vc-tree/demo/contextmenu.vue
new file mode 100644
index 000000000..6d536ef7e
--- /dev/null
+++ b/components/vc-tree/demo/contextmenu.vue
@@ -0,0 +1,75 @@
+
+
diff --git a/components/vc-tree/demo/draggable.less b/components/vc-tree/demo/draggable.less
new file mode 100644
index 000000000..dfe188788
--- /dev/null
+++ b/components/vc-tree/demo/draggable.less
@@ -0,0 +1,11 @@
+
+.draggable-demo{
+  padding: 0 20px;
+  .draggable-container {
+    margin: 10px 30px;
+    width: 200px;
+    height: 200px;
+    overflow: auto;
+    border: 1px solid #ccc;
+  }
+}
diff --git a/components/vc-tree/demo/draggable.vue b/components/vc-tree/demo/draggable.vue
new file mode 100644
index 000000000..14337392f
--- /dev/null
+++ b/components/vc-tree/demo/draggable.vue
@@ -0,0 +1,111 @@
+
\ No newline at end of file
diff --git a/components/vc-tree/src/Tree.jsx b/components/vc-tree/src/Tree.jsx
index 23cbd1e90..5204380db 100644
--- a/components/vc-tree/src/Tree.jsx
+++ b/components/vc-tree/src/Tree.jsx
@@ -1,7 +1,7 @@
 import PropTypes from '../../_util/vue-types'
 import classNames from 'classnames'
 import warning from 'warning'
-import { initDefaultProps, getOptionProps } from '../../_util/props-util'
+import { initDefaultProps, getOptionProps, getSlots } from '../../_util/props-util'
 import { cloneElement } from '../../_util/vnode'
 import BaseMixin from '../../_util/BaseMixin'
 import {
@@ -162,9 +162,10 @@ const Tree = {
     }
     return {
       ...state,
-      ...(this.getSyncProps(props) || {}),
+      ...this.getSyncProps(props),
       dragOverNodeKey: '',
       dropPosition: null,
+      dragNodesKeys: [],
     }
   },
   provide () {
@@ -203,8 +204,8 @@ const Tree = {
   methods: {
     onNodeDragStart (event, node) {
       const { sExpandedKeys } = this
-      const { eventKey, children } = node.props
-
+      const { eventKey } = node
+      const children = getSlots(node).default
       this.dragNode = node
 
       this.setState({
@@ -223,13 +224,13 @@ const Tree = {
      */
     onNodeDragEnter (event, node) {
       const { sExpandedKeys } = this
-      const { pos, eventKey } = node.props
+      const { pos, eventKey } = node
 
       const dropPosition = calcDropPosition(event, node)
 
       // Skip if drag node is self
       if (
-        this.dragNode.props.eventKey === eventKey &&
+        this.dragNode.eventKey === eventKey &&
         dropPosition === 0
       ) {
         this.setState({
@@ -268,7 +269,7 @@ const Tree = {
       }, 0)
     },
     onNodeDragOver (event, node) {
-      const { eventKey } = node.props
+      const { eventKey } = node
 
       // Update drag position
       if (this.dragNode && eventKey === this.dragOverNodeKey) {
@@ -297,7 +298,7 @@ const Tree = {
     onNodeDrop (event, node) {
       const { dragNodesKeys, dropPosition } = this
 
-      const { eventKey, pos } = node.props
+      const { eventKey, pos } = node
 
       this.setState({
         dragOverNodeKey: '',
@@ -509,46 +510,21 @@ const Tree = {
     /**
      * Sync state with props if needed
      */
-    getSyncProps (props = {}, prevProps) {
-      let needSync = false
+    getSyncProps (props = {}) {
       const newState = {}
-      const myPrevProps = prevProps || {}
       const children = this.$slots.default
-      function checkSync (name) {
-        if (props[name] !== myPrevProps[name]) {
-          needSync = true
-          return true
-        }
-        return false
-      }
-
-      // Children change will affect check box status.
-      // And no need to check when prev props not provided
-      if (prevProps && checkSync('children')) {
-        const { checkedKeys = [], halfCheckedKeys = [] } =
-          calcCheckedKeys(props.checkedKeys || this.sCheckedKeys, props, children) || {}
-        newState.sCheckedKeys = checkedKeys
-        newState.sHalfCheckedKeys = halfCheckedKeys
-      }
-
-      // Re-calculate when autoExpandParent or expandedKeys changed
-      if (prevProps && (checkSync('autoExpandParent') || checkSync('expandedKeys'))) {
-        newState.sExpandedKeys = props.autoExpandParent
-          ? calcExpandedKeys(props.expandedKeys, props, children) : props.expandedKeys
-      }
-
-      if (checkSync('selectedKeys')) {
+      if (props.selectedKeys !== undefined) {
         newState.sSelectedKeys = calcSelectedKeys(props.selectedKeys, props, children)
       }
 
-      if (checkSync('checkedKeys')) {
+      if (props.checkedKeys !== undefined) {
         const { checkedKeys = [], halfCheckedKeys = [] } =
         calcCheckedKeys(props.checkedKeys, props, children) || {}
         newState.sCheckedKeys = checkedKeys
         newState.sHalfCheckedKeys = halfCheckedKeys
       }
 
-      return needSync ? newState : null
+      return newState
     },
 
     /**
diff --git a/components/vc-tree/src/TreeNode.jsx b/components/vc-tree/src/TreeNode.jsx
index ce8d02025..5154308bf 100644
--- a/components/vc-tree/src/TreeNode.jsx
+++ b/components/vc-tree/src/TreeNode.jsx
@@ -291,11 +291,6 @@ const TreeNode = {
       }
     },
 
-    // Drag usage
-    setSelectHandle (node) {
-      this.selectHandle = node
-    },
-
     getNodeChildren () {
       const { $slots: { default: children }} = this
       const originList = filterEmpty(children)
@@ -497,10 +492,9 @@ const TreeNode = {
           )}
           draggable={(!disabled && draggable) || undefined}
           aria-grabbed={(!disabled && draggable) || undefined}
-
           onMouseenter={this.onMouseEnter}
           onMouseleave={this.onMouseLeave}
-          onContexmenu={this.onContextMenu}
+          onContextmenu={this.onContextMenu}
           onClick={this.onSelectorClick}
           onDragstart={this.onDragStart}
         >
diff --git a/components/vc-tree/src/util.js b/components/vc-tree/src/util.js
index c55fbc446..11fd3bd13 100644
--- a/components/vc-tree/src/util.js
+++ b/components/vc-tree/src/util.js
@@ -176,7 +176,7 @@ export function getDragNodesKeys (treeNodes, node) {
 
 export function calcDropPosition (event, treeNode) {
   const { clientY } = event
-  const { top, bottom, height } = treeNode.selectHandle.getBoundingClientRect()
+  const { top, bottom, height } = treeNode.$refs.selectHandle.getBoundingClientRect()
   const des = Math.max(height * DRAG_SIDE_RANGE, DRAG_MIN_GAP)
 
   if (clientY <= top + des) {
diff --git a/site/routes.js b/site/routes.js
index 2b214efe2..6360a0fc8 100644
--- a/site/routes.js
+++ b/site/routes.js
@@ -3,7 +3,7 @@ import Layout from './components/layout.vue'
 const AsyncTestComp = () => {
   const d = window.location.hash.replace('#', '')
   return {
-    component: import(`../components/vc-upload/demo/${d}`),
+    component: import(`../components/vc-tree/demo/${d}`),
   }
 }