这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
9 `( I/ ^- [: n8 M7 H, n+ O- <div id="app">6 B% M' B% M8 _5 {! L) P
- <p>input 元素:</p>7 k; L9 j+ b& n( ^: q, m
- <input v-model="message" placeholder="编辑我……">
0 c% Q8 _) U0 {1 q# t - <p>消息是: {{ message }}</p>
; D0 z U3 n; H+ t - ! @, T u% r5 t8 j/ v _2 m
- <p>textarea 元素:</p>
3 t4 m7 {$ y0 h - <p style="white-space: pre">{{ message2 }}</p>7 B5 S# T1 h, ?8 F W' O9 E2 z
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>" P1 ]0 f' E0 f, P. a. X: T
- </div>
1 u! Q: v, |; K6 M - " p; z. N9 l' k" p2 p5 d
- <script>8 e7 P; [6 b2 `' G* b
- new Vue({
0 V' S. r8 n8 m' s3 g8 a - el: '#app',* A8 _0 m8 \! x8 S/ b$ i
- data: {0 e. W6 _( A- k0 j G( c
- message: 'Runoob',
/ I# E; v9 ]* n( D9 B" k& m/ F2 ? - message2: '菜鸟教程\r\nhttp://www.runoob.com'# G D8 V& _- B' U' {; z
- }0 F+ P! v0 V O: Q3 V
- })
3 R8 {" U$ u+ Z* l( x4 i7 w2 Y2 |# x - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定: 2 i5 y- {# o8 N2 ^5 W. h% v6 q8 r
- <div id="app">
6 }: l6 x3 O$ Z0 V: x2 W - <p>单个复选框:</p>
3 q; ~( z _' p' _; F - <input type="checkbox" id="checkbox" v-model="checked">
/ _/ o0 \: D. ^: _' h+ m - <label for="checkbox">{{ checked }}</label>6 j. {. Y e" D8 R" p+ K, p
- : S, w) ~7 z$ W3 N P2 v
- <p>多个复选框:</p>
2 x+ d0 E; w, s: l1 G9 j% G - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">. n: c8 z3 a% }# L- w' h- ~
- <label for="runoob">Runoob</label>( B7 P0 a" z( `3 k; B
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">+ @0 w5 C; u" d+ o: {, I
- <label for="google">Google</label>
. m# C2 E! M9 T" F - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
: j: P: |+ r9 b' M! \3 b. T. k - <label for="taobao">taobao</label>- h' _* L$ e; X* \" x
- <br>) ]6 i! r! @ z0 l* J$ d
- <span>选择的值为: {{ checkedNames }}</span>
! N9 U) w8 [ q& R - </div>8 ?! |! r6 t( S
-
% X& g- u$ M" N) ^8 U K: f+ C - <script>$ K9 E0 R0 G1 g2 M
- new Vue({ E' h; E" B3 v n+ v4 A5 {* n1 {
- el: '#app',
0 X- [- P9 y4 A' P A! L - data: {
! x8 a# {) t1 U, Q/ y2 _5 z/ f - checked : false,
' n' z6 l' I& ~4 J# v - checkedNames: []
( [$ b$ ]% ?6 ^8 m; S6 d* ?+ m - }
" F% i- |! ~6 T+ e1 P - })
- x) j. i5 i9 _7 p" i$ X) F - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
; i; R& u2 v2 ?# Y# H- J! f% M- <div id="app">
. T; Z( X: N; o( e - <input type="radio" id="runoob" value="Runoob" v-model="picked">" R" }, Z5 w$ i% u! U
- <label for="runoob">Runoob</label>1 ^" K4 R3 S+ B% D' G. F$ h# Q7 }+ ^7 v
- <br>; u& W8 r% }2 X2 B
- <input type="radio" id="google" value="Google" v-model="picked">) S0 C% n F1 B" n5 @
- <label for="google">Google</label>
1 U$ y1 G* K1 T" |" B - <br>
1 x7 b+ e1 ?+ M: ]' @; S! [* t- N - <span>选中值为: {{ picked }}</span>/ w- C1 N! O* h; @; U+ h
- </div> k F; d% ~; d) N/ l
- # g4 H+ `: K8 H
- <script>
7 C; i3 _3 i' k% K" v1 @! N - new Vue({
: E' P( j1 z# p - el: '#app',- X" ~5 z5 z: ~: s& ^1 L2 G
- data: {
0 ]( j7 m6 \/ ~6 x. w- x, K - picked : 'Runoob'! q0 M; v1 E5 ]% Y2 R% W
- }
: ]) m) j. G) W$ I7 T% X - })
& k6 X2 o/ c- E8 w% @4 Q9 w - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select) C ]- t9 n0 m. t+ }0 q
- <div id="app">' p: P" ^6 b) w. q' {
- <select v-model="selected" name="fruit">6 a- G k4 y: u+ R) h5 S. j6 j4 m4 X
- <option value="">选择一个网站</option>; v. \5 _2 d/ v1 Q0 v' m0 Z9 P
- <option value="www.runoob.com">Runoob</option>
$ A7 x' \% _& F' T( P8 K - <option value="www.google.com">Google</option>
9 u) F* ]' B t. H4 Q9 U' f - </select>
! v+ a& ]. u4 ^4 H -
6 X) s& ]1 o( z# v+ ~" u* W5 ^' } - <div id="output">7 l" K0 {' r6 c; T( ~( a3 V" E
- 选择的网站是: {{selected}}1 V- h, x7 b- x. K* d3 O3 Q
- </div>0 t6 \" h( a& |/ K* c' x
- </div>
% i: b8 `% Z+ Z, @( g" O0 x U% D: A -
* e% s: V) V- p - <script>! R8 N j3 \. u
- new Vue({
* q+ H1 |- M6 L - el: '#app',
- Q1 p+ k, ]4 u7 _ - data: {
" A% p5 b2 x, r" u5 j - selected: ''
5 U) u& Z0 S7 t" m - }+ Z. v ^0 c0 u: ]% r
- })
4 J) B3 I5 ?' ~1 _- g - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
* T h. I* y: S* Y. `* w# k+ h# ~: 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({, Y. r* y) w2 f
- el: '#app',
7 |8 `: w! j, A4 ? - data: {
9 H2 [- L7 o- T - checked: false,( M6 e1 m- @% m: R
- checkedNames: [],
0 |) E. g/ y, V9 c" D - checkedArr: ["Runoob", "Taobao", "Google"]
) \* \6 o" F$ t8 }( j" V0 W - },) q; O$ O% v4 \0 U9 J0 s
- methods: {
0 \ \0 s7 u0 T- ?* | - changeAllChecked: function() {( [$ A% @. d- F+ e( K' e$ l
- if (this.checked) {
% T |, D, |& d8 @0 |7 @. F2 S3 D' K - this.checkedNames = this.checkedArr z `4 l: |) u, D5 @" G
- } else { L+ w# z4 T$ U
- this.checkedNames = []- C i: z% o9 C0 t- T4 g& @
- }
; j$ X( L9 c( h - }% p) }( k' u$ x1 P( J) K' G
- },6 |& c9 m( W: J7 Q' }" @% ?( V
- watch: {: @ S( B2 Z. B0 ?8 u- P$ p
- "checkedNames": function() {
/ f* j6 g, \4 p7 l6 e% q - if (this.checkedNames.length == this.checkedArr.length) {
b/ `! u0 b2 l' b - this.checked = true
* Q* L+ E8 v0 N, K* A8 t - } else {
/ |# K' T y0 W% C" c - this.checked = false
( j7 x& [& o- \* j - }
5 G+ x, e, g7 @+ X2 m - }
' v& Y/ q/ l o6 {4 H( u - }
9 b# _, q8 d: \ - })
复制代码
: f6 F$ Z. ~; _! h$ h( Q2 [. z$ r9 G6 {% Q3 F4 S% `" r5 F
3 z7 M* ^5 E3 w: m$ p
# d+ x/ P4 @; U) ? \3 e! T
# R" y- @3 S: Y6 @
{7 y2 |" L8 g+ |' @0 l$ f
% s0 ?9 N5 b; G( o2 G5 t; c
/ E& i# ^) M4 O/ Y) f$ d# u+ A7 C |