升级最新版HBuilderX后 抖音小程序突然不支持uni-easyinput的事件 uni-app
升级最新版HBuilderX后 抖音小程序突然不支持uni-easyinput的事件 uni-app
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Windows 11 专业版 22631.3296 | HBuilderX |
示例代码:
<template>
<view class="title">
<text>老师快速登录</text>
</view>
<view class="login-info">
<view class="input-phone">
<uni-easyinput v-model="phoneNumber" type="number" maxlength="11" trim="all" :errorMessage="phoneInputError"
placeholder="请输入手机号" @input="onInputPhone" @clear="onClearPhone"></uni-easyinput>
<view class="input-error">
<text>{{phoneInputError}}</text>
</view>
</view>
<view class="input-code" v-if="isLogin">
<view class="code">
<uni-easyinput type="number" maxlength="6" trim="all" :errorMessage="codeInputError"
placeholder="请输入验证码" @input="onInputVerifyCode" @clear="onClearVerifyCode"></uni-easyinput>
<view class="input-error">
<text>{{codeInputError}}</text>
</view>
</view>
<view class="countdown" v-if="!isReget">
<uni-countdown :color="color" :second="60" @timeup="onTimeupdate" :showDay='false' :showHour='false'
:showMinute="false" />
<text>秒后重新获取</text>
</view>
<view class="reget-code" v-if="isReget" @click="onGetVerifyCode">
<text>重新获取</text>
</view>
</view>
<view class="protocols">
<uni-data-checkbox class="checkbox" multiple v-model="checkboxV" @change="onChangeBox" :localdata="hobby">
</uni-data-checkbox>
<text class="text">已详读并同意</text>
<text class="link-text" @click="onUserAgreement">用户协议</text>
<text>和</text>
<text class="link-text" @click="onPrivacyPolicy">隐私政策</text>
<text>,新手机号将自动注册</text>
</view>
<button class="get-code" v-if="!isLogin" @click="onGetVerifyCode">获取验证码</button>
<button class="get-code" v-if="isLogin" :disabled="loginDisabled" @click="onLogin">登录</button>
</view>
</template>
<script setup>
import teacher from '@/api/teacher.js'
import student from '@/api/student.js'
import {
ref
} from "vue";
import tools from '@/utils/tools.js'
// 手机号
const phoneNumber = ref('')
// 用户协议和隐私政策
const hobby = ref([{
text: '',
value: true
}])
// 选中用户协议和隐私政策的值
const checkboxV = ref()
// 验证码
const verifyCode = ref('')
const phoneInputError = ref('')
const codeInputError = ref('')
// 获取验证码按钮是否置灰
const buttonDisabled = ref(true)
// 验证码倒计时文字颜色
const color = ref('#d5d5d5')
// 判断是否显示重新获取
const isReget = ref(false)
// 登录按钮是否置灰
const loginDisabled = ref(true)
// 是否显示登录按钮
const isLogin = ref(false)
// 判断输入的手机号格式是否正确
const onInputPhone = (e) => {
phoneInputError.value = ''
console.log("phoneNumber:", e)
if (e && isNaN(parseInt(e))) {
phoneInputError.value = '只能输入手机号'
return
}
}
// 判断选中用户协议和隐私政策
const isProtocolSelect = () => {
if (!(checkboxV.value && checkboxV.value[0])) {
uni.showToast({
title: "阅读并勾选用户协议和隐私政策",
icon: 'none',
})
return false
}
return true
}
// 查看用户协议
const onUserAgreement = () => {
uni.navigateTo({
url: '/pages/protocols/user_agreement'
})
}
// 查看隐私政策
const onPrivacyPolicy = () => {
uni.navigateTo({
url: '/pages/protocols/privacy_policy'
})
}
// 获取验证码按钮置灰
const onClearPhone = () => {
buttonDisabled.value = true
}
// 获取验证码
const onGetVerifyCode = async () => {
// 判断选中用户协议和隐私政策
if (!isProtocolSelect()) {
return
}
console.log("phoneNumber:", phoneNumber.value)
if (
phoneNumber.value.length != 11 ||
isNaN(parseInt(phoneNumber.value.length))
) {
isLogin.value = false
phoneInputError.value = "手机号错误,请重新输入"
return
}
let {
message,
data
} = await teacher.apiSendVerifyCode({
phone: tools.phoneToE16(phoneNumber.value)
})
if (message == '0') {
isReget.value = false
isLogin.value = true
}
// isReget.value = false
// isLogin.value = true
}
// 判断输入的验证码的格式是否正确
const onInputVerifyCode = async (e) => {
codeInputError.value = ''
verifyCode.value = e
if (e && isNaN(parseInt(verifyCode.value))) {
codeInputError.value = '只能输入验证码'
return
}
if (verifyCode.value.length == 6) {
loginDisabled.value = false
await onLogin()
} else {
loginDisabled.value = true
}
}
// 登录按钮置灰
const onClearVerifyCode = () => {
loginDisabled.value = true
}
// 倒计时结束时显示重新获取
const onTimeupdate = () => {
isReget.value = true
}
// 登录
const onLogin = async () => {
// 判断选中用户协议和隐私政策
if (!isProtocolSelect()) {
return
}
// 退出学生账户
if (uni.getStorageSync('role') == "student") {
await student.apiLogout()
}
let {
message,
data
} = await teacher.apiUserLogin2({
phone: tools.phoneToE16(phoneNumber.value),
verify_code: verifyCode.value,
})
if (message == '0') {
// console.log("resp data:", data)
uni.setStorageSync("accessToken", {
token: data.access_token,
expiresAt: data.access_token_expires_at,
})
uni.setStorageSync('role', 'teacher')
await beforNavigate()
} else {
codeInputError.value = '验证码错误'
// console.log('登陆失败:', message)
}
}
const beforNavigate = async () => {
let {
message,
data
} = await teacher.apiGetBriefInfo()
if (message == '0') {
if (!data.name) {
// 先补充个人基本信息
uni.redirectTo({
url: '/pages/teacher-my/improve-information'
})
} else {
// 返回上一页并重载
let pages = getCurrentPages()
uni.reLaunch({
url: "/" + pages[pages.length - 2]?.route
})
}
}
}
</script>
<style lang="scss">
page {
background-color: #fff;
display: flex;
flex-direction: column;
justify-content: center;
}
.title {
margin: 94rpx auto 0 auto;
font-size: 48rpx;
color: #232832;
}
.login-info {
margin: 144rpx 48rpx 0 48rpx;
.input-error {
height: 14rpx;
font-size: 24rpx;
color: #dd524d;
}
.input-phone {
display: flex;
flex-direction: column;
}
.input-code {
display: flex;
flex-direction: row;
.code {
width: 380rpx;
}
.countdown {
width: 226rpx;
height: 72rpx;
background-color: #F7F6F6;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 26rpx;
color: #d5d5d5;
}
.reget-code {
width: 226rpx;
height: 70rpx;
border: 1px solid #d5d5d5;
display: flex;
justify-content: center;
align-items: center;
font-size: 26rpx;
}
}
.protocols {
font-size: 24rpx;
color: #787B86;
margin: 30rpx auto;
text-align: left;
display: flex;
flex-direction: row;
align-items: center;
.checkbox {
width: 48rpx;
}
.link-text {
color: #4594FF;
text-decoration: underline;
}
}
.get-code {
height: 88rpx;
font-size: 32rpx;
color: white;
background-color: #FF4E4D;
}
}
[@import](/user/import) "@/static/icons/iconfont.css";
.login-phone {
width: 630rpx;
border-radius: 46rpx;
background-color: #fff;
border: solid 2rpx #D1D1D6;
color: #232832;
}
.login-phone .icon {
position: absolute;
left: 40rpx;
}
</style>
更多关于升级最新版HBuilderX后 抖音小程序突然不支持uni-easyinput的事件 uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
感谢反馈,你提到相同的代码在微信、qq 上可以,在抖音上不行,我已复现,通过调试发现
临时解决方案
进入 umi module 文件夹找到easyinput 组件,
方案一 推荐
源码中现在是开启 options.virtualHost=true 会导致这个问题,你可以尝试临时设置 options.virrtualHost=false 来绕过该问题。
方案二
或者你对平台进行兼容。通过判断 ifdef 是抖音就设置为 false,其他平台默认为 true,这也是官方接下来的修复方案
原因分析
的确是本次升级带来的一个潜在影响,抖音小程序开启 virtualHost 之后,会影响自定义绑定的事件。https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/framework/custom-component/component-model-and-style/#7417c627 ,而微信平台没有这个问题。本次升级正好在抖音刚刚支持 fragment 的时间点,旧版本默认不生效,新版本生效了,对比之下产生了差异
后续解决
后续会对 easyinput 进行兼容,在抖音平台默认关闭虚拟节点
更多关于升级最新版HBuilderX后 抖音小程序突然不支持uni-easyinput的事件 uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
原因分析:的确是本次升级带来的一个潜在影响,抖音小程序开启 virtualHost 之后,会影响自定义绑定的事件。https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/framework/custom-component/component-model-and-style/#7417c627 ,而微信平台没有这个问题。本次升级正好在抖音刚刚支持 fragment 的时间点,旧版本默认不生效,新版本生效了,对比之下产生了差异
后续解决:后续会对 easyinput 进行兼容,在抖音平台默认关闭虚拟节点
收到,回退到上一版BuilderX,目前先用着旧版,等新版bug解决后再升级吧。
我是cli vscode ,抖音小程序依然不能用。 v-model 一输入 抖音开放工具卡死,:value @input 方式,还可以响应一个字母,然后继续卡死。
卡死的问题修复了,还没有发版。你参考 https://ask.dcloud.net.cn/question/193727 可以正常使用
我这用的还是老版本 uni-easyinput,按照官方方式修改
事实证明,老老实实,用生态内的方案
hbuildx脚手架+uni_modules(加载ui方案,可随时颗粒化优化)
天呐,找四个人,uni-forms virtualHost 没有同步更新的原因。
在升级 HBuilderX 后,抖音小程序(或其他平台)突然不支持 uni-easyinput
组件的事件,可能是由于以下原因导致的:
1. HBuilderX 版本兼容性问题
- HBuilderX 的最新版本可能存在与某些组件或平台的兼容性问题。
- 特别是
uni-easyinput
组件,可能在新版本中被调整了事件处理逻辑,导致抖音小程序无法正常响应事件。
解决方法:
- 回滚到之前的稳定版本 HBuilderX。
- 检查 HBuilderX 更新日志,确认是否有针对
uni-easyinput
或抖音小程序的更新说明。
2. 抖音小程序平台适配问题
- 抖音小程序的平台适配可能未及时跟进 HBuilderX 的最新版本。
uni-easyinput
的事件(如@input
、@blur
、@focus
等)在抖音小程序中可能未被正确处理。
解决方法:
- 检查
uni-easyinput
的官方文档,确认抖音小程序是否支持相关事件。 - 使用原生
input
组件替代uni-easyinput
,测试事件是否正常触发。
3. uni-app 框架问题
uni-app
框架可能在最新版本中对事件处理机制进行了调整,导致与抖音小程序的兼容性问题。
解决方法:
- 检查
uni-app
的官方文档或 GitHub Issues,查看是否有类似问题报告。 - 如果问题普遍存在,可以尝试降级
uni-app
版本。
4. 代码实现问题
- 升级后,
uni-easyinput
的事件绑定方式可能发生了变化,导致事件无法触发。 - 例如,事件名称或事件参数可能发生了变化。
解决方法:
- 检查事件绑定的代码,确保事件名称和参数正确。
- 使用
console.log
或调试工具,确认事件是否被触发。
5. 临时解决方案
如果问题无法快速解决,可以尝试以下临时方案:
- 使用原生
input
组件,手动实现uni-easyinput
的功能。 - 通过
v-model
绑定数据,监听@input
事件实现输入处理。
示例代码:
<template>
<input
type="text"
:value="inputValue"
@input="handleInput"
@blur="handleBlur"
/>
</template>
<script>
export default {
data() {
return {
inputValue: '',
};
},
methods: {
handleInput(event) {
this.inputValue = event.detail.value;
},
handleBlur() {
console.log('Input blur');
},
},
};
</script>