前端地区树形控件-实现懒加载及回显按需加载

javascript 复制代码
const ProvinceCascader = (props) => {
  const dispatch = useDispatch();
  const type = props?.type || 'area';
  const areaList = useSelector((state) => state.utils.areaList);

  const [options, setOptions] = useState();
  const [echoValue, setEchoValue] = useState();
  const [statusUse, setStatusUse] = useState('echo');

  useEffect(async () => {
    if (Array.isArray(props.value) && statusUse == 'echo') {
      // 数据回显
      if (props.id && props.id.split('_')[0] !== 'serviceSites') {
        //服务超市错误数据
        dispatch({
          type: 'utils/clearAreaList', //清空仓库缓存
        });
        await echoLoadData(props.value);
        setEchoValue(props.value);
      }
    } else if (!props.value) {
      // 新增时下拉
      dispatch({
        type: 'utils/clearAreaList', //清空仓库缓存
      });
      if (type == 'area' && !props.value) {
        //默认成都市开始选择
        loadData(531531);
      } else if (type == 'nationwide' && !props.value) {
        //全国开始选择
        loadData(0);
      }
    }
  }, [props.value]);

  useEffect(() => {
    if (areaList) {
      setOptions(areaList);
    }
  }, [areaList]);

  const onChange = (e) => {
    if (e == undefined) {
      setEchoValue(undefined);
    }
    setStatusUse('onChange');
    setEchoValue(e);
    loadData(e[e.length - 1]); //选中区域id
    props.onChange(e);
  };

  const loadData = async (areaId) => {
    await dispatch({
      type: 'utils/getAreaList',
      payload: {
        parentId: areaId,
      },
    });
    return true;
  };

  const echoLoadData = async (areaIds) => {
    await dispatch({
      type: 'utils/getEchoAreaList',
      payload: areaIds,
    });
    return true;
  };

  return (
    <Cascader
      fieldNames={{
        label: 'name',
        value: 'id',
        children: 'children',
      }}
      value={echoValue}
      options={options}
      onChange={onChange}
      changeOnSelect
      disabled={props.disabled}
      allowClear
    />
  );
};

export default ProvinceCascader;
相关推荐
zh_xuan4 分钟前
测试go语言函数和结构体
开发语言·golang
时光少年5 分钟前
Android 视频分屏性能优化——GLContext共享
前端
小龙报14 分钟前
【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿
c语言·开发语言·数据结构·c++·vscode·算法·二分
yong999017 分钟前
NNDA、PDA、JPDA、IMM数据关联算法MATLAB实现
开发语言·算法·matlab
IT_陈寒23 分钟前
JavaScript开发者必知的5个性能杀手,你踩了几个坑?
前端·人工智能·后端
Shining059625 分钟前
Triton & 九齿系列《Triton 练气术》
开发语言·人工智能·python·学习·其他·infinitensor
跟着珅聪学java26 分钟前
Electron 精美菜单设计
运维·前端·数据库
日光倾27 分钟前
【Vue.js 入门笔记】闭包和对象引用
前端·vue.js·笔记
EstherNi29 分钟前
左右两侧定位的效果,vue3
javascript·vue.js
天远Date Lab30 分钟前
天远企业司法认证API实战:Python构建企业级供应链合规审查防火墙
大数据·开发语言·网络·python