【tips】el-input-number 数字输入框初始值超出限制值后,v-model的问题
el-input-number 当v-model绑定的值超过max时,内部机制会更改v-model的值。
案例:
当前页面展示
<el-input-number v-model="localTop" :min="0" :max="maxY" size="small" controls-position="right"@change="handleTopChange" :class="{ 'warning-input': isTopOverflow }" /><div>建议: 0-{{ maxY }}</div>
localTop的唯一赋值逻辑
// 监听props变化,同步本地数据
watch([() => props.item.style, () => props.maxWidth, () => props.maxHeight], ([curStyle, newMaxWidth, newMaxHeight]) => {// 更新本地数据const { width, height, top, left } = curStyle;localWidth.value = width;localHeight.value = height;localTop.value = top;localLeft.value = left;}, { immediate: true, deep: true });
按照逻辑来看,页面localTop === item.style.top,但是设置了maxY,输入框此时展示的是maxY的值,导致内部重新给localTop 赋值。。。。
<span >当前Y位置:{{ localTop }},{{ item.style.top }}</span>
但是
通过监听和nextTick
watch(() => props.item.style,(newStyle) => {const { width, height, top, left } = newStyle;console.log('原始值:', { top }); // 应该是 377localTop.value = top;console.log('赋值后 localTop:', localTop.value); // 可能立即变成 330// 延迟检查,看 InputNumber 是否修改了值nextTick(() => {if (localTop.value !== top) {console.warn(`nextTick警告: 传入的 top 值 ${top} 被组件修改为 ${localTop.value}。请检查组件逻辑。`);}});},{ immediate: true }
);
如果input要显示当前的值,又要设置max的话,干脆把控制max的逻辑放在change事件里