p***@163.com
p***@163.com
  • 发布:2023-05-24 11:28
  • 更新:2023-07-14 17:49
  • 阅读:431

【报Bug】input组件在循环渲染的时候input事件异常错误

分类:uni-app

产品分类: uniapp/小程序/微信

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 21H2

HBuilderX类型: 正式

HBuilderX版本号: 3.7.11

第三方开发者工具版本号: 1.06.2303220

基础库版本号: 2.32.0

项目创建方式: HBuilderX

示例代码:

使用官方demo
···
<template>
<view class="nvue-page-root">
<view class="page-title">
<view class="page-titlewrapper">
<text class="page-title
text">{{ title }}</text>
</view>
</view>
<view class="uni-common-mt">
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">可自动聚焦的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" focus placeholder="自动获得焦点" /></view>
</view>
<!-- #ifdef APP-PLUS -->
<view v-if="platform === 'ios' && !isNvue" class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">隐藏 iOS 软键盘上的导航条</text></view>
<view class="uni-input-wrapper"><input class="uni-input" placeholder="触摸其他地方收起键盘" @focus="onFocus" @blur="onBlur" /></view>
</view>
<!-- #endif -->
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">键盘右下角按钮显示为搜索</text></view>
<view class="uni-input-wrapper"><input class="uni-input" confirm-type="search" placeholder="键盘右下角按钮显示为搜索" /></view>
</view>
<!-- #ifndef H5 -->
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">键盘右下角按钮显示为发送</text></view>
<view class="uni-input-wrapper"><input class="uni-input" confirm-type="send" placeholder="键盘右下角按钮显示为发送" /></view>
</view>
<!-- #endif -->
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">控制最大输入长度的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" maxlength="10" placeholder="最大输入长度为10" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title">
<text class="uni-form-item
title">实时获取输入值:{{ inputValue }}</text>
</view>
<view class="uni-input-wrapper"><input class="uni-input" @input="onKeyInput" placeholder="输入同步到view中" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">控制输入的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" @input="replaceInput" v-model="changeValue" placeholder="连续的两个1会变成2" /></view>
</view>
<!-- #ifndef MP-BAIDU -->
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">控制键盘的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" ref="input1" @input="hideKeyboard" placeholder="输入123自动收起键盘" /></view>
</view>
<!-- #endif -->
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">数字输入的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" type="number" placeholder="这是一个数字输入框" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">密码输入的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" password type="text" placeholder="这是一个密码输入框" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">带小数点的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" type="digit" placeholder="带小数点的数字键盘" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">身份证输入的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" type="idcard" placeholder="身份证输入键盘" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-itemtitle">控制占位符颜色的 input</text></view>
<view class="uni-input-wrapper"><input class="uni-input" placeholder-style="color:#F76260" placeholder="占位符字体是红色的" /></view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item
title">带清除按钮的输入框</text></view>
<view class="uni-input-wrapper">
<input class="uni-input" placeholder="带清除按钮的输入框" :value="inputClearValue" @input="clearInput" />
<text class="uni-icon" v-if="showClearIcon" @click="clearIcon"></text>
</view>
</view>
<view class="uni-form-item uni-column">
<view class="title"><text class="uni-form-item__title">可查看密码的输入框</text></view>
<view class="uni-input-wrapper">
<input class="uni-input" placeholder="请输入密码" :password="showPassword" />
<text class="uni-icon" :class="[!showPassword ? 'uni-eye-active' : '']" @click="changePassword"></text>
</view>
</view>
<view v-for="(item, index) in stocks" :key="index">
<view>编号{{ item.id }}</view>
<input v-model="item.id" @input="multiInput($event, item)" />
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'input',
focus: false,
inputValue: '',
showClearIcon: false,
inputClearValue: '',
changeValue: '',
showPassword: true,
src: '../../../static/eye-1.png',
platform: '',
isNvue: false,
stocks: [{ id: '1' }, { id: '2' }] //测试循环渲染input
}
},
methods: {
// 循环渲染的input事件
multiInput: function(event, item) {
console.log('===event====', event)
console.log('----item----', item)
},
onKeyInput: function(event) {
this.inputValue = event.detail.value
},
replaceInput: function(event) {
var value = event.detail.value
if (value === '11') {
this.changeValue = '2'
}
},
hideKeyboard: function(event) {
if (event.detail.value === '123') {
uni.hideKeyboard()
}
},
clearInput: function(event) {
this.inputClearValue = event.detail.value
if (event.detail.value.length > 0) {
this.showClearIcon = true
} else {
this.showClearIcon = false
}
},
clearIcon: function() {
this.inputClearValue = ''
this.showClearIcon = false
},
changePassword: function() {
this.showPassword = !this.showPassword
},
onFocus() {
this.$mp.page.$getAppWebview().setStyle({
softinputNavBar: 'none'
})
},
onBlur() {
this.$mp.page.$getAppWebview().setStyle({
softinputNavBar: 'auto'
})
}
},
onLoad() {
this.platform = uni.getSystemInfoSync().platform
// #ifdef APP-PLUS-NVUE
this.isNvue = true
// #endif
}
}
</script>

