|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
0 y; U" T5 | M f- <div id="app">
2 G7 n* E: F3 _; S* c% F: O* a, l) Z - <p>input 元素:</p>" N5 T# [* V. j* ]1 f0 d
- <input v-model="message" placeholder="编辑我……">0 b F: @, T5 j2 w) w- U: L X+ @
- <p>消息是: {{ message }}</p>
$ \) I' K* Z% |# _( L3 d - ; s% I; C9 }6 G+ ], K& {
- <p>textarea 元素:</p>8 r* M7 _( b9 Z0 h- E# P9 Y
- <p style="white-space: pre">{{ message2 }}</p>
* l6 r7 A$ L3 }- C* w - <textarea v-model="message2" placeholder="多行文本输入……"></textarea>1 h/ U, ~$ K- M5 F- t
- </div>
E. w/ F1 b- K/ Q - - P$ Y4 G# `: @; o) @
- <script>. _: ]/ I U6 g! u7 Y k
- new Vue({$ X+ h8 F( P* { j( p5 X/ W
- el: '#app'," Z7 L1 p4 |% k4 A
- data: {' y5 g- r* P! D
- message: 'Runoob',
& g& p( E- x5 F& d8 i* K& a4 R4 }5 [1 A - message2: '菜鸟教程\r\nhttp://www.runoob.com'# c2 b$ l# p4 H- K9 `- E8 r/ g
- }* G1 d( }4 w/ q' M) M9 U/ R
- }): ^1 T4 c7 ^" Q7 }) Z" w! C! @& l
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
G8 A# W7 V9 U' ~) [$ N& Z- <div id="app">( P8 W: t5 s+ A4 X: ]5 D) D
- <p>单个复选框:</p>
$ A# W1 \! `6 t' h# Q - <input type="checkbox" id="checkbox" v-model="checked">
- Q" U# C8 _' W! J: c5 W6 X - <label for="checkbox">{{ checked }}</label>
4 u, h5 K' G9 e! H; H7 N! y( _ \ -
3 q8 ] B8 i' n4 o/ f - <p>多个复选框:</p>8 ~! {% q8 `4 l' G/ P- t
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">, f; F- _: K3 p1 }
- <label for="runoob">Runoob</label>
" |! P& S8 W, z0 S% R0 B# o - <input type="checkbox" id="google" value="Google" v-model="checkedNames">$ F" R$ E2 t2 O" h8 `2 d
- <label for="google">Google</label>
1 l; a& Q$ I: e7 N$ ` - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
2 D! E( v& K! D# k6 N, w& a - <label for="taobao">taobao</label>3 D6 e: |; p8 [! L' D
- <br> `3 k9 _# V$ X! \0 w9 d
- <span>选择的值为: {{ checkedNames }}</span>9 ^+ P5 }6 @; M3 d% a# R) c
- </div>' Y' j) B; O _ E
- $ J5 |# z+ O- _- x5 P- z6 D5 H, A
- <script>
& _0 [: y$ c5 E; E7 u9 ?& @8 ?- T0 ~ - new Vue({
U! o% R9 A: V9 p - el: '#app',
% N# I) ?9 P- d# f - data: {
$ C; V& D1 j0 S- u* ] - checked : false,
7 S g# r* z# R- _) ]/ C* | - checkedNames: []
# w: H0 c* a c1 o8 p - }
2 A# J) X( E6 \) g( h8 {' h - })
. K# G8 k- N* y: _ - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
( }9 ~6 j9 c9 d4 l% z7 q& b- <div id="app">6 |3 _- Q4 C& J2 H. g# S) I; b" X6 w/ [. b
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
, @9 ~) m/ z' I8 |7 j2 }& t - <label for="runoob">Runoob</label>
% M$ e$ {4 f0 m) P8 J6 r+ q - <br>5 e1 F4 z. _5 y
- <input type="radio" id="google" value="Google" v-model="picked">
V, l, j6 H+ j8 v - <label for="google">Google</label>9 [+ x7 i' o; C! m3 u5 Z
- <br>2 Q7 W+ @+ b6 `0 V2 K
- <span>选中值为: {{ picked }}</span># K$ V0 ]# O- X+ i' w8 s; q
- </div>
/ Y, S1 {$ n2 r" c3 d - 0 a$ ^5 Q/ ?% s# ^7 n4 ~: t
- <script>' W# R% M: l( e/ H$ H
- new Vue({
# l @* L, e- @0 p* n: x$ { - el: '#app',
2 V/ `! v+ A9 r& n" I4 Y6 @ - data: {1 U7 u3 [: n& l* p1 p2 k4 b
- picked : 'Runoob'
! r4 g* w3 B7 J6 ?# d - }
1 N2 m! h. A) u: q- J - })
+ I- U! o9 b+ ?9 J7 m9 Y - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select1 Y6 v; `2 H4 s' Y! R+ ?
- <div id="app">7 d8 s J% j' N; I- S, A) T
- <select v-model="selected" name="fruit">' s1 U5 q, l" k) ~3 t0 h9 m7 g
- <option value="">选择一个网站</option>0 d' Z. V6 }5 i- s( A
- <option value="www.runoob.com">Runoob</option>
y2 P4 M: p; `+ }- p - <option value="www.google.com">Google</option>! }, ]! H) R% S. z3 E1 G- B
- </select>
) P5 M+ D6 ?! x/ v - . t! Y" y; l% d! @6 O; Z
- <div id="output">( x6 K9 t$ Q+ v4 `2 b) ~
- 选择的网站是: {{selected}}
M0 Q& G" v- K* P; T - </div>
# ]: C& N8 y3 ~$ h - </div>
; ^5 p* ]4 v+ O" Z7 |& j' d" x# U- u - 2 ~6 \- `$ R. d8 H; V% {) x
- <script>: c8 N+ G- ~# A; k
- new Vue({1 n$ R: g( C: G, \4 G
- el: '#app',
- X6 a. A$ E0 j) Z$ w9 n - data: {
; j6 E+ s. T3 T& F/ D9 @4 z" B - selected: ''
1 C5 g9 E6 @" u. K - }
) \6 [8 a( U( t# I5 x2 O( t* t/ M - })) S/ S; P8 K- F* S8 U
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
' H" z4 o3 t4 \( d - <input v-model.lazy="msg" >
复制代码 .number如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值: - <input v-model.number="age" type="number">
复制代码这通常很有用,因为在 type="number" 时 HTML 中输入的值也总是会返回字符串类型。 .trim如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入: - <input v-model.trim="msg">
复制代码全选与取消全选 - new Vue({; N# _( m4 u. J5 k& t7 @' E
- el: '#app',
* i2 a* R/ K+ R8 L# { - data: {! ?0 A9 K) R' q- Z# n
- checked: false,7 A% S! w9 D5 o T! b8 e, r O: D$ u
- checkedNames: [],, j# H; i' @: @# Y! W+ Z8 X
- checkedArr: ["Runoob", "Taobao", "Google"]
, A+ u- q: i* K1 N' R8 \$ Z& A - },
2 ^" n2 X1 Z9 G$ }" L6 u' x - methods: {- A9 K4 G+ Y4 ~$ s0 l5 ]
- changeAllChecked: function() {
+ Q* f2 h% C! ~' b: _% S; l. [; ~ - if (this.checked) {" o w2 B. v+ c
- this.checkedNames = this.checkedArr
" f( o$ \( _: ` @ s) G. r) M" d6 y - } else {
L6 i' A1 E' v% _: T, k; ]. ?5 O# d - this.checkedNames = []
( Q+ F3 I; b6 b2 t/ U% f- ^1 z( e - }! K+ ]1 R# ^+ a' S' i: {
- }
2 D1 o7 H( b) T F& p |9 y - },5 F4 |6 Q( s1 Y
- watch: {
# u9 _& G& `1 ]- {' a# } - "checkedNames": function() {* b/ G% e7 l/ ~4 R7 f. A, h
- if (this.checkedNames.length == this.checkedArr.length) {
7 z8 Q G( x0 y: h - this.checked = true
, f4 ?: U) |$ g6 Z! w" z - } else {9 n/ C8 ~ R' |6 D3 h
- this.checked = false
5 I* M6 H; x5 b5 i - }
! c1 _6 f0 ~6 a) J! ~. N& | - }
% [# }0 u1 t1 I8 f E' n' o+ M4 q - }/ @ O, t" X; y7 G' r/ y& v
- })
复制代码 * W+ Q8 D+ R+ s1 H8 k9 H
! C: m/ y) { Y: m6 b4 C( J8 U
' U) P% E% ^3 v; X$ `* K! a' _3 M0 i ?1 O# J, G/ g- R5 [, X- _$ y
& B! X! i# W, k
5 f! d0 F6 J: v% _- d3 F0 j5 f" y9 I) h) f5 |7 s& {4 y8 J
2 n1 l$ _3 q' o& q% d; D
|