查看“组件 v-model”的源代码
←
组件 v-model
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Vue]] == 关于 == 参考:[https://cn.vuejs.org/guide/components/v-model.html Vue官方文档:《组件 v-model》] 有点绕,做个笔记 == v-model 用于组件 == 首先,需要理解 v-model 的'''等价形式'''。 在组件上: : <syntaxhighlight lang="HTML" highlight=""> <CustomInput v-model="searchText" /> </syntaxhighlight> : 会被展开为: : <syntaxhighlight lang="HTML" highlight=""> <CustomInput :modelValue="searchText" @update:modelValue="newValue => searchText = newValue" /> </syntaxhighlight> <big>👉</big>相当于:将子组件的属性“modelValue”绑定到响应式状态 searchText,并监听事件“update:modelValue”以新值替换 searchText * '''modelValue''':展开时,默认的“prop” ——【也是子组件需要定义的 prop】 ** 如果子组件中指定了其他 prop,则使用时需要'''指明 v-model 使用的 prop''':'''<syntaxhighlight lang="bash" inline><MyComponent v-model:otherProp="searchText" /></syntaxhighlight>''' * '''update:modelValue''':展开时,默认的“触发事件” ——【也是子组件需要定义的 emit】 把这个“展开形式”理解为类源码实现,<span style="color: blue; font-size:120%">'''子组件只需要根据该形式实现即可'''</span>。 <big>💡</big>所以,子组件中需要: # <span style="color: blue">声明“'''属性 modelValue'''”,并将 <code><input></code> 的“'''value 属性'''”绑定到该属性;</span> # <span style="color: blue">声明“'''事件 update:modelValue'''”,并使 <code><input></code> 的“'''input 事件'''”携带“<code><input></code> 的新值”触发该事件。</span> === 子组件的实现(方式一) === 依据“展开形式”实现子组件,如下: : <syntaxhighlight lang="HTML" highlight=""> <script setup> defineProps(['modelValue']) defineEmits(['update:modelValue']) </script> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> </syntaxhighlight> 如上: # 声明“属性 modelValue”和“事件 update:modelValue”; # 将 <code><input></code> 的“value 属性”绑定到“modelValue”; # 监听 <code><input></code> 的“input 事件”,以携带“<code><input></code>的新值”(即,<code>$event.target.value</code>)触发“update:modelValue”。 === 子组件的实现(方式二) === 以“v-model”替换该“展开形式”实现子组件,如下: : <syntaxhighlight lang="HTML" highlight=""> <script setup> import { computed } from 'vue' const props = defineProps(['modelValue']) const emit = defineEmits(['update:modelValue']) const value = computed({ get() { return props.modelValue }, set(value) { emit('update:modelValue', value) } }) </script> <template> <input v-model="value" /> </template> </syntaxhighlight> 如上: # 声明“属性 modelValue”和“事件 update:modelValue” # 提供'''计算属性'''“value”: ## 其 getter 用于:获取“modelValue”; ## 其 setter 用于:用 value 触发“update:modelValue” # 将<code><input></code>双向绑定到“value”。 == 多个 v-model 用于组件 == 对于“存在多个 <code><input></code> 的子组件”,需要使用多个 v-model,且需指明 v-model 分别作用与“子组件哪个属性”。 【原理同上一节】 对于: : <syntaxhighlight lang="HTML" highlight=""> <UserName v-model:first-name="first" v-model:last-name="last" /> </syntaxhighlight> 子组件的实现如下。 === 子组件的实现(方式一) === : <syntaxhighlight lang="HTML" highlight=""> <script setup> defineProps({ firstName: String, lastName: String }) defineEmits(['update:firstName', 'update:lastName']) </script> <template> <input type="text" :value="firstName" @input="$emit('update:firstName', $event.target.value)" /> <input type="text" :value="lastName" @input="$emit('update:lastName', $event.target.value)" /> </template> </syntaxhighlight> === 子组件的实现(方式二) === : <syntaxhighlight lang="HTML" highlight=""> <script setup> import { computed } from 'vue' const props = defineProps({ firstName: String, lastName: String }) const emit = defineEmits(['update:firstName', 'update:lastName']) const computedFirstName = computed({ get() { return props.firstName }, set(computedFirstName) { emit('update:firstName', computedFirstName) } }) const computedLastName = computed({ get() { return props.lastName }, set(computedLastName) { emit('update:lastName', computedLastName) } }) </script> <template> <input type="text" v-model="computedFirstName"/> <input type="text" v-model="computedLastName"/> </template> </syntaxhighlight> == '''自定义 v-model 修饰符''' == v-model 有一些内置的修饰符,例如 <code>.trim</code>,<code>.number</code> 和 <code>.lazy</code>。 但某些时候,需要 v-model 支持自定义的修饰符。 v-model 自定义修饰符: # “自定义修饰符”可以通过在 <code>defineProps</code> 中定义 prop 来捕获。 #* 对于默认 prop“modelValue”,定义“修饰符 prop”为“modelModifiers” #* 对于其他 prop,定义“修饰符 prop”为“prop名称 + Modifiers” —— 如:title 的“修饰符 prop”为 titleModifiers # “自定义修饰符”的效果,可以套在 <code><input></code> 的事件处理外完成。 === 示例一:'''无参数的 v-model 修饰符''' === 对于以下代码,通过 capitalize 修饰符使输入内容的首字母大写: : <syntaxhighlight lang="HTML" highlight=""> <MyComponent v-model.capitalize="myText" /> </syntaxhighlight> 对应子组件的实现为: : <syntaxhighlight lang="HTML" highlight=""> <script setup> const props = defineProps({ modelValue: String, modelModifiers: { default: () => ({}) } }) const emit = defineEmits(['update:modelValue']) function emitValue(e) { let value = e.target.value if (props.modelModifiers.capitalize) { value = value.charAt(0).toUpperCase() + value.slice(1) } emit('update:modelValue', value) } </script> <template> <input type="text" :value="modelValue" @input="emitValue" /> </template> </syntaxhighlight> === 示例二:'''有参数的 v-model 修饰符''' === 对于以下代码,通过 capitalize 修饰符使输入内容的首字母大写: : <syntaxhighlight lang="HTML" highlight=""> <MyComponent v-model:title.capitalize="myText" /> </syntaxhighlight> 对应子组件的实现为: : <syntaxhighlight lang="HTML" highlight=""> <script setup> const props = defineProps({ title: String, titleModifiers: { default: () => ({}) } }) const emit = defineEmits(['update:title']) function emitValue(e) { let value = e.target.value if (props.titleModifiers.capitalize) { value = value.charAt(0).toUpperCase() + value.slice(1) } emit('update:title', value) } </script> <template> <input type="text" :value="title" @input="emitValue" /> </template> </syntaxhighlight> == 附 == 在“原生元素”上: : <syntaxhighlight lang="HTML" highlight=""> <input v-model="searchText" /> </syntaxhighlight> 会被展开为: : <syntaxhighlight lang="HTML" highlight=""> <input :value="searchText" @input="searchText = $event.target.value" /> </syntaxhighlight>
返回至“
组件 v-model
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息