<style scoped>
.nvue-page-root {
background-color: #f8f8f8;
padding-bottom: 20px;
}

.page-title {
/ #ifndef APP-NVUE /
display: flex;
/ #endif /
flex-direction: row;
justify-content: center;
align-items: center;
padding: 35rpx;
}

.page-title__wrapper {
padding: 0px 20px;
border-bottom-color: #d8d8d8;
border-bottom-width: 1px;
}

.page-title__text {
font-size: 16px;
height: 48px;
line-height: 48px;
color: #bebebe;
}

.title {
padding: 5px 13px;
}

.uni-form-item__title {
font-size: 16px;
line-height: 24px;
}

.uni-input-wrapper {
/ #ifndef APP-NVUE /
display: flex;
/ #endif /
padding: 8px 13px;
flex-direction: row;
flex-wrap: nowrap;
background-color: #ffffff;
}

.uni-input {
height: 28px;
line-height: 28px;
font-size: 15px;
padding: 0px;
flex: 1;
background-color: #ffffff;
}

.uni-icon {
font-family: uniicons;
font-size: 24px;
font-weight: normal;
font-style: normal;
width: 24px;
height: 24px;
line-height: 24px;
color: #999999;
}

.uni-eye-active {
color: #007aff;
}
</style>

···

操作步骤:

在官方demo的input.nvue中增加 一个数组变量,一个input事件方法,一个v-for渲染的模板,运行到微信小程序

预期结果:

在微信小程序里,input框里输入任意字母或数字,正常响应input事件方法

实际结果:

在微信小程序里,input框里输入任意字母或数字,input事件方法有响应,但是控制台报警告和异常
[Vue warn]: Unhandled error during execution of native event handler
vendor.js? [sm]:3098 TypeError: fn is not a function

bug描述:

使用<input>组件的@input事件。在单独定义input组件的时候好用,但是放到 v-for里循环定义就会出现 TypeError: fn is not a function错误

2023-05-24 11:28 负责人:无 分享
已邀请:
Diligent_UI

Diligent_UI - 【插件开发】【专治疑难杂症】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=193663(微信搜索飘逸科技UI小程序直接体验)】【骗子请绕道】问题咨询请加QQ群:120594820,代表作灵感实用工具小程序

你的问题我来守护,灵魂发问,有v-model,为什么还需要input事件?

  • p***@163.com (作者)

    确实去掉v-model就不报错了,世界一下子清静了。

    来自灵魂深处的疑问:

    单独使用input组件时,v-model和inpu事件同时使用,也不报错。循环使用就不能同时用v-model和input。敢问,道理何在呀?

    2023-05-26 09:33

  • Diligent_UI

    回复 p***@163.com: v-model就行了

    2023-05-26 09:37

  • p***@163.com (作者)

    回复 Diligent_UI: 感谢大佬,我是要在input里控制用户输入的最大值。因为组件上没有max-value的属性可用,嘿嘿。

    // 循环渲染的input事件

    multiInput: function(event, item) {

    if (event.target.value > 100) {

    item.stock = 100

    return 100

    } else {

    item.stock = event.target.value

    return event.target.value

    }

    },

    2023-05-26 09:48

  • Diligent_UI

    回复 p***@163.com: 6啊,可以加Q群,可以交流交流

    2023-05-26 09:50

  • 3***@qq.com

    回复 p***@163.com: 我也是差不多的业务,原本也是靠@input来限制输入值的大小,但是就是因为这个报错,所以我都换成@blur来搞了,我感觉的话,效果也差不多吧

    2024-10-19 14:28

p***@163.com

p***@163.com (作者)

灵魂发问,就木有人管吗

5***@qq.com

5***@qq.com

请问解决了嘛,俺这里也遇到了同样的问题

要回复问题请先登录注册