在 Vue 和 Element UI 的上下文中,这个问题需要根据具体场景来分析:
核心区别
v-model:双向数据绑定,包含 :value 和 @input 的语法糖
:value:单向数据流,只负责显示
对于 readonly 的输入框,推荐使用 :value,原因如下:
<!-- 推荐 -->
<el-input
:value="formattedTime"
placeholder="请输入是否删除"
readonly
/>
<!-- 不推荐 -->
<el-input
v-model="form.updateTime"
placeholder="请输入是否删除"
readonly
/>
为什么 :value 更合理:
-
语义更明确:只读输入框不需要双向绑定
-
性能更好:避免了不必要的响应式更新
-
逻辑更清晰:明确表示这是"显示"而非"输入"
-
避免意外修改:即使设置了 readonly,使用 v-model 仍然可能在某些情况下产生不必要的更新
不同场景下的选择
场景一:纯展示(推荐 :value)
<template>
<!-- 格式化时间显示 -->
<el-input
:value="formatDate(form.updateTime)"
readonly
/>
<!-- 计算属性显示 -->
<el-input
:value="displayName"
readonly
/>
</template>
场景二:需要输入(使用 v-model)
<template>
<!-- 可编辑的输入框 -->
<el-input
v-model="form.userName"
placeholder="请输入用户名"
/>
<!-- 表单中的输入项 -->
<el-input
v-model="form.email"
placeholder="请输入邮箱"
/>
</template>
场景三:需要自定义逻辑(使用 :value + @input)
<template>
<el-input
:value="inputValue"
@input="handleInput"
placeholder="自定义处理输入"
/>
</template>
<script>
export default {
methods: {
handleInput(value) {
// 自定义验证或处理逻辑
this.inputValue = value.toUpperCase()
}
}
}
</script>
最佳实践总结
-
只读/展示数据 → 使用 :value
-
可编辑输入 → 使用 v-model
-
需要自定义处理 → 使用 :value + @input
-
表单中的计算字段 → 使用 :value + 计算属性
在你的时间显示场景中,使用 :value="formattedTime" 是最合理的选择,因为它明确表达了这是一个只用于展示的字段。