修改Uniapp input 组件不刷新视图问题

uni-app 的 <input> 是原生组件,外部修改 value 不会刷新视图,改 key 强制销毁重建

组件:u-input

html 复制代码
<template>
	<view class="input-wrapper">
		<!-- 用 key 强制重新渲染,解决 uni-app input 值不同步的问题 -->
		<input class="uni-input" :key="inputKey" :placeholder="placeholder" :value="value" :type="inputType"
			:password="showPassword" @input="handleInput" v-bind="$attrs" />
		<uni-icons v-if="showClearIcon" type="close" class="uni-icon" :size="iconSize" :color="iconColor"
							 @click="handleClearValue" />
		<uni-icons v-if="isPassWord" class="uni-icon" :size="iconSize" :color="iconColor" @click="changePassword"
							:type="showPassword ? 'eye-filled' : 'eye-slash-filled'"  />
	</view>
</template>

<script>
	export default {
		name: "u-input",
		inheritAttrs: false,
		props: {
			value: {
				type: [String, Number],
				default: "",
			},
			type: {
				type: String,
				default: "text",
			},
			placeholder: {
				type: String,
				default: "请输入",
			},
			iconSize:{
				type:Number,
				default:20
			},
			iconColor:{
				type:String,
				default:"#808080"
			}
		},
		data() {
			return {
				showPassword: false,
				showClearIcon: false,
				inputKey: 0, // 用于强制刷新 input
			};
		},
		computed: {
			isPassWord() {
				return this.type === "password" || this.type === "safe-password";
			},

			inputType(){
				this.showPassword = this.isPassWord
				return this.isPassWord?"":this.type
			}

		},
		watch: {
			// 监听 value 变化,保持清除按钮状态同步
			value: {
				immediate: true,
				handler(val) {
					this.showClearIcon = val && val.length > 0;
				},
			},
		},
		methods: {
			handleInput(event) {
				const val = event.detail.value;
				this.$emit("input", val);
				this.showClearIcon = val.length > 0;
			},

			handleClearValue() {
				this.$emit("input", "");
				this.showClearIcon = false;
				this.inputKey++;
			},

			changePassword() {
				this.showPassword = !this.showPassword;
			},
		},
	};
</script>

<style scoped lang="scss">
	.input-wrapper {
		display: flex;
		flex-direction: row;
		align-items: center;
		width: 100%;
	}

	.uni-input {
		flex: 1;
		width: 100%;
	}

	.uni-icon{
		margin: 0 $uni-spacing-row-sm;
	}

</style>

|---------------------------------|-----------------------------------|
| inheritAttrs: false | 阻止 $attrs 自动绑定到组件根元素 <view> 上 |
| v-bind="$attrs" 绑定到 <input> | 未在 props 中声明的属性全部透传给原生 input |

使用组件:

html 复制代码
<!-- placeholder、maxlength、disabled 等全部透传 -->
<u-input
  v-model="form.username"
  placeholder="请输入用户名"
  maxlength="20"
  :disabled="isDisabled"
  confirm-type="done"
/>

<u-input
  v-model="form.password"
  type="password"
  placeholder="请输入密码"
  maxlength="32"
/>
相关推荐
逸铭1 小时前
Day 8:Preload 是什么?——在别人的网页里打黑工还要合规
前端·客户端
柒和远方1 小时前
Worker Readiness:为什么 `/health` 不能证明后台任务能跑
前端·后端·架构
吃糖的小孩1 小时前
Web Owner Console 还没写前端,我先给它设计 read model
前端
析数塔1 小时前
2026前端框架深度解析:React Compiler、Angular Zoneless、Vue 3.5重写游戏规则
前端·vue.js·react.js
嘟嘟07171 小时前
Node.js spawn 实现迷你 Cursor 自动化终端|子进程完整解析
前端·后端·面试
程序员Agions1 小时前
ES2026,早该这样了
前端·javascript
ONE_SIX_MIX1 小时前
lightweight-charts-onesixth v2.8.1 → v3.1.1 更新总览
java·前端·python
恋猫de小郭1 小时前
Flutter material/cupertino 解耦最新进展,已经在做新样式了
android·前端·flutter
weedsfly1 小时前
纯函数与副作用——前端开发中最容易被忽视的质量保证
前端·javascript·面试