UNPKG

zent

Version:

一套前端设计语言和基于React的实现

114 lines (97 loc) 2.44 kB
--- order: 6 zh-CN: title: 滚动加载 en-US: title: Scroll Loading Usage --- ```js import { MenuCascader } from 'zent'; import { clone, getNode } from 'zent/es/cascader/public-options-fns'; const OPTIONS = Array(20) .fill(null) .map((_, index) => ({ value: String(index), label: `Option ${index}`, loadChildrenOnExpand: true, loadChildrenOnScroll: true, })); let optionId = 0; class Simple extends React.Component { state = { options: OPTIONS, }; onChange = (value, selectedOptions, meta) => { console.log(value, selectedOptions, meta); this.setState({ value, }); }; loadOptions = (selectedOptions, meta) => new Promise((resolve, reject) => { const nonLeaf = selectedOptions.length < 2; console.log(selectedOptions, meta); setTimeout(() => { let newOptions = clone(this.state.options); if (meta.action === 'loadChildren') { const res = Array(10) .fill(null) .map((_, index) => { optionId++; return { value: `Next ${optionId}`, label: `Next ${optionId}`, loadChildrenOnExpand: nonLeaf, loadChildrenOnScroll: nonLeaf, }; }); const node = getNode(newOptions, selectedOptions); node.children = res; // mark as loaded node.loadChildrenOnExpand = false; } else if (meta.action === 'scroll') { const res = Array(10) .fill(null) .map((_, index) => { optionId++; return { value: `Scroll ${optionId}`, label: `Scroll ${optionId}`, loadChildrenOnExpand: nonLeaf, loadChildrenOnScroll: nonLeaf, }; }); // 非第一级 if (selectedOptions.length > 0) { const node = getNode(newOptions, selectedOptions); node.children = (node.children || []).concat(res); // 最多加载 30 条数据 node.loadChildrenOnScroll = node.children.length < 30; } else { newOptions = newOptions.concat(res); } } this.setState({ options: newOptions, }); // 是否可继续加载更多 resolve(true); }, 5000); }); render() { return ( <MenuCascader value={this.state.value} options={this.state.options} onChange={this.onChange} loadOptions={this.loadOptions} expandTrigger="click" scrollable clearable loadChildrenOnScroll={this.state.options.length <= 20} /> ); } } ReactDOM.render(<Simple />, mountNode); ```