|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
% f5 U7 s O2 u# `/ w" }- <div id="app">7 y* v0 V, y Y
- <p>input 元素:</p>
4 W5 T- H, c0 x! M - <input v-model="message" placeholder="编辑我……">
9 x# s- z! z4 [, ]8 ~7 P0 Y - <p>消息是: {{ message }}</p>
f$ s0 w. m' ?1 L - / K$ L3 E+ U2 X, Y4 ?; X# \/ S; V
- <p>textarea 元素:</p>
* M$ F" V1 I/ M9 {4 ~4 a t - <p style="white-space: pre">{{ message2 }}</p>
, f2 V' p. u2 F; Y% D* e( B7 T - <textarea v-model="message2" placeholder="多行文本输入……"></textarea>3 i! T, [& ]2 r0 F/ Y5 k
- </div>
8 i; m: o9 m4 l# L7 k4 ~ - 8 r1 G! t5 g1 n- e1 c
- <script>
% o. S6 {5 a% A* N - new Vue({
* y5 ?# ]0 c/ B' J9 `# `0 v2 f- O - el: '#app', s5 L. u- }, ^) }& n4 N
- data: {1 Z8 @- I6 b' K
- message: 'Runoob',* v1 X2 v+ C& t& n
- message2: '菜鸟教程\r\nhttp://www.runoob.com'/ [& b4 ^/ g3 m6 R* z: f
- }
, J9 D$ [3 a" r( v - })
( U3 J. x* W# X, D& `% F - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
) _& W% a( P: s7 T- <div id="app">
# t4 Y7 `# c) t# p - <p>单个复选框:</p>
' T$ u2 R! t1 X; F8 [' b, @ - <input type="checkbox" id="checkbox" v-model="checked"># F/ t3 }6 ]' T0 `1 w
- <label for="checkbox">{{ checked }}</label>
* Y# A1 N2 E6 s& a -
+ Y# d6 S6 ^" r! w - <p>多个复选框:</p>% l8 c. e& U P7 j3 M
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">/ ^$ B5 S' B6 ^6 E0 u) ]& Y0 d: |3 Q
- <label for="runoob">Runoob</label>
. n9 ?2 E( z o( w7 |' u - <input type="checkbox" id="google" value="Google" v-model="checkedNames">( R/ v: ~' Z* @9 o' L
- <label for="google">Google</label>9 E7 s& T2 j, Y q1 z- X
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
+ G- C3 Y2 x7 n. J L$ q - <label for="taobao">taobao</label>8 @! G F4 D! ~ t7 u- K
- <br>
# C/ k1 L5 n3 y' J& b - <span>选择的值为: {{ checkedNames }}</span>
' P# _$ N6 h0 u) b9 x. q - </div>
" r Z* t- ?# | - ; x) ^# E2 s/ d" m3 `
- <script>: _( Z5 g2 N5 p5 E
- new Vue({
9 k. ~9 L) D7 d) K+ @( s" | - el: '#app',
0 ]6 K' U/ {+ l4 K# |, H/ K2 s' [ - data: {
1 `: k8 E. j4 n) ^: ? - checked : false,, B$ p6 l1 c, Y" O/ @
- checkedNames: []
% O+ a# ? R9 [: e - }5 N% e8 u* z- R
- })2 O" W) ~4 {" p5 G) h3 a. F
- </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
, e8 ?" P3 l- R" B* E) x- <div id="app">
( a$ T; v F) t2 A0 i% p1 I - <input type="radio" id="runoob" value="Runoob" v-model="picked">) r) D3 h, {. j
- <label for="runoob">Runoob</label>
. c& ^0 q2 K m% ~: ~( F0 T) ^ - <br> ~+ G& z$ l: ^3 S# C4 V' W/ N
- <input type="radio" id="google" value="Google" v-model="picked">
! P K5 x* r- O& | - <label for="google">Google</label>" u5 I) v& J, T" d, _% G Z
- <br>; b3 u& ~4 X# ?, y" D6 G
- <span>选中值为: {{ picked }}</span>
9 T$ t- C8 L! n - </div>
) R2 t0 l/ U; ]- z) D -
; t6 B2 P% X6 y. V$ v, h - <script>: Q3 i$ g, C% }) g% m b
- new Vue({
. C8 b( Y9 } p+ X - el: '#app',4 |# J) t$ v& D% d
- data: {
- F& L; Z8 [7 j! e" i! Q4 F - picked : 'Runoob'
( u9 V# y2 d- r; j0 \; e( F% V - }& H' i3 M% F. g# R2 } f! U+ u5 q
- })" {; ]+ Q/ c) v$ U
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
$ Q8 ^* j, L e( Y# p- <div id="app">9 ]. t3 S: O3 l- h
- <select v-model="selected" name="fruit">$ y! r: S; y) y% S! F" e9 O
- <option value="">选择一个网站</option>
# z F* h: E# e E - <option value="www.runoob.com">Runoob</option>- x4 S* |" m+ {* N S m
- <option value="www.google.com">Google</option>% i# m7 z: K$ N% \, R5 s
- </select>
7 V6 c* z# i0 \+ T; K - : S7 L: l/ u/ ]7 [- X7 Z
- <div id="output">5 |# [# ^! L. _7 [9 Q, i7 L9 W
- 选择的网站是: {{selected}}
2 s8 Q" l0 W4 t4 I% t( y' ~ - </div>' X6 {" j* H5 s* e% ?: L
- </div>+ @* p# U6 a2 J6 v" |
-
. ~1 a8 x$ C9 f% o s - <script>
5 H) p9 p5 z+ }! J - new Vue({) A( M7 r9 w& {( Y! W3 F
- el: '#app',& r( S. j' ]* b3 k ^
- data: {/ l) J X: z: T: w
- selected: ''
- O) d- `, c1 S6 i - }
3 Q7 \& ]/ \$ A& P - })! c8 Y* d- H( d+ \
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->+ G2 H! S5 X- |. L! h
- <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({! E9 D* p- v8 }* _) q4 u
- el: '#app',- ?. [0 ?# p! U) v1 g/ ^) o+ }
- data: {% _( e2 _4 i, ^5 q; [* R
- checked: false,
6 K; r0 g0 d, y1 H( Z. t, \/ J& H; Q - checkedNames: [],! w: P# d+ c; w9 E: q
- checkedArr: ["Runoob", "Taobao", "Google"]
$ s2 T4 I# R i M! [5 n4 R. w7 p - },& x( \ l' u8 D1 o: M# Z& Y
- methods: {+ \7 W1 N# G# Q
- changeAllChecked: function() {' Z. S7 R$ S7 n# e
- if (this.checked) {: z9 T3 T9 u& w$ Y) Z: f
- this.checkedNames = this.checkedArr
3 N3 B1 _# I B - } else {
* c( b8 X+ O5 z( C - this.checkedNames = []
+ o3 r5 w8 \2 i( r8 s - }
7 u( \0 I+ b8 x! a' e - }) u: c# ]1 Y! s$ O9 F1 G2 n
- },' `+ w% U' Q; V
- watch: {
9 \% F2 L H/ n3 ^- ]% j - "checkedNames": function() {$ m$ Z! i" w- w3 ]
- if (this.checkedNames.length == this.checkedArr.length) {* h" f) P3 ?7 f$ f
- this.checked = true
, R5 a& @) q# e4 r( |& e - } else {
; n! r9 Y/ `6 t' y- b- [/ e4 l - this.checked = false+ Y! v& I' N; _6 F6 Z
- }
6 V% F% ?; n0 k* k. r+ X0 V+ k" O - }
" C. j* D* q- C3 `' x - }
6 h% w+ _) D v3 [ - })
复制代码
- R: X) A( T7 ]4 I3 d' {
( V6 K1 ~1 G; A7 l0 r. _( [: }( @" B% L8 h3 I5 G. \
/ V' Y0 c- q' `* p8 ?
5 m. Y9 ]2 I. _4 x: I, c
4 y9 @3 r2 e3 s; U: a1 V
' w6 M; w( U" k0 `' }# k0 ^
. u- x, D( b3 t; J |