这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: 6 E% o! Q1 M" ~0 ]6 U
- <div id="app">
Y+ [8 e) T3 `, }. B - <p>input 元素:</p>
- S2 |6 \9 l# | - <input v-model="message" placeholder="编辑我……">
9 S) v5 t7 |4 k& u/ @ T- j' a7 r - <p>消息是: {{ message }}</p>! b1 u# t- f; D: b
-
) O2 q- J6 f( u! f/ v$ v - <p>textarea 元素:</p>
% M% C7 I ]8 D' }$ f6 f - <p style="white-space: pre">{{ message2 }}</p>
$ |$ A" d( ^% }( Q/ r - <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
5 f% T$ O. s: O4 D5 `" o - </div>$ [9 J8 `- T0 y4 v& A$ o2 M
-
3 C- }: J0 e0 s: T0 w - <script>
' |; c* e! e W9 a4 ^ - new Vue({9 q' r+ k( W6 Y9 R2 e `
- el: '#app',, t G1 s* w; `4 [5 ]7 n
- data: {6 {! K4 u' v1 Q0 C5 O# e2 q
- message: 'Runoob',9 i5 s1 r q/ z
- message2: '菜鸟教程\r\nhttp://www.runoob.com'
2 I4 z, N. n8 `: @; l, a8 ^3 m - }
$ ?( e' N- ^% z; c: {* ~ - })5 T+ Q( ~5 O- U% u
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定: ' ?2 Q$ n4 {! ?, n$ v; V
- <div id="app">
0 V4 Y0 y! ~+ B; L4 ?7 m5 V - <p>单个复选框:</p>' U) q5 N4 `) [1 w3 _8 w0 ?3 f/ S
- <input type="checkbox" id="checkbox" v-model="checked">
6 W" G% x4 l% }. A4 Q# [ - <label for="checkbox">{{ checked }}</label>
2 W7 D9 a) [: R$ r- N% b# { - - T) Q/ N3 n5 ~8 {
- <p>多个复选框:</p>' b% V1 |; K! S5 C
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
; {6 f% H9 ]! C - <label for="runoob">Runoob</label>
% \9 u3 T2 v! D K& h - <input type="checkbox" id="google" value="Google" v-model="checkedNames"> c1 b) l/ ^0 u" a# t
- <label for="google">Google</label># Y) g) p6 g9 r" A; U
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
( M1 x$ H) t n: q h - <label for="taobao">taobao</label>
2 @- z) w9 w7 P9 M - <br>0 Z! U8 d4 o5 U( w9 X" T
- <span>选择的值为: {{ checkedNames }}</span>) ?' \, F2 X4 h( q8 c
- </div>2 A. B8 \% H5 F) i. m I
- # B" S: ~* g7 H1 p6 f
- <script>
, l- h: W0 A# t- c - new Vue({, y4 y. V5 S: j/ T9 M+ `1 y2 n: f
- el: '#app',
9 {% V5 p2 X! p: e - data: {
, n/ Y% \4 p5 R+ z - checked : false,7 \8 K9 q1 X5 O& R6 f$ ?' O: C2 c
- checkedNames: []
9 U! O0 N; l7 @. \ - }+ Z2 z9 T- `$ B& D) G' Z
- })
/ G9 V. a E; }$ r - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
+ K1 V3 n0 q! [. m( \- <div id="app">' P& @9 Y% ~0 n N& {
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
& w$ S* f/ p% { {2 y - <label for="runoob">Runoob</label>& @2 Y9 D5 ]9 @
- <br>
, Q8 S2 T8 H9 R* _ - <input type="radio" id="google" value="Google" v-model="picked">
% }3 e: V2 }7 m - <label for="google">Google</label>
' T/ ]3 s6 i/ U+ T! X) M j8 R4 k - <br>
* {9 x0 T% ?( W - <span>选中值为: {{ picked }}</span>0 V" v( G* g! V) J; Y: q3 k
- </div>
7 [' K( ^7 `) K# \, U* g - ' S# l5 s+ L' u) \
- <script>
. d, p* |3 x9 z( _% K3 B - new Vue({
" F0 u! c" p& E2 p) E* H6 [. E - el: '#app',* H5 W* F: y" E2 A
- data: {
5 f, K, y3 z9 T6 R4 h5 T - picked : 'Runoob'. K# T" m1 y. W z( G8 I- G
- }" m; B% A0 W5 W: y
- })9 C" t4 F; Q6 G. f$ n
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
! i+ i. b8 K; l y- <div id="app">) `! R( |- z$ _( f7 @! ]
- <select v-model="selected" name="fruit">5 G8 Z+ f) }$ J3 [7 K& f
- <option value="">选择一个网站</option>
1 b6 @8 ]; e, k5 w: d; }+ p- C; w - <option value="www.runoob.com">Runoob</option>5 m' a, ]2 A6 ]. A( v1 H: ^8 F
- <option value="www.google.com">Google</option>
( j1 J# J" d% ^ - </select>
- \; w& n( s' x% K% ?: T -
/ Y5 K# m; w3 j/ G9 l - <div id="output">
: P) Q# T5 ]( U. a* T - 选择的网站是: {{selected}}
: w4 M" V+ [& i. s* ? - </div># d- a" y, Q- w9 i- r5 z, c
- </div>
8 I" k z( `9 P& f - / U, ^; ?3 O2 Z( [: e! z, r, q3 {
- <script>& c! y6 F9 L: j- T4 O# `1 o
- new Vue({
4 W0 {. ?8 j6 V - el: '#app',
, `. e X. f) l$ e& w0 j - data: {
6 P ^) ?6 i2 O/ \7 H5 k - selected: ''
) @7 F1 R! G! Y$ o2 D$ |- z& c- s - }& y. K5 B' `7 R2 P& b% d& P- I
- })
% P2 W/ A: K% D% C3 q - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
, [. A+ m3 W. J, }5 g( l" i - <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({
! G S, T0 t7 b - el: '#app',
. Q- A: t3 G+ u - data: {
- A; s5 a# n, ^ - checked: false,
+ ]: U0 s. c7 ?+ n& |/ R - checkedNames: [],
) y, l6 ~+ N. q5 W+ K - checkedArr: ["Runoob", "Taobao", "Google"]8 ~3 A* u- ~' @! W& p% u7 H. i0 T
- },6 w* ]( h: Y" Z6 V% ?1 s
- methods: {( w2 X, Y8 Y' P. e
- changeAllChecked: function() {: I6 p7 X& Y1 w+ L
- if (this.checked) {
2 A3 H" N3 y4 @; H7 P _ - this.checkedNames = this.checkedArr
4 r1 k5 l5 y' W8 @& b# m" [ - } else {
0 x/ y3 d4 D; R4 g5 Y - this.checkedNames = []
9 C2 h T+ y0 a Z - }
) A0 q- u0 A3 L - }
$ M8 E3 G H- y' j* @ - },/ ^" }0 O7 {$ b' b: K$ \
- watch: {& x* r: Z9 p7 {
- "checkedNames": function() {
; ?! N, D' z/ P ]5 Y; O: u - if (this.checkedNames.length == this.checkedArr.length) {
( V) T( e; h$ x+ y" i - this.checked = true$ F/ V1 _" x' q" o* i# K4 Q: ^ d
- } else {! J; { A6 ^# T2 ?
- this.checked = false3 J+ u7 m* {. R4 t* P0 t' o3 D
- }! j8 Z9 T$ G8 f( z& \. |2 [4 |
- }0 k" z2 i) G( T! ]
- }
$ O& C+ R& e" o) z3 a - })
复制代码
' h# o6 U. ?- ?$ ?8 t
/ O: N* j: P) Q
3 F/ B3 n% x4 L4 _' j" g/ j/ y1 G9 r% g8 K; f' Y2 r+ K- m
5 s4 _$ @3 A& w! }" a! ^
1 Y2 u, y8 r% X2 Z# V9 x' ^
Z3 s* u8 |, k
; }* Q' F/ G% z% p3 G |