UNPKG

jobsys-mpower

Version:

Enhanced component based on Taro & NutUI

141 lines (124 loc) 3.51 kB
import { computed, defineComponent, ref, watch } from "vue" import { Cascader } from "@nutui/nutui-taro" import localData from "./addressData.json" import PickerWrapper, { pickerProps, pickerSlots } from "./PickerWrapper.jsx" import { defaultFieldProps, defaultOptionsProps, useOptionTrait } from "../utils" import { isArray, last } from "lodash-es" import { useFindTextsFromPath } from "../../hooks" /** * 地址组件 * * 数据优先级:`dataSource` > `url` > `本地数据` * * @version 1.0.0 */ export default defineComponent({ name: "MpAddress", props: { ...defaultOptionsProps, ...defaultFieldProps, modelValue: { type: [String, Number, Array], default: () => [] }, /** * 标题 */ title: { type: String, default: "" }, /** * 生成哪个级别的数据 * 1: 省, 2: 省市, 3: 省市区 */ level: { type: Number, default: 3 }, }, emits: ["update:modelValue"], setup(props, { emit, slots, expose }) { const defaultValue = isArray(props.modelValue) ? last(props.modelValue) : props.modelValue const componentValue = ref(defaultValue) watch( () => props.modelValue, () => (componentValue.value = isArray(props.modelValue) ? last(props.modelValue) : props.modelValue), ) const pickerRef = ref(null) const options = ref([]) const displayText = computed(() => { if (props.modelValue.length === 0) { return "" } return useFindTextsFromPath(options.value, props.modelValue, { value: "code", children: "children", label: "name", }).join("/") }) useOptionTrait(options, props, localData) const onFinish = ({ selectedOptions }) => { pickerRef.value.close() emit( "update:modelValue", selectedOptions.map((item) => item.code), ) } expose({ displayText }) /********** render **********/ return () => ( <PickerWrapper ref={pickerRef} {...pickerProps(props)}> {{ ...pickerSlots(slots, props), default: () => ( <Cascader v-model={componentValue.value} fieldNames={{ text: "name", value: "code", children: "children" }} closeable={false} showHeader={false} options={options.value} onFinish={onFinish} /> ), }} </PickerWrapper> ) }, }) /** * * 根据地址编码获取完整的地址编码 * * @param code * @param {number} [level] 地址级别: 1: 省, 2: 省市, 3: 省市区 * @return {string[]|(string|*)[]|*[]} */ export function useAddressFullCode(code, level) { code += "" if (code && code.length === 6) { if (!level) { if (/0000$/.test(code)) { level = 1 } else if (/00$/.test(code)) { level = 2 } else { level = 3 } } if (level === 1) { return [`${code.substr(0, 2)}0000`] } if (level === 2) { return [`${code.substr(0, 2)}0000`, `${code.substr(0, 4)}00`] } if (level === 3) { return [`${code.substr(0, 2)}0000`, `${code.substr(0, 4)}00`, code] } } return [] } /** * 根据地址编码获取完整的地址名称 * @param code * @param {number} [level] 地址级别: 1: 省, 2: 省市, 3: 省市区 * @return {*[]} */ export function useAddressNameFormCode(code, level) { if (!isArray(code)) { code = useAddressFullCode(code, level) } return useFindTextsFromPath(localData, code, { value: "code", label: "name", children: "children" }) } export const addressData = localData