修改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"
/>
相关推荐
树下水月27 分钟前
Typora破解
linux·服务器·前端
用户5508492902561 小时前
CSS布局实战:从Flex到Grid的完整避坑指南
前端
用户5508492902561 小时前
前端接口请求层怎么封装?一个可落地的请求方案
前端
MetWeave1 小时前
跟着一条 SPECI 走流水线:从电报到界面
前端
Helix2501 小时前
Chrome 开发者工具进阶:长截图、网络调试与性能分析
前端·chrome·chrome devtools·使用技巧·性能分析·开发者工具·长截图
liangshanbo12152 小时前
面试题:Webpack 的 publicPath 有什么作用?
前端·webpack·node.js
mjhcsp2 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
CHEEVEN_QY3 小时前
新能源汽车电池托盘FSW量产的工艺稳定性控制
java·前端·汽车
Alice-YUE3 小时前
前端 × AI:从 Cursor 到 Transformer,一份完整认知路径
前端·人工智能·transformer·ai编程·前端开发·cursor
Code_Solitude3 小时前
C语言:关于二维数组的作业总结
java·c语言·前端