惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
博客园 - 叶小钗
S
SegmentFault 最新的问题
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
L
Lohrmann on Cybersecurity
量子位
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
J
Java Code Geeks
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 三生石上(FineUI控件)
Attack and Defense Labs
Attack and Defense Labs
AI
AI
The Cloudflare Blog
T
Tailwind CSS Blog
S
Schneier on Security
爱范儿
爱范儿
PCI Perspectives
PCI Perspectives
Stack Overflow Blog
Stack Overflow Blog
S
Secure Thoughts
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
V2EX - 技术
V2EX - 技术
S
Securelist
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
K
Kaspersky official blog
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - zhouyu

shardingsphere实现按月分表 Vue3手册译稿 - 深入组件 - 插槽 vscode Vue3 多根节点语法检验错误fix Vue3手册译稿 - 深入组件 - 自定义事件 Vue3手册译稿 - 深入组件 - 非prop属性 Vue3手册译稿 - 深入组件 - pros Vue3手册译稿 - 深入组件 - 组件注册 Vue3手册译稿 - 基础 - 组件基础 Vue3手册译稿 - 基础 - 事件处理 Vue3手册译稿 - 基础 - 列表渲染 Vue3手册译稿 - 基础 - 条件渲染 Vue3手册译稿 - 基础 - Class和Style绑定 Vue3手册译稿 - 基础 - 计算属性及监听器 Vue3手册译稿 - 基础 - Data属性及方法 Vue3手册译稿 - 基础 - 模板语法 Vue3手册译稿 - 基础 - 应用&组件实例 Vue3手册译稿 - 基础 - 介绍 Vue3手册译稿 - 基础 - 安装 元旦三天假期,实现一个电商退单管理系统【四】-手机客户端实现
Vue3手册译稿 - 基础 - 表单输入绑定
zhouyu · 2021-03-08 · via 博客园 - zhouyu

基础用法

你可以通过v-model指令创建与文本框、多行文本框以及选择框等表单输入组件的双向绑定,它会自动根据输入组件不同使用正确的绑定方式。虽然有点神奇的,但v-model本质上是用户输入控件更新数据的语法糖,对一些边界情况进行处理。

[warning]提示
v-model会忽略表单单控件初始化的value,checked,selected属性。它总会将当前活动实例数据当成数据源。你应该在组件的javascript代码的data选项中定义这些初始值。

v-model内部针对不同的控件使用不同的属性和不同的事件调用方法:

  • texttextarea使用value属性,事件用input
  • checkbox,radiobutton使用checked属性,事件用change
  • select使用props传递value,事件用change

[notice]多国语言(中文、日文、韩文)等,在你可能注意到在输入过程中v-model是不更新数据的。如果你想跟踪这种更新,使用input事件监听绑定value来代替v-model。(个人感觉没有场景需要这种监听吧!)

文本框(text)

<input v-model="message" placeholder="请输入内容" />
<p>你输入的内容是: {{ message }}</p>

多行文本框(textarea)

<span>多行文本框输入的内容是:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br />
<textarea v-model="message" placeholder="输入多行内容"></textarea>

textarea中间插入文字不会工作,应该使用v-model代替

<!-- 错误 -->
<textarea>{{ text }}</textarea>

<!-- 正确 -->
<textarea v-model="text"></textarea>

复选框(checkbox)

<input type="checkbox" id="checkbox" v-model="checked" />
<label for="checkbox">{{ checked }}</label>

多个checkbox绑定到一个数组上:

<div id="v-model-multiple-checkboxes">
  <input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
  <label for="jack">Jack</label>
  <input type="checkbox" id="john" value="John" v-model="checkedNames" />
  <label for="john">John</label>
  <input type="checkbox" id="mike" value="Mike" v-model="checkedNames" />
  <label for="mike">Mike</label>
  <br />
  <span>Checked names: {{ checkedNames }}</span>
</div>
Vue.createApp({
  data() {
    return {
      checkedNames: []
    }
  }
}).mount('#v-model-multiple-checkboxes')

