|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
, J4 i$ s+ J: U- V. P- i- <div id="app"># x8 N. s5 F/ \( A4 _$ b* p3 {# S
- <p>input 元素:</p>) h& n2 X3 T( q. S) M$ Y. F1 r
- <input v-model="message" placeholder="编辑我……">! h: u4 z* R) q" O
- <p>消息是: {{ message }}</p>% D8 O. M$ l3 q5 B! W9 K+ {: ^7 V
- ( ^$ ]5 J( N4 k2 T# E' b1 V
- <p>textarea 元素:</p>2 k. `5 R& g' Z3 U0 X
- <p style="white-space: pre">{{ message2 }}</p>
. H: X" d% y+ N* X% h) n - <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
; U4 x3 a, ?/ y - </div>
6 l0 p. S1 B8 v -
# A; [% B' B& j X6 |- Q" V8 p - <script>2 K: o8 m8 F4 S- m/ B: W4 o Q
- new Vue({, }$ u, R, z7 H2 y- |- o) Y3 I8 t) u
- el: '#app',
1 ?) z: Q+ F7 Y/ w - data: {
/ \: n" T% d0 f. N5 X" c7 f- b4 { Z - message: 'Runoob',2 n$ P' j( p0 e5 A* b
- message2: '菜鸟教程\r\nhttp://www.runoob.com'
9 {! x2 e- m* {1 g7 ? - }
. {/ ^0 j* ?1 z) M3 `/ ] [( x - })% z4 O% w8 l$ ?4 A& L L* N
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
" h9 k$ v3 V6 D# M& j3 l- <div id="app">
( f% v$ Z' \& L: W3 n6 Q% T - <p>单个复选框:</p>
4 d. o8 k' j' Q# Q* V5 j& O$ ~ - <input type="checkbox" id="checkbox" v-model="checked">8 Q+ A' E3 o& H! t: C1 s
- <label for="checkbox">{{ checked }}</label> n8 x% E+ x7 @/ A
-
; \2 a* `. c0 O% U# Z. m - <p>多个复选框:</p>
# A- B) e: Q$ x - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">& k( F/ {. |( {6 P
- <label for="runoob">Runoob</label>
7 Z5 j$ Q' _4 X. E0 q! u - <input type="checkbox" id="google" value="Google" v-model="checkedNames">6 R% x0 J9 S2 M. \
- <label for="google">Google</label> V; _% p) D9 d( J% C( B
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">5 q8 R4 s" T" h; b1 o
- <label for="taobao">taobao</label>' ^, n7 Y) H( m5 G ~
- <br>
5 j: d; { F$ Z+ e - <span>选择的值为: {{ checkedNames }}</span>$ }; d$ w& P3 x( h2 b& H
- </div>- M$ o2 ~& {; ^) L9 R# x$ E9 s( I4 j
- 8 @8 j* _# s8 O: i4 Z( O. R5 W
- <script>
% d5 Y8 h+ |1 e# K# ?0 G; l - new Vue({. m( o) G: e( N+ H# x6 [+ P
- el: '#app',' {% Y( r0 [5 }7 K) _ ~6 l* o
- data: {
8 K, _) g6 R& m" \ - checked : false,
^# b4 E* u4 O0 H) n# b' Y# @. n - checkedNames: []) Y0 T8 T( F' \4 j6 C
- }9 g' f' |( R+ j2 e7 Q5 U& z' j
- })$ E6 o& f( `& k
- </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
+ K: p: \: |$ ^0 G- <div id="app">+ F1 C2 h+ b& r* ^
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
) ^* C' L$ ~$ I7 o" R6 @$ L% v - <label for="runoob">Runoob</label>, t, F& D% M' S" l( c
- <br>
+ J& c% w9 @- g6 Y' \1 | - <input type="radio" id="google" value="Google" v-model="picked">
) h8 b7 V& o* E, f: x8 u# E - <label for="google">Google</label>
# t$ n/ C N' K% ~8 K - <br>% [+ {5 T2 d# \- [% d' S7 R" d
- <span>选中值为: {{ picked }}</span># f3 k6 K6 u O+ R- u
- </div>
" p, |6 S7 l' g5 ?/ {6 v - 7 M0 Z* j3 P/ x4 y: l) D
- <script>
* w. Q7 w b; k* y: O; B - new Vue({. D- I) K, Q8 N5 P; W; m
- el: '#app',
- t Y: G& S5 s* m+ L - data: {
/ D, A- b6 ~1 w! `: w; X% b - picked : 'Runoob'
- T. q8 d% C0 g p9 B' @ - }
3 u$ z& d, R% i3 n - })
4 v' k* K- E/ J) ^ - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select& |' f" f& _ r: p+ {) w4 i
- <div id="app">
- }; {3 M% k" \2 |9 J - <select v-model="selected" name="fruit">+ v3 Z" v2 X. [
- <option value="">选择一个网站</option>
: P2 L, S& v1 s, r' A3 m - <option value="www.runoob.com">Runoob</option>
; v# X$ ?9 U( a+ _% b% P - <option value="www.google.com">Google</option>
) {8 b" N' Z: N# r/ \ - </select>
; m6 m. u3 k( A - 6 [# M4 b4 w8 q% K
- <div id="output">
+ L# p2 W& D6 c- g- j3 T - 选择的网站是: {{selected}}5 D3 e5 m+ j+ ?: S$ @
- </div>
" _/ J6 m+ ?. M; o( v1 f - </div>2 {. t3 p% O% B# z0 s* Z
-
0 O" c) L8 F* C& o$ Z# f) ^& n - <script>: v- }0 M$ U$ S* x* B" c
- new Vue({4 g5 ^4 R6 }$ @0 P- ]! T' i6 l: \
- el: '#app',* x: z. e4 e' }( I' C4 e
- data: {6 U; I3 u8 F& O
- selected: '' 3 c6 ^- y2 _% h S/ l4 A
- }
8 c, M/ j5 G, q9 W; b - })
: [7 F7 m, m' W - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
4 h& i8 T9 Y, @) S0 c6 E - <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({1 h! w4 V- h$ u
- el: '#app',% O: i9 ]7 X; S+ `7 P; Q: E
- data: {! m" J, A6 m- ]2 G2 `) _
- checked: false,( j$ h" g% `+ u4 y L1 l
- checkedNames: [],
4 z) v/ {' [. R8 q9 L - checkedArr: ["Runoob", "Taobao", "Google"]
' l7 u1 D+ @2 P5 [7 L6 \3 D+ W - },' F: |0 ^( F: a+ P% m' B
- methods: {6 P) O7 f7 T& y: ^3 G( v3 j& V
- changeAllChecked: function() {
! V* u( c5 [1 ]4 B - if (this.checked) {3 o8 t) h1 V0 E! w/ z$ t
- this.checkedNames = this.checkedArr5 U0 N# i! h" H' ^- x. e- A
- } else {
9 J& C. |" q8 ^% U+ X S$ _ - this.checkedNames = []
# r# ^- U/ v! q. H0 k - }, i) G9 D# o C0 c, f$ n: a
- }
# Z1 J) O, E) {) o - },
+ \* M* f# x8 u2 {' r$ y4 _ - watch: {8 Y, ]1 L X7 Z6 J
- "checkedNames": function() {) M1 w9 V, a: }- `( ]4 N' e/ U o
- if (this.checkedNames.length == this.checkedArr.length) {! h; S: U* g W* j" g
- this.checked = true
/ \- e) l4 ~6 w6 { - } else {, T6 q6 }" m& n' _; d5 V! c
- this.checked = false
; x- P9 @6 T1 M+ V1 D - }
0 g* m- L0 I1 W5 l% C% O( x - }, c" c3 D% K+ v% g$ e
- }
: S- j' ]7 S* h+ z* ~& H - })
复制代码 % R- j' w. Q" w7 h+ \$ l
L+ [& f" S5 {4 E( Q
% k: l: r) g0 ~. ^/ D( ?) T6 k' {. X3 g V! D
( F6 _/ c; d8 g& `. o$ c
0 F' j S0 A- z5 E5 W
& D8 C% \6 w& M7 ?& S
& N% x6 @6 {) j2 M! l |