PC地址选择器示例

简介: PC地址选择器示例

import React, {useEffect, useState} from 'react';
import {CascaderSelect} from '@alifd/next';
import PropTypes from 'prop-types';
import {ProvinciaCascade} from '@api/publicInterface';
import useRequest from "@hooks/useRequest";

/**

  • 1580043700@qq.com
  • Zhang Jun
  • createDate: 2020-12-11
  • @param props
  • @returns {*}
  • @constructor 地址选择器,暂时不需要多选,后期有需求再加。

*/
const params = {token: sessionStorage.getItem('token')};

function Address(props) {
const {showSearch, onChange, disabled, value, dataSource, placeholder, resultAutoWidth, hasClear, depth} = props;
const [source, setSource] = useState([]);

const {data} = useRequest(ProvinciaCascade, params);

useEffect(() => {

   if (!dataSource) {
       setSource(formatData(data, depth));
   } else {
       setSource(dataSource);
   }

}, [dataSource, data]);

return (

   <CascaderSelect
       hasClear={hasClear}
       resultAutoWidth={resultAutoWidth}
       showSearch={showSearch}
       onChange={!!onChange && onChange}
       dataSource={dataSource ?? source}
       value={value && value[depth - 1]}
       disabled={disabled}
       placeholder={placeholder}
   />

);
}

const formatData = (data, depth) => {
if (!data || data.length === 0) {

   return [];

}
return format(data, depth);
};

const format = (data, depth) => {
depth -= 1;
if (depth === -1) {

   return null;

}
if (data) {

   return data.map((v) => {
       return {label: v.name, value: v.id, children: format(v.data, depth)};
   });

} else {

   return null;

}
};

Address.defaultProps = {
resultAutoWidth: false,
showSearch: false,
value: [],
disabled: false,
hasClear: true,
depth: 3,
};

Address.propTypes = {
onChange: PropTypes.func, //值改变
dataSource: PropTypes.array, //数据源,不传递则使用后台接口数据
value: PropTypes.array, //选中的数据
disabled: PropTypes.bool, //是否禁用
placeholder: PropTypes.string, //输入提示
depth: PropTypes.number, //地址显示深度1-3(省市区),默认显示3(省市区)
showSearch: PropTypes.bool, //显示搜素,默认false
hasClear: PropTypes.bool, //是否可清空,默认true
resultAutoWidth: PropTypes.bool, // 搜索结果列表是否和选择框等宽,默认false
};

export default Address;

目录
相关文章
|
7月前
|
网络协议 网络架构
IP 地址的结构和类型
【4月更文挑战第12天】
290 0
IP 地址的结构和类型
|
7月前
|
JavaScript
表单输入绑定 值绑定
表单输入绑定 值绑定
|
7月前
|
iOS开发
表单输入绑定 基本用法
表单输入绑定 基本用法
|
7月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
7月前
|
Web App开发 移动开发 HTML5
如何在HTML5使用WebRTC(内含可测试地址可用TRUN服务器)
如何在HTML5使用WebRTC(内含可测试地址可用TRUN服务器)
|
前端开发
前端学习案例5-this指向问题-显示绑定
前端学习案例5-this指向问题-显示绑定
75 0
前端学习案例5-this指向问题-显示绑定
|
XML 数据格式
为什么访问同一个网址却返回不同的内容
为什么访问同一个网址却返回不同的内容
多IP情况下如何获取本地的第一个IP及如何调整本地的第一个IP
我分析了业务的代码,OPTIONS中的Via中的用的是采用gethostbyname获取的。这意味着该函数获取的系统的默认的第一个IP。如果操作系统有多个IP,如何设置它们的优先级呢?
多IP情况下如何获取本地的第一个IP及如何调整本地的第一个IP
uiu
|
JavaScript
【Svelte】-(7)绑定|Each 块绑定 / audio video 媒体标签绑定 / client offset 尺寸绑定 / this / 组件绑定
【Svelte】-(7)绑定|Each 块绑定 / audio video 媒体标签绑定 / client offset 尺寸绑定 / this / 组件绑定
uiu
108 0
【Svelte】-(7)绑定|Each 块绑定 / audio video 媒体标签绑定 / client offset 尺寸绑定 / this / 组件绑定
|
开发者
我的第一个页面及其标签简介|学习笔记
快速学习我的第一个页面及其标签简介