Select大数据量优化,针对 antd3x Select
https://blog.csdn.net/liuyuhua666/article/details/103703478
下拉刷新组件
参考 https://www.cnblogs.com/zling-gnilz/p/11064113.html
实现效果:https://lrhvt.csb.app

``jsx
const SearchInput = () => {
const arr = [{ label: "test text", key: "test" }];
for (let i = 0; i < 500; i++) {
arr.push({
label:label-${i}`,
key: i,
});
}
return
<a name="SLkOe"></a>## onPopupScroll1. select组件下,onPopupScroll的API这样子可以自定义模拟 scrollToEnd2. 参考:[https://github.com/ant-design/ant-design/issues/12406#issuecomment-424968753](https://github.com/ant-design/ant-design/issues/12406#issuecomment-424968753)1. Select 组件提供 onScrollToEnd API,这样可以用来支持无限分页滚动```jsxonPopupScroll = e => {e.persist();let target = e.target;if (target.scrollTop + target.offsetHeight === target.scrollHeight) {// scrollToEnd, do something!!!}};
select下拉刷新组件
import React from "react";import { Select } from "antd";import PropTypes from "prop-types";const { Option } = Select;export default class CustomSelect extends React.Component {static propTypes = {dataSource: PropTypes.arrayOf(PropTypes.shape({key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,label: PropTypes.string})),onChange: PropTypes.func};static defaultProps = {dataSource: []};constructor(props) {super(props);this.state = {page: 1,showArr: props.dataSource};this.pageSize = 20;this.list = [];}pageSt = 0;handleChange = v => {const { onChange, dataSource } = this.props;onChange && onChange(v);this.setState({ page: 1, showArr: dataSource });};handlePopupScroll = e => {const { page, showArr } = this.state;e.persist();const { target } = e;const st = target.scrollTop;if (st === 0 && this.pageSt) {target.scrollTop = this.pageSt;}if (st + target.offsetHeight + 2 >= target.scrollHeight &&this.list.length < showArr.length) {this.setState({ page: page + 1 });this.pageSt = st;} else {this.pageSt = 0;}};handleFocus = () => {this.prevScroll = 0;const { dataSource } = this.props;this.setState({ page: 1, showArr: dataSource });};handleSearch = v => {const { dataSource } = this.props;v = v || "";const filterWord = v.trim().toLowerCase();const showArr = dataSource.filter(item =>item.label.toLowerCase().includes(filterWord));this.setState({ page: 1, showArr });};render() {const { dataSource, ...rest } = this.props;const { showArr, page } = this.state;if (showArr.length > this.pageSize) {this.list = showArr.slice(0, this.pageSize * page);// 当value是外部赋值的时候,判断value是否在当前的list中,如果不在,单独加进来if (this.props.value != null) {let valueObj = this.list.find(item => item.key === this.props.value);if (!valueObj) {valueObj = dataSource.find(item => item.key === this.props.value);valueObj && this.list.unshift(valueObj);}}} else {this.list = showArr;}return (<Select{...rest}onChange={this.handleChange}filterOption={false}onPopupScroll={this.handlePopupScroll}onFocus={this.handleFocus}onSearch={this.handleSearch}>{this.list.map(opt => (<Option key={opt.key} value={opt.key}>{opt.label || opt.key}</Option>))}</Select>);}}
