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

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;
相关推荐
全栈前端老曹7 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
新缸中之脑7 小时前
开发AI代理必备的8个Python 库
开发语言·人工智能·python
暴走十八步7 小时前
PHP+vscode开启调试debug
开发语言·vscode·php
郝学胜-神的一滴7 小时前
Python 列表 vs 数组:深入解析与最佳选择指南
开发语言·python·程序人生
杜子不疼.7 小时前
基于ATVC模板库的Ascend C Vector算子快速开发指南
c语言·开发语言·mfc
MSTcheng.7 小时前
【C++】C++11新特性(三)
开发语言·c++·c++11
learning-striving7 小时前
kali连不上网解决方法
linux·开发语言·网络·php·kali
田野追逐星光7 小时前
STL容器list的模拟实现
开发语言·c++·list
NCDS程序员7 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵7 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css