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

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;
相关推荐
Evand J37 分钟前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
lijun_xiao20092 小时前
前端最新Vue2+Vue3基础入门到实战项目全套教程
前端
爱喝白开水a2 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway2 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
90后的晨仔2 小时前
Pinia 状态管理原理与实战全解析
前端·vue.js
武子康2 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼2 小时前
JavaWeb_p165部门管理
java·开发语言·前端
EndingCoder2 小时前
WebSocket实时通信:Socket.io
服务器·javascript·网络·websocket·网络协议·node.js
90后的晨仔2 小时前
Vue3 状态管理完全指南:从响应式 API 到 Pinia
前端·vue.js
90后的晨仔2 小时前
Vue 内置组件全解析:提升开发效率的五大神器
前端·vue.js