react项目封装省市区选择组件

12 篇文章 0 订阅
7 篇文章 0 订阅

一、地址选择器组件封装

1、引入antd的Select组件
import React, { Component } from "react";
import { Select } from "antd";
import { api } from '../api/modules/services/src/api';

const { Option } = Select;
2、定义组件Props & States
  • onSelectData 最后选中后的所有值
  • provinceList 省的数据
  • cityList 市的数据
  • areaList 区的数据
interface States {
    onSelectData: string
    provinceList: any[]
    cityList: any[]
    areaList: any[]
}

interface Props {
    range: 'province' | 'city' | 'area' // 地址选择的范围(市/区)
    onSelect: (value: any) => void //通过参数传给父组件选中地址值
}
3、创建class组件

封装思路:

  • 接口先后获取省市区列表数据 provinceList、cityList、areaList
  • 遍历对应的省市区列表获取对应的option provinceOptions、cityOptions、areaOptions
  • onChange事件 获取当前Select组件选中的地址code,获取相应的省市区数据,字符串拼接抛出给父组件
class AreaSelect extends Component<Props, States>{
    constructor(props: Props) {
        super(props);
        this.state = {
            onSelectData: '',
            provinceList: [],
            cityList: [],
            areaList: []
        }
    }
    componentDidMount() {
        this.getProvinceList()
    }

    /******* 省市区列表获取 start ****/
    getProvinceList() {
        api.codeGetProvinceList().then((res) => {
            this.setState({ provinceList: res.data || [] })
        })
    }

    getCityList(provinceCode: string) {
        api.codeGetCityList(provinceCode).then((res) => {
            this.setState({ cityList: res.data || [] })
        })
    }

    getAreaList(CityCode: string) {
        api.codeGetAreaList(CityCode).then((res) => {
            this.setState({ areaList: res.data || [] })
        })
    }
    /******* 省市区列表获取 end ****/

    /*******  省市区选中值 start *****/
    procinceChange(value: string) {
        this.getCityList(value)
        this.setState({ onSelectData: value })
    }

    cityChange(value: string) {
        const code = this.state.onSelectData + ',' + value;
        this.setState({ onSelectData: code })
        if (this.props.range === 'city') {
            this.props.onSelect(code)
        }
        if(this.props.range === 'area'){
            this.getAreaList(value)
        }
    }

    areaChange(value: string) {
        const code = this.state.onSelectData + ',' + value;
        this.setState({ onSelectData: code })
        this.props.onSelect(code)
    }
    /*******  省市区选中值 end *****/

    render() {
        const { range } = this.props;
        const { provinceList, cityList, areaList } = this.state;
        const provinceOptions = provinceList.map((v) => {
            return <Option key={v.provinceCode} value={v.provinceCode}>{v.provinceName}</Option>
        })

        const cityOptions = cityList.map((v) => {
            return <Option key={v.cityCode} value={v.cityCode}>{v.cityName}</Option>
        })        
        
        const areaOptions = areaList.map((v) => {
            return <Option key={v.areaCode} value={v.areaCode}>{v.areaName}</Option>
        })

        return (
            <div style={{ display: 'flex', flexDirection: 'row' }}>
                <Select onChange={this.procinceChange.bind(this)} placeholder="请选择">
                    {provinceOptions}
                </Select>

                {
                    range === 'city' || range === 'area' ?
                        <Select onChange={this.cityChange.bind(this)} style={{ marginLeft: 5 }} placeholder="请选择">
                            {cityOptions}
                        </Select> : null
                }

                {
                    range === 'area' ?
                        <Select onChange={this.areaChange.bind(this)} style={{ marginLeft: 5 }} placeholder="请选择">
                            {areaOptions}
                        </Select> : null
                }
            </div>
        )
    }
}

export default AreaSelect;

二、父组件使用

1、引入封装的地址选择器组件
import AreaSelect from '../../../components/AreaSelect';
2、表单渲染
  • onSelect 获取子组件传入的参数
  • 传入地址选择范围 range
  • range 地址选择器范围
  • city: 省市 area: 省市区
<Form.Item name="branchAddrCode" label="银行账户支行地址" rules={[{ required: true }]}>
    <AreaSelect onSelect={this.onSelect.bind(this)} range='city' />
</Form.Item>
<Form.Item name="corporationAddr" label="企业地址" rules={[{ required: true }]}>
    <AreaSelect onSelect={this.onSelect.bind(this)} range='area' />
</Form.Item>
3、获取最后选择省市区的code
onSelect(value: any) {
    this.form.current.setFieldsValue({
        branchAddrCode: value
    })
    console.log('valueAre===', value); 
    // valueAre=== 32,320100,320115
}

const formValues = this.form.current.getFieldsValue();
const code = formValues.branchAddrCode.split(','); 
// code=== ['32', '320100', '320115']

视图

省市

在这里插入图片描述

省市区

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks 是 React 16.8 新增的特性,它使得函数组件可以拥有状态和生命周期等特性,这样就不再需要使用类组件。下面是一个使用 React Hooks 封装的弹窗组件的示例: ```jsx import React, { useState } from 'react'; function Modal(props) { const [isOpen, setIsOpen] = useState(false); const handleOpen = () => { setIsOpen(true); }; const handleClose = () => { setIsOpen(false); }; return ( <div> <button onClick={handleOpen}>Open Modal</button> {isOpen && ( <div> <div className="overlay" onClick={handleClose}></div> <div className="modal"> <h1>{props.title}</h1> <p>{props.content}</p> <button onClick={handleClose}>Close Modal</button> </div> </div> )} </div> ); } export default Modal; ``` 这个组件包含两个状态:`isOpen` 表示弹窗是否打开,`setIsOpen` 是更新状态的方法。当用户点击打开弹窗的按钮时,调用 `handleOpen` 方法,将 `isOpen` 设置为 `true`,弹窗就会显示出来。当用户点击关闭弹窗的按钮或者点击弹窗外的区域时,调用 `handleClose` 方法,将 `isOpen` 设置为 `false`,弹窗就会关闭。 使用这个组件时,可以这样写: ```jsx import React from 'react'; import Modal from './Modal'; function App() { return ( <div> <Modal title="Modal Title" content="Modal Content" /> </div> ); } export default App; ``` 这个示例中,渲染了一个 Modal 组件,并传递了必要的属性,如标题和内容。用户点击打开弹窗的按钮时,就会弹出一个 Modal 组件。 这个组件的优点在于它使用了 React Hooks,将状态和事件都封装在了组件内部,使得代码更加简洁和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值