rsuite
Version:
A suite of react components
76 lines (68 loc) • 1.99 kB
text/typescript
import { shallowEqual } from 'rsuite-utils/lib/utils';
import stringToObject from '../utils/stringToObject';
import { CascaderProps } from './Cascader.d';
export function getDerivedStateForCascade(
nextProps: CascaderProps,
prevState: any,
selectNodeValue?: any,
newChildren?: any[]
): {
items: any[];
tempActivePaths?: any[];
activePaths?: any[];
} {
const { data, labelKey, valueKey, childrenKey, value } = nextProps;
const activeItemValue =
selectNodeValue || (typeof value === 'undefined' ? prevState.value : value);
const nextItems = [];
const nextPathItems = [];
const findNode = items => {
for (let i = 0; i < items.length; i += 1) {
items[i] = stringToObject(items[i], labelKey, valueKey);
let children = items[i][childrenKey];
if (shallowEqual(items[i][valueKey], activeItemValue)) {
return {
items,
active: items[i]
};
} else if (children) {
let v = findNode(children);
if (v) {
nextItems.push(
children.map(item => ({
...stringToObject(item, labelKey, valueKey),
parent: items[i]
}))
);
nextPathItems.push(v.active);
return {
items,
active: items[i]
};
}
}
}
return null;
};
const activeItem = findNode(data);
nextItems.push(data);
if (activeItem) {
nextPathItems.push(activeItem.active);
}
/**
* 如果是异步更新 data 后,获取到的一个 selectNodeValue,则不更新 activePaths
* 但是需要更新 items, 因为这里的目的就是把异步更新后的的数据展示出来
*/
const cascadePathItems = nextPathItems.reverse();
if (newChildren) {
return {
items: [...nextItems.reverse(), newChildren],
tempActivePaths: cascadePathItems
};
}
return {
items: nextItems.reverse(),
tempActivePaths: null,
activePaths: cascadePathItems
};
}