单选框(radio)

<div id="v-model-radiobutton">
  <input type="radio" id="one" value="One" v-model="picked" />
  <label for="one">One</label>
  <br />
  <input type="radio" id="two" value="Two" v-model="picked" />
  <label for="two">Two</label>
  <br />
  <span>Picked: {{ picked }}</span>
</div>
Vue.createApp({
  data() {
    return {
      picked: ''
    }
  }
}).mount('#v-model-radiobutton')

选择框(select)

单选选择框:

<div id="v-model-select" class="demo">
  <select v-model="selected">
    <option disabled value="">Please select one</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
Vue.createApp({
  data() {
    return {
      selected: ''
    }
  }
}).mount('#v-model-select')

[info]如果v-model与数组任何一项都没有匹配成功,<select>标签会渲染成unselected状态。IOS环境下会导致默认第一个选项是空的,因为这种情况下IOS不支持改变事件。因此推荐初始一个不可选择的空值选项。
多选选择框(绑定到数组上):

<select v-model="selected" multiple>
  <option>A</option>
  <option>B</option>
  <option>C</option>
</select>
<br />
<span>Selected: {{ selected }}</span>
Vue.createApp({
  data() {
    return {
      selected: ''
    }
  }
}).mount('#v-model-select')

使用v-for动态渲染选项:

<div id="v-model-select-dynamic" class="demo">
  <select v-model="selected">
    <option v-for="option in options" :value="option.value">
      {{ option.text }}
    </option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
Vue.createApp({
  data() {
    return {
      selected: 'A',
      options: [
        { text: 'One', value: 'A' },
        { text: 'Two', value: 'B' },
        { text: 'Three', value: 'C' }
      ]
    }
  }
}).mount('#v-model-select-dynamic')

绑定值

对于radio,checkbox,select选项,v-model绑定值默认为字符串(或checkbox使用布尔值):

<!-- `picked` 值是一个字符串,当选择后赋值`a` -->
<input type="radio" v-model="picked" value="a" />

<!-- `toggle` 的值是真或假-->
<input type="checkbox" v-model="toggle" />

<!-- `selected` 首项选中后赋值`abc` -->
<select v-model="selected">
  <option value="abc">ABC</option>
</select>

有时候我们希望为当前实例控件绑定动态的值,我们可以通过v-bind实现。另外使用v-bind允许我们绑定一个非字符串的值。

checkbox

<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
// checked:
vm.toggle === 'yes'
// unchecked:
vm.toggle === 'no'

[info]true-value,false-value并不影响控件的输入value属性,因为浏览器并不会把未选中的选项在表单中提交。如果想确保两个值只会提交一个(yes 或 no),应该使用radio控件。

radio

<input type="radio" v-model="pick" v-bind:value="a" />
// when checked:
vm.pick === vm.a

select 选项

<select v-model="selected">
  <!-- 内联对象 -->
  <option :value="{ number: 123 }">123</option>
</select>
// selected:
typeof vm.selected // => 'object'
vm.selected.number // => 123

修饰符

.layz

默认v-model同步输入框内容变化同步更改数据(中日韩等输入法除外)。你可以添加.lazy修饰符替代同步更新为change事件之后。

<!-- 在 "change" 更新而非 "input" -->
<input v-model.lazy="msg" />

.number

如果你想将用户输入自动转换为数值型,在v-model添加添加.number修饰符管理用户输入:

<input v-model.number="age" type="number" />

有时这很有用,因为即使为文本框添加了type="number",仍然可能返回一个字符串。如果输入值可以转换为parseFloat(),将原值返回。

.trim

自动删除前后空格。

<input v-model.trim="msg" />

组件使用v-model

[info]如果对组件不熟悉,请先跳过。

HTML自带的组件经常满足不了实际需求,幸运的是Vue可以在可复用的自定文本框上使用v-model并拥有完整的自定义行为。查阅组件手册中自定义输入组件学习更多!