rc-tree-select
Advanced tools
Comparing version 1.5.2-beta to 1.5.2-beta.1
@@ -167,3 +167,3 @@ 'use strict'; | ||
// save parsed treeData, for performance (treeData may be very big) | ||
this.renderedTreeData = this.renderTreeData(props); | ||
this.renderedTreeData = this.renderTreeData(); | ||
value = this.addLabelToValue(props, value); | ||
@@ -181,2 +181,9 @@ value = this.getValue(props, value); | ||
if ('value' in nextProps) { | ||
if (this._cacheTreeNodesStates !== 'force' && this._savedValue && nextProps.value === this._savedValue) { | ||
// 只处理用户直接 在 onChange 里 this.setState({value}); 并且是同一个对象引用。 | ||
// 后续可以对比对象里边的值。 | ||
this._cacheTreeNodesStates = true; | ||
} else { | ||
this._cacheTreeNodesStates = false; | ||
} | ||
var value = (0, _util.toArray)(nextProps.value); | ||
@@ -374,2 +381,5 @@ // save parsed treeData, for performance (treeData may be very big) | ||
extraInfo.allCheckedNodes = props.treeCheckStrictly ? info.checkedNodes : (0, _util.flatToHierarchy)(info.checkedNodesPositions); | ||
this._checkedNodes = info.checkedNodesPositions; | ||
var _tree = this.refs.trigger.popupEle; | ||
this._treeNodesStates = _tree.checkKeys; | ||
} else { | ||
@@ -534,6 +544,13 @@ extraInfo.selected = info.selected; | ||
} | ||
var checkedTreeNodes = (0, _util.getTreeNodesStates)(this.renderedTreeData || _props.children, value.map(function (item) { | ||
return item.value; | ||
})).checkedTreeNodes; | ||
this.checkedTreeNodes = checkedTreeNodes; | ||
var checkedTreeNodes = undefined; | ||
if (this._cachetreeData && this._cacheTreeNodesStates && this.checkedTreeNodes) { | ||
checkedTreeNodes = this._checkedNodes; | ||
} else { | ||
// getTreeNodesStates 耗时,做缓存处理。 | ||
this._treeNodesStates = (0, _util.getTreeNodesStates)(this.renderedTreeData || _props.children, value.map(function (item) { | ||
return item.value; | ||
})); | ||
checkedTreeNodes = this._treeNodesStates.checkedNodes; | ||
this.checkedTreeNodes = checkedTreeNodes; | ||
} | ||
var mapLabVal = function mapLabVal(arr) { | ||
@@ -616,5 +633,7 @@ return arr.map(function (itemObj) { | ||
}); | ||
this.fireChange(this.state.value.filter(function (val) { | ||
var nv = this.state.value.filter(function (val) { | ||
return newVals.indexOf(val.value) !== -1; | ||
}), { triggerValue: selectedValue, clear: true }); | ||
}); | ||
this._cacheTreeNodesStates = 'force'; | ||
this.fireChange(nv, { triggerValue: selectedValue, clear: true }); | ||
}, | ||
@@ -736,3 +755,4 @@ | ||
}); | ||
props.onChange(this.getVLForOnChange(value), labs, ex); | ||
this._savedValue = this.getVLForOnChange(value); | ||
props.onChange(this._savedValue, labs, ex); | ||
} | ||
@@ -835,2 +855,8 @@ }, | ||
if (validProps.treeData) { | ||
if (props && props.treeData === this.props.treeData && this.renderedTreeData) { | ||
// cache and use pre data. | ||
this._cachetreeData = true; | ||
return this.renderedTreeData; | ||
} | ||
this._cachetreeData = false; | ||
return loopTreeData(validProps.treeData); | ||
@@ -871,2 +897,4 @@ } | ||
treeData: this.renderedTreeData, | ||
_cachetreeData: this._cachetreeData, | ||
_treeNodesStates: this._treeNodesStates, | ||
multiple: multiple, | ||
@@ -873,0 +901,0 @@ disabled: disabled, |
@@ -136,3 +136,4 @@ 'use strict'; | ||
checkStrictly: props.treeCheckStrictly, | ||
filterTreeNode: this.filterTree | ||
filterTreeNode: this.filterTree, | ||
_treeNodesStates: props._treeNodesStates | ||
}; | ||
@@ -193,4 +194,12 @@ | ||
}; | ||
var treeNodes = recursive(props.treeData || props.treeNodes); | ||
// const s = Date.now(); | ||
// let treeNodes = recursive(props.treeData || props.treeNodes); | ||
var treeNodes = undefined; | ||
if (props._cachetreeData && this.treeNodes) { | ||
treeNodes = this.treeNodes; | ||
} else { | ||
treeNodes = recursive(props.treeData || props.treeNodes); | ||
this.treeNodes = treeNodes; | ||
} | ||
// console.log(Date.now()-s); | ||
var recursive1 = function recursive1(children) { | ||
@@ -197,0 +206,0 @@ var cb = arguments.length <= 1 || arguments[1] === undefined ? function (ch) { |
136
lib/util.js
@@ -21,3 +21,2 @@ /* eslint no-loop-func: 0*/ | ||
exports.isInclude = isInclude; | ||
exports.getCheckedKeys = getCheckedKeys; | ||
exports.loopAllChildren = loopAllChildren; | ||
@@ -31,4 +30,2 @@ exports.flatToHierarchy = flatToHierarchy; | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } | ||
var _react = require('react'); | ||
@@ -124,7 +121,8 @@ | ||
function getCheckedKeys(node, checkedKeys, allCheckedNodesKeys) { | ||
var nodeKey = node.props.eventKey; | ||
var newCks = [].concat(_toConsumableArray(checkedKeys)); | ||
var nodePos = undefined; | ||
var unCheck = allCheckedNodesKeys.some(function (item) { | ||
/* | ||
export function getCheckedKeys(node, checkedKeys, allCheckedNodesKeys) { | ||
const nodeKey = node.props.eventKey; | ||
let newCks = [...checkedKeys]; | ||
let nodePos; | ||
const unCheck = allCheckedNodesKeys.some(item => { | ||
if (item.key === nodeKey) { | ||
@@ -136,15 +134,15 @@ nodePos = item.pos; | ||
if (unCheck) { | ||
(function () { | ||
var nArr = nodePos.split('-'); | ||
newCks = []; | ||
allCheckedNodesKeys.forEach(function (item) { | ||
var iArr = item.pos.split('-'); | ||
if (item.pos === nodePos || nArr.length > iArr.length && isInclude(iArr, nArr) || nArr.length < iArr.length && isInclude(nArr, iArr)) { | ||
// 过滤掉 父级节点 和 所有子节点。 | ||
// 因为 node节点 不选时,其 父级节点 和 所有子节点 都不选。 | ||
return; | ||
} | ||
newCks.push(item.key); | ||
}); | ||
})(); | ||
const nArr = nodePos.split('-'); | ||
newCks = []; | ||
allCheckedNodesKeys.forEach(item => { | ||
const iArr = item.pos.split('-'); | ||
if (item.pos === nodePos || | ||
nArr.length > iArr.length && isInclude(iArr, nArr) || | ||
nArr.length < iArr.length && isInclude(nArr, iArr)) { | ||
// 过滤掉 父级节点 和 所有子节点。 | ||
// 因为 node节点 不选时,其 父级节点 和 所有子节点 都不选。 | ||
return; | ||
} | ||
newCks.push(item.key); | ||
}); | ||
} else { | ||
@@ -155,18 +153,52 @@ newCks.push(nodeKey); | ||
} | ||
*/ | ||
function loopAllChildren(childs, callback) { | ||
var loop = function loop(children, level) { | ||
function getChildrenlength(children) { | ||
var len = 1; | ||
if (Array.isArray(children)) { | ||
len = children.length; | ||
} | ||
return len; | ||
} | ||
function getSiblingPosition(index, len, siblingPosition) { | ||
if (len === 1) { | ||
siblingPosition.first = true; | ||
siblingPosition.last = true; | ||
} else { | ||
siblingPosition.first = index === 0; | ||
siblingPosition.last = index === len - 1; | ||
} | ||
return siblingPosition; | ||
} | ||
function loopAllChildren(childs, callback, parent) { | ||
var loop = function loop(children, level, _parent) { | ||
var len = getChildrenlength(children); | ||
_react2['default'].Children.forEach(children, function (item, index) { | ||
var pos = level + '-' + index; | ||
if (item && item.props.children) { | ||
loop(item.props.children, pos); | ||
if (item.props.children && item.type) { | ||
loop(item.props.children, pos, { node: item, pos: pos }); | ||
} | ||
if (item) { | ||
callback(item, index, pos, getValuePropValue(item)); | ||
} | ||
callback(item, index, pos, item.key || pos, getSiblingPosition(index, len, {}), _parent); | ||
}); | ||
}; | ||
loop(childs, 0); | ||
loop(childs, 0, parent); | ||
} | ||
// export function loopAllChildren(childs, callback) { | ||
// const loop = (children, level) => { | ||
// React.Children.forEach(children, (item, index) => { | ||
// const pos = `${level}-${index}`; | ||
// if (item && item.props.children) { | ||
// loop(item.props.children, pos); | ||
// } | ||
// if (item) { | ||
// callback(item, index, pos, getValuePropValue(item)); | ||
// } | ||
// }); | ||
// }; | ||
// loop(childs, 0); | ||
// } | ||
function flatToHierarchy(arr) { | ||
@@ -260,3 +292,3 @@ if (!arr.length) { | ||
var stripTail = function stripTail(str) { | ||
function stripTail(str) { | ||
var arr = str.match(/(.+)(-[^-]+)$/); | ||
@@ -268,6 +300,6 @@ var st = ''; | ||
return st; | ||
}; | ||
var splitPosition = function splitPosition(pos) { | ||
} | ||
function splitPosition(pos) { | ||
return pos.split('-'); | ||
}; | ||
} | ||
@@ -361,13 +393,18 @@ // TODO 再优化 | ||
function getCheck(treeNodesStates) { | ||
var checkedTreeNodes = []; | ||
function getCheck(treeNodesStates, checkedPositions) { | ||
var checkPartKeys = []; | ||
var checkedKeys = []; | ||
var checkedNodes = []; | ||
Object.keys(treeNodesStates).forEach(function (item) { | ||
var itemObj = treeNodesStates[item]; | ||
if (itemObj.checked) { | ||
// checkedTreeNodes.push(getValuePropValue(itemObj.node)); | ||
checkedTreeNodes.push(_extends({}, itemObj, { pos: item })); | ||
checkedKeys.push(itemObj.key); | ||
// checkedNodes.push(getValuePropValue(itemObj.node)); | ||
checkedNodes.push(_extends({}, itemObj, { pos: item })); | ||
} else if (itemObj.checkPart) { | ||
checkPartKeys.push(itemObj.key); | ||
} | ||
}); | ||
return { | ||
checkedTreeNodes: checkedTreeNodes | ||
checkPartKeys: checkPartKeys, checkedKeys: checkedKeys, checkedNodes: checkedNodes, treeNodesStates: treeNodesStates, checkedPositions: checkedPositions | ||
}; | ||
@@ -377,20 +414,21 @@ } | ||
function getTreeNodesStates(children, values) { | ||
var checkedPos = []; | ||
var checkedPositions = []; | ||
var treeNodesStates = {}; | ||
loopAllChildren(children, function (item, index, pos, value) { | ||
var checked = false; | ||
if (values.indexOf(value) !== -1) { | ||
checked = true; | ||
checkedPos.push(pos); | ||
} | ||
loopAllChildren(children, function (item, index, pos, keyOrPos, siblingPosition) { | ||
treeNodesStates[pos] = { | ||
node: item, | ||
checked: checked, | ||
checkPart: false | ||
key: keyOrPos, | ||
checked: false, | ||
checkPart: false, | ||
siblingPosition: siblingPosition | ||
}; | ||
if (values.indexOf(getValuePropValue(item)) !== -1) { | ||
treeNodesStates[pos].checked = true; | ||
checkedPositions.push(pos); | ||
} | ||
}); | ||
handleCheckState(treeNodesStates, filterParentPosition(checkedPos.sort()), true); | ||
handleCheckState(treeNodesStates, filterParentPosition(checkedPositions.sort()), true); | ||
return getCheck(treeNodesStates); | ||
return getCheck(treeNodesStates, checkedPositions); | ||
} |
{ | ||
"name": "rc-tree-select", | ||
"version": "1.5.2-beta", | ||
"version": "1.5.2-beta.1", | ||
"description": "tree-select ui component for react", | ||
@@ -60,3 +60,3 @@ "keywords": [ | ||
"rc-animate": "^2.0.2", | ||
"rc-tree": "^1.2.0-beta.2", | ||
"rc-tree": "^1.2.0-beta.3", | ||
"rc-trigger": "^1.0.6", | ||
@@ -63,0 +63,0 @@ "rc-util": "^3.1.2" |
@@ -84,3 +84,2 @@ # rc-tree-select | ||
|treeCheckStrictly | check node precisely, parent and children nodes are not associated| bool | false | | ||
|skipHandleInitValue | skip handle init value when enable treeCheckable | bool | false | | ||
|filterTreeNode | filter some treeNodes as you need. it should return true | function(treeNode) | - | | ||
@@ -87,0 +86,0 @@ |treeNodeFilterProp | which prop value of treeNode will be used for filter if filterTreeNode return true | String | 'value' | |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
100872
2940
113
Updatedrc-tree@^1.2.0-beta.3