123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <!-- 国际手机输入组件 -->
- <template>
- <picker mode="selector" :range="country.map(item => item.chinese_name +' +'+ item.phone_code)" :value="selectedIndex"
- @change="pickChange" style="float: left;height: 100%;width: 110rpx;display: flex;align-items: center;">
- <view>+{{selectedCode}}
- <image src="@/static/icon/select-icon.png" style="width: 20rpx;height: 20rpx;" />
- </view>
- </picker>
- <uni-easyinput placeholder="请输入手机号" v-model="state.model.mobile" @input="verifyMobile" :inputBorder="false" type="number" style="float: left;width: calc(100% - 110rpx);">
- <template v-slot:right>
- <button class="ss-reset-button code-btn code-btn-start" :disabled="!verifyUsername || selectedCode != 86"
- :class="{ 'disabled': !verifyUsername || selectedCode != 86}" @tap="getSmsCode('smsLogin', state.model.mobile)">
- {{ getSmsTimer('smsLogin') }}
- </button>
- </template>
- </uni-easyinput>
- </template>
- <script setup>
- import {
- ref,
- reactive,
- unref,
- computed
- } from 'vue';
- import sheep from '@/sheep';
- import {
- getSmsCode,
- getSmsTimer
- } from '@/sheep/hooks/useModal';
- import {
- onLoad
- } from '@dcloudio/uni-app';
- import countryData from '@/sheep/libs/country.json';
- import {parsePhoneNumberFromString,AsYouType } from 'libphonenumber-js';
- import parseMobile from 'libphonenumber-js/mobile'
- const country = ref(countryData);
- const selectedCode = ref('');
- const selectedCountryCode = ref('');
- const selectedIndex = ref(0);
- // 查找中国在 country 数组中的索引
- const findIndexByCode = (code) => {
- return country.value.findIndex(item => item.phone_code == code);
- };
- // 更新选中的国家代码和索引
- const pickChange = (e) => {
- selectedIndex.value = e.detail.value;
- selectedCode.value = country.value[selectedIndex.value].phone_code;
- selectedCountryCode.value = country.value[selectedIndex.value].country_code;
- };
- // 设置默认选中中国
- onLoad(() => {
- const chinaIndex = findIndexByCode('86');
- if (chinaIndex !== -1) {
- selectedIndex.value = chinaIndex;
- selectedCode.value = country.value[chinaIndex].phone_code;
- selectedCountryCode.value = country.value[chinaIndex].country_code;
- }
- });
- const props = defineProps({
- verifyUsername: {
- type: Boolean
- }
- });
- const emits = defineEmits(['input']);
- const verifyMobile = (e) => {
- // console.log(e.detail.value)
- const phone = e;
- if(phone == ''){
- emits('input',phone,'请输入手机号')
- } else {
- try{
- const phoneParseMobile = parseMobile(phone, selectedCountryCode.value);
- if(phoneParseMobile.isValid()){
- emits('input',phone,'')
- }else{
- emits('input',phone,'手机号码格式不正确')
- }
- }catch(e){
- // console.log(e)
- }
- }
- }
- // 账号注册数据
- const state = reactive({
- codeText: '获取验证码',
- model: {
- mobile: '', // 手机号
- }
- });
- </script>
- <style lang="scss" scoped>
- @import '../index.scss';
- .code-btn-start {
- color: var(--ui-BG-Main);
- border: 1px solid var(--ui-BG-Main);
- }
- .disabled {
- border: 1px solid #f7f7f7;
- }
- .loginUniForm {
- border: 1rpx solid #d6d6d6;
- padding: 10rpx 15rpx;
- border-radius: 10rpx;
- }
- .loginUniFormItem {
- border-bottom: 1rpx solid #d6d6d6;
- padding-bottom: 10rpx;
- }
- .loginUniFormItem:last-child {
- border-bottom: none;
- padding-top: 10rpx;
- }
- ::v-deep .loginUniFormItem .uni-forms-item__inner {
- padding-bottom: 0;
- }
- ::v-deep .loginUniFormItem .uni-error-message {
- bottom: -20rpx;
- }
- </style>
|