地址栏选择器
import { ComponentClass } from 'react'
import Taro, { Component } from '@tarojs/taro'
import { View, PickerView, PickerViewColumn } from '@tarojs/components'
import { DrivingService } from '@/services/index'
import './index.scss'
type PageStateProps = { //获取父组件的值
province? : string,
city?: string,
chooseCity :any,
arr:any
}
type PageOwnProps = {}
type IProps = PageStateProps & PageOwnProps
type PageState = { // 数据类型
city: string,
cityCode: string,
cityList: any,
province: any,
provinceCode: string,
provinceList: any,
getValue: number[],
getTitle: string,
getClose: string
showPicker: boolean,
changeType: boolean
}
interface Index {
props: IProps
}
class Index extends Component {
constructor(props) {
super(props);
this.clickFun = this.clickFun.bind(this);
}
state: PageState = { // 默认数据
city: '',
cityCode: '',
cityList: [],
province:'',
provinceCode: '',
provinceList: [],
getValue: [0, 0],
getTitle: '选择地址',
getClose:'',
showPicker: false,
changeType: false,
}
componentWillMount() {
// console.log(this.props);
}
componentDidShow() {
console.log('这是componentDidShow这是加载显示');
}
componentDidMount() { // 这是一个建立定时器的好地方
let { province, city } = this.props.arr;
this.setState({
province,
city
}, () => {
this.getProvinceList();
})
}
componentWillReceiveProps() {
//console.log('这是componentWillReceiveProps');
}
componentWillUnmount() {
console.log('这是componentWillUnmount');
}
componentDidHide() {
console.log('componentDidHide');
}
getProvinceList = () => { // 获取省份接口
DrivingService.getProvinceCityList({
appointmentProject: 1,
appointmentType: 0
}).then(({ data }) => {
this.setState({
provinceList: data
});
this.getCity(data[0].areaCode, '');
});
}
getCity = (code, val) => { // 获取城市接口
DrivingService.getCityList({
appointmentProject: 1,
appointmentType: 0,
areaShopProvinceCode: code
}).then(({ data }) => {
if (val && val.length > 0) {
this.setState({
cityList: data,
province: this.state.provinceList[val[0]].areaName,
provinceCode: code,
city: data[val[1]].areaName,
getValue: val,
cityCode: data[val[1]].areaCode
});
} else {
this.setState({
cityList: data
});
}
});
}
onChange = (e) => { // 滑动改变值
const val = e.detail.value;
this.getCity(this.state.provinceList[val[0]].areaCode, val);
this.setState({
changeType: true
})
}
openClose = () => { // 点击状态
this.setState({
showPicker: !this.state.showPicker,
});
}
confirm = () => { //关闭
if (this.state.province === '选择试驾城市' ) {
this.setState({
showPicker: false,
province: this.state.provinceList[0].areaName,
city: this.state.cityList[0].areaName,
provinceCode: this.state.provinceList[0].areaCode,
cityCode: this.state.cityList[0].areaCode,
getValue: [0, 0]
});
} else {
this.setState({
showPicker: false
});
}
}
clickFun() { //点击确认
if (this.state.province === '选择试驾城市' || this.state.changeType === false) {
this.setState({
showPicker: false,
province: this.state.provinceList[0].areaName,
city: this.state.cityList[0].areaName,
provinceCode: this.state.provinceList[0].areaCode,
cityCode: this.state.cityList[0].areaCode,
getValue: [0, 0]
});
this.props.chooseCity(this.state.provinceList[0].areaName, this.state.provinceList[0].areaCode, this.state.cityList[0].areaName, this.state.cityList[0].areaCode) // 这个地方把值传递给了props的事件当中
} else {
this.setState({
showPicker: false
});
this.props.chooseCity(this.state.province, this.state.provinceCode, this.state.city, this.state.cityCode) // 这个地方把值传递给了props的事件当中
}
// console.log(text,v);
}
render() {
const { showPicker, city, province, getTitle, getClose} = this.state;
return (
<View className="addressBox">
<View className="addressTitle" onClick={this.openClose}>
<View className="address" >{province}{city}</View>
<View className="rightIcon"></View>
</View>
{ showPicker
?<View className="picker">
<View className="topList">
{getClose ? <View className="close" onClick={this.confirm}></View> : ''}
<View className="title">{getTitle?getTitle:''}</View>
<View className="sure" onClick={this.clickFun}>确认</View>
</View>
<PickerView indicatorStyle='height: 50px;' style='width: 100%; height: 200px; text-align: center; line-height: 50px;' value={this.state.getValue} onChange={this.onChange}>
<PickerViewColumn>
{this.state.provinceList.map(item => {
return (
<View data-code={item.areaCode}>{item.areaName}</View>
)
})}
</PickerViewColumn>
<PickerViewColumn>
{this.state.cityList.map((item) => {
return (
<View>{item.areaName}</View>
);
})}
</PickerViewColumn>
</PickerView>
</View>
:''
}
</View>
)
}
}
export default Index as ComponentClass<PageOwnProps, PageState>
.addressBox {
width: 660px;
.addressTitle{
display: flex;
align-items: center;
justify-content: space-between;
.address {
position: relative;
}
.rightIcon {
width: 44px;
height: 44px;
background: url('https://ueapp-oss-static.leapmotor.com/leapMiniApp/appointment_driving/go_to.png')no-repeat;
background-size: 44px 44px;
display: block;
}
}
}
.picker{
width: 100%;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
border-top:1px solid #E5E5E5;
background: #fff;
z-index: 99;
.topList{
height:100px;
line-height:100px;
display: flex;
justify-content: flex-end;
align-items: center;
padding-right:10px;
padding-left: 10px;
.title {
width: 260px;
}
.sure,
.close {
display: inline-block;
height: 50px;
width: 200px;
text-align: center;
line-height: 50px;
color: #3d7abd;
}
}
}
使用方式
1 import AddressPicker from '@/components/address-picker'
2 callback(pName, pCode, cName, cCode) {
3 this.getCityStore(cCode, this.state.longitudeLatitude);
4 this.setState({
5 provinceCode: pCode,
6 cityCode: cCode,
7 province: pName,
8 city: cName
9 }, () => {
10 console.log(this.state);
11 //setState是异步操作,但是我们可以在它的回调函数里面进行操作
12 });
13 }
14 <AddressPicker arr={{ province, city }} chooseCity={this.callback}></AddressPicker>