uniapp粘贴板地址识别

1: 插件安装

主要是依靠 address-parse 这个插件:

官网收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场

javascript 复制代码
// 首先需要引入插件
npm install address-parse --save

2:html部分

html 复制代码
		<view class="">
			<view class="center copyContBox">
				<textarea 
					placeholder='云南省昆明市西山区前福路xxx号,李狗蛋,132xxxxxxxx' 
					v-model="copyContent" 
					style="width: 100%;"></textarea>
			</view>
			<view class="copyBtnBox">
				<button 
					@click="discernAddAddressBtn" 
					class="copyBtn center">{{$t(`识别地址`)}}
				</button>
			</view>
		</view>

        <form @submit="formSubmit">
			<view class='addAddress'>
				<view class='list'>
					<view class='item acea-row row-between-wrapper'>
						<view class='name'>{{$t(`姓名`)}}</view>
						<input type='text' 
                            :placeholder='$t(`请输入姓名`)' 
                            name='real_name' 
                            :value="userAddress.real_name"
						    placeholder-class='placeholder'>
                        </input>
					</view>
					<view class='item acea-row row-between-wrapper'>
						<view class='name'>{{$t(`联系电话`)}}</view>
						<input 
                             type='number' 
                             :placeholder='$t(`请输入联系电话`)' 
                             name="phone" 
                             :value='userAddress.phone'
							 placeholder-class='placeholder' 
                             pattern="\d*">
                        </input>
					</view>
					<view class='item acea-row row-between-wrapper'>
						<view class='name'>{{$t(`所在地区`)}}</view>
						<view class="address">
							<picker 
                                mode="multiSelector" 
                                @change="bindRegionChange"
								@columnchange="bindMultiPickerColumnChange"                     
                                :value="valueRegion" 
                                :range="multiArray">
								<view class='acea-row'>
									<view class="picker">
                                    {{region[0]}},
                                    {{region[1]}},                
                                    {{region[2]}}</view>
									<view 
                                        class='iconfont icon-dizhi fontcolor'>
                                    </view>
								</view>
							</picker>
						</view>
					</view>
					<view class='item acea-row row-between-wrapper'>
						<view class='name'>{{$t(`详细地址`)}}</view>
						<input type='text' 
                            :placeholder='$t(`请填写具体地址`)' 
                            name='detail' placeholder-class='placeholder'
							:value='userAddress.detail'></input>
					</view>
				</view>
				<view 
                    class='default acea-row row-middle' 
                    @click='ChangeIsDefault'>
					<checkbox-group>
						<checkbox 
                            :checked="userAddress.is_default ? true : false" />    
                            {{$t(`设置为默认地址`)}}
					</checkbox-group>
				</view>

				<button class='keepBnt bg-color' form-type="submit">
                    {{$t(`立即保存`)}}
                </button>
				<!-- #ifdef MP -->
				<view class="wechatAddress" v-if="!id" @click="getWxAddress">
                    {{$t(`导入微信地址`)}}
                </view>
				<!-- #endif -->
				
			</view>
		</form>


        <style scoped lang="scss">
            .copyContBox{
		        padding: 15rpx;
		        box-sizing: border-box;
		        background-color: #fff;
	        }
	        .copyBtnBox{
		        margin: 15rpx;
		        display: flex;
		        justify-content: flex-end;
	        }
	        .copyBtn{
		        width: 160rpx;
		        height: 60rpx;
		        color: #fff;
		        background-color: #42ca4d;
		        font-size: 25rpx;
	        }
	        .center{
		        display: flex;
		        justify-content: center;
		        align-items: center;
	        }
        </style>

3:is代码

html 复制代码
<script>
import AddressParse from 'address-parse';

export default {
    data() {
        return {
            copyContent:"",
            userAddress: {
		        is_default: false
		    }, //地址详情
            region: [this.$t(`省`), this.$t(`市`), this.$t(`区`)],
        }
        
    },
    methods: {
        discernAddAddressBtn(){
		    let that=this;
			const result = AddressParse.parse(that.copyContent)[0];
				if(result==undefined){
					return  that.$util.Tips({
						title: that.$t(`粘贴板为空,请将复制的内容放到粘贴板区域`)
					});
				}else{
				    if(
                        result.province==""&&result.city==""&&result.area==""
                        &&result.name==""&&result.mobile==""
                      ){
						uni.showModal({
							title: '温馨提示',
							content: '请输入正确的地址',
							success: function (res) {
								that.userAddress.real_name="";
								that.userAddress.mobile="";
								that.userAddress.details="";
								that.$set(that,'region', ["省","市","区"]);
								if (res.confirm) {
									// console.log('用户点击确定',that.useIntegral);
								} else if (res.cancel) {
									// console.log('用户点击取消');
									// 用户点击了取消按钮的相关逻辑可以放在这里
								}
							}
						});
					}else{
						that.$set(that.userAddress, 'real_name', result.name);
						that.$set(that.userAddress, 'phone', result.mobile);
						if(
                            result.province!=""||result.city!=""||
                            result.area!=""
                          ){
							that.$set(
                                that,
                                'region',
                                [result.province,result.city,result.area]
                            );
						 }else{
							that.$set(that,'region', ["省","市","区"]);
						}
						that.$set(that.userAddress, 'detail', result.details);
						that.cityId= this.getCityId(
                            that.district,result.province,result.city,result.area
                        ).v;
					}
				}
			},
			// 用粘贴板的省市区 匹配后台返回的省市区 获取城市id
			getCityId(arr,province,city,area){
				if(province!=""&city!=""&area!=""){
					let obj={}
					for (let item of arr) {
						if(item.n == province){
							if(item.c.length>0){
								for (let ite of item.c) {
									if(ite.n == city){
										if(ite.c.length>0){
											let obj=ite.c.find((val)=>{
												return val.n==area
											})
											return obj
										}
									}
								}
							}
						}
					}
				}else{
					return false;
				}
			},
    },
}
</script>
相关推荐
Mr_Xuhhh43 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
永乐春秋2 小时前
WEB攻防-通用漏洞&文件上传&js验证&mime&user.ini&语言特性
前端
鸽鸽程序猿2 小时前
【前端】CSS
前端·css
ggdpzhk2 小时前
VUE:基于MVVN的前端js框架
前端·javascript·vue.js
小曲曲3 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•4 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS5 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜6 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点6 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow6 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js