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

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;
相关推荐
froginwe111 分钟前
Ruby Dir 类和方法
开发语言
代码游侠1 分钟前
学习笔记——ARM Cortex-A 裸机开发实战指南
linux·运维·开发语言·前端·arm开发·笔记
星火开发设计4 分钟前
表达式与语句:C++ 程序的执行逻辑基础
java·开发语言·c++·学习·知识·表达式
m0_748254664 分钟前
CSS 编辑器
前端·css·编辑器
纵有疾風起5 分钟前
【Linux 系统开发】基础开发工具详解:软件包管理器、编辑器。编译器开发实战
linux·服务器·开发语言·经验分享·bash·shell
Amumu121387 分钟前
React扩展(二)
前端·javascript·react.js
rqtz10 分钟前
网页响应式布局方法
前端·css·响应式
郝学胜-神的一滴12 分钟前
Qt与Web混合编程:CEF与QCefView深度解析
开发语言·前端·javascript·c++·qt·程序人生·软件构建
冬奇Lab14 分钟前
【Kotlin系列08】泛型进阶:从型变到具体化类型参数的类型安全之旅
android·开发语言·windows·安全·kotlin
fareast_mzh14 分钟前
Why Web2 → Web3 is slow
开发语言·web3