|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: ) J4 G& b# l9 m7 ]% m4 {- n/ x
- <div id="app">
; M* s; w, x. r( F* S$ V6 e - <p>input 元素:</p>( `" O$ `4 R4 q( h6 g) T$ t
- <input v-model="message" placeholder="编辑我……">, R+ L+ |/ E1 m# C6 Q; B
- <p>消息是: {{ message }}</p>$ k Z* y: Z" `0 x# |8 B
-
# x& D d5 K. c* r7 |) Q9 \ - <p>textarea 元素:</p>, W- S! Y0 \1 M) f; q$ K% g
- <p style="white-space: pre">{{ message2 }}</p>9 U G( g. [) P! r \
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>' Y z% ~5 ~3 {1 V3 _$ ]+ ?
- </div>
`' ]4 c8 M, o8 z0 b- o - ' j% h S/ y& N8 c/ ]. u
- <script>5 k: V3 u5 c- y( A6 k8 c
- new Vue({
7 t7 v3 `( V9 Q+ s" t - el: '#app',+ e) e& Z: @6 U1 b+ \6 M2 H
- data: {. O( t. G8 Z/ v, X. a* q: L& ?: d; b
- message: 'Runoob',7 K$ o ~6 e& u6 F
- message2: '菜鸟教程\r\nhttp://www.runoob.com'- }" X- h' G. S9 T* c
- }, D2 M: B5 ~ O2 T
- })& B" f0 u0 M0 _, M
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定: - Y/ _( ]0 n! V: j. N# \
- <div id="app">5 b! k0 t) c9 a' W: ^2 z
- <p>单个复选框:</p>
$ g: P' p+ Z0 | - <input type="checkbox" id="checkbox" v-model="checked">" q N2 a% k; f
- <label for="checkbox">{{ checked }}</label># Y# i; u( y' w% @2 H
-
3 Y, e2 j5 X+ H! E H1 z z - <p>多个复选框:</p>
5 R" o# x' x/ v0 [" j4 \ - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">. j6 K- t* r% y$ c
- <label for="runoob">Runoob</label>" Y3 n5 s0 G( l) s
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">
9 A4 Q' `5 I) r& I6 j" B2 V! F% G - <label for="google">Google</label>
x% k# ~4 t6 Q - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
" [" I& g) t. r# V9 W' H - <label for="taobao">taobao</label>
" r, v9 z1 U; r. E+ } - <br>
- a1 | o" L9 c5 A' H+ }: R - <span>选择的值为: {{ checkedNames }}</span>
: ?6 L8 w! M- R: M* L, H# V - </div>( f. c4 p& C& Z1 P+ d
- 5 v8 f7 B0 V$ z- ]
- <script>8 V4 e- G7 k* h/ z' `
- new Vue({* O4 p$ ?7 _* _ U, x+ e
- el: '#app',( G O1 v: w+ r: D. F# Z& o
- data: {
2 P1 {/ W( r- e, K7 e - checked : false,7 E$ L! ^6 J' C6 V/ v/ t
- checkedNames: []( l' y: e$ ?( R* b$ H
- }5 {' J! A) \2 I. T% R
- })
. d t. t$ V" g# D8 V1 E8 W - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
8 ^5 {( q; Z. Q- <div id="app">
; O' ?# L, p7 h f) E, Q f: s - <input type="radio" id="runoob" value="Runoob" v-model="picked">
" {+ J0 ]4 e! S, ]/ f$ r8 j: g - <label for="runoob">Runoob</label>/ U0 Y/ i& k$ a( J% k/ I8 I2 h
- <br>% F& }8 X) I4 q; n" x9 D
- <input type="radio" id="google" value="Google" v-model="picked">
6 U; K% C$ b" K) @( A1 W# S2 i X - <label for="google">Google</label>: @' W! k8 m8 Y2 @
- <br>
* Q* J4 |* Z: ^4 X- X0 _1 x% ^ - <span>选中值为: {{ picked }}</span>' l: H: G& d: ?8 F; h7 l/ g
- </div>! R, j3 t# O1 `4 B1 B6 ?* o2 P
- 6 A* l* y2 U* t
- <script>
9 A& i1 ]9 S0 K7 m5 L" [6 H" s4 A - new Vue({
8 x* `1 w7 E" }: C2 Y - el: '#app',7 ~4 A* ~4 a& ]0 o2 |
- data: {7 @) z# b' \" g
- picked : 'Runoob'
8 L9 F& |2 T# ?( s/ J - }
& Q7 B3 E0 O0 { - })+ E/ c% Y/ L- R
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
* S; l' z9 N+ l2 H9 a" M! }- <div id="app">6 x$ K! s: d$ V+ O) b @0 L% W
- <select v-model="selected" name="fruit">
0 Q8 r& W% L3 ?/ K) q( z, }( Y: Y - <option value="">选择一个网站</option>
) Y- D& D7 f, g - <option value="www.runoob.com">Runoob</option>
) l* S, `0 s! a% a7 Q - <option value="www.google.com">Google</option>
4 j+ E* i" b) Z& w5 s - </select>
. ?. g9 a# H. `0 N& p -
5 z/ b; V. p( [, q* C& w- R - <div id="output">1 |8 z, Z7 q% B8 @% j6 v# }. U4 q
- 选择的网站是: {{selected}}
+ t2 A2 W% i6 @ - </div>; k4 c8 h' k6 [8 W' b2 r5 _0 r& p
- </div>
. j% L7 e8 c, f* X J8 a4 b - + i: k! B! a% L' T2 D
- <script>/ i1 g/ @1 B* @6 P" C
- new Vue({
l, ]7 L- d+ @" g) M - el: '#app',
0 v6 j" d7 l9 T" M - data: {2 G$ l0 {6 q0 ]+ l% e6 m1 y
- selected: ''
. ~: \5 r- ^' K8 ~6 ^ - }
3 e: U5 B. K+ G - })
) O' J0 f( e) O1 X I - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 --># f* M- f2 @# t9 I D6 T
- <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({. m9 ` m5 ?. m: _. I8 B& i
- el: '#app',3 M# [- p$ C, U. g% x$ O
- data: {
3 p1 v( T T0 V: O- _! I) S - checked: false, ?6 Q/ [, ^' C
- checkedNames: [],+ U1 _6 U5 z+ K- O0 t4 r7 ~1 e" m
- checkedArr: ["Runoob", "Taobao", "Google"]
) d r) X) W" I/ i: Q) Q5 l - },. V' [& Z3 a% o/ @5 |0 l5 D/ z
- methods: {
3 F" w) k: e& l, _2 o - changeAllChecked: function() {
: [7 r3 H$ h8 l: G4 u- Z7 P$ e - if (this.checked) {
/ B' X5 c. k1 v8 p: `$ d; I8 i - this.checkedNames = this.checkedArr
9 J, t, E9 F6 K2 L. H* ] - } else {
8 F8 X; J* n. c7 ] - this.checkedNames = [] l5 s9 ^1 V' k
- }
% }: ~( p) v7 m6 S$ p; r, @+ V n - }& u+ D9 P+ ]) v
- },
2 t5 ^$ N. m, f8 W - watch: {
$ h1 u- n( r7 m- T5 F e" E( ?0 J - "checkedNames": function() {" u' R" k* {, U# B
- if (this.checkedNames.length == this.checkedArr.length) {' E& Y% C( I8 S& N- I
- this.checked = true. [, c4 T& l T* k0 [3 {. U
- } else {+ g. |8 i2 J: {
- this.checked = false
0 N% a: r! e8 E9 s" Y - }) | |# t) t) ?9 |9 q6 e% @
- }
% b+ f) `+ _7 o1 R: C) x4 m4 l. g - }
% |9 Y+ r+ t& C3 B; C0 X - })
复制代码
4 ?+ L6 Q6 b7 t# p
5 H4 N: j3 r5 P* y
5 t; A) g& U: j3 {* c2 E6 B3 c1 Z; b- ~1 `& `$ Y5 s
7 @' H9 O/ [: X9 x: w" D5 Q7 e4 i4 ~
: W- t$ j6 p- ?! i+ l/ p9 @% {9 C
0 t8 I' p* h$ a: |7 B |