|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
# {/ M, ]7 F. e: A- <div id="app">% v4 j) @; W- L$ {6 B: C
- <p>input 元素:</p>
6 r& o$ m" b( @: o - <input v-model="message" placeholder="编辑我……">
$ h2 D& F$ w+ ^5 ^1 L( H - <p>消息是: {{ message }}</p>
9 p7 e: K( y! e b9 B - 8 ? @3 E( p' Z9 }- T
- <p>textarea 元素:</p>! j$ [7 a* u# R4 m- c" i) M
- <p style="white-space: pre">{{ message2 }}</p>2 Y7 {# s, K, W. n S9 W
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
1 m0 Z( ~& k' b, G$ ^" c3 N - </div>
( m" s$ T! n: `* X3 T" a -
2 N+ T) j9 k) T! Y0 T - <script>, E; J4 Y1 Y- i: t' `/ R
- new Vue({
5 e* P* \: b5 C4 l; t& U - el: '#app',
3 |$ \1 x+ X" G/ V - data: {
$ F! y# g# u+ b9 Y - message: 'Runoob',
. o" ^$ P8 F# n9 L - message2: '菜鸟教程\r\nhttp://www.runoob.com'
7 ]- l6 g, o! X1 r$ n - }
0 d3 V; \! [2 Q% ` - })
: A7 C3 _+ b: V/ x5 D2 D4 r# M - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
0 w+ D/ y9 z+ X. y4 M- <div id="app">
, q* f0 D R7 m5 | - <p>单个复选框:</p>
1 g" ^& l- E" Y0 P1 _' g. F; Y - <input type="checkbox" id="checkbox" v-model="checked">+ C. c# r9 ]3 T
- <label for="checkbox">{{ checked }}</label>( t: O7 u- ]) \; a: e+ V: a
- . ]; u. w( G! r, e' J" g. i0 q
- <p>多个复选框:</p>
: ~. R: j8 _/ C- z1 O& b1 o - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">/ k* h9 w! r2 h1 d) S1 k* \: `
- <label for="runoob">Runoob</label>
, ]1 o# Q! S+ t( X: } - <input type="checkbox" id="google" value="Google" v-model="checkedNames">
$ z' C; ~1 {/ {; P2 A- X U7 p3 I - <label for="google">Google</label>
2 X- Q1 l8 Y9 Y! N7 X4 g& V @ - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
; w) Z- O, `1 O2 F2 s - <label for="taobao">taobao</label>/ f. [$ ~4 M% i
- <br>$ m+ S2 I8 o& @) C# K3 t/ I
- <span>选择的值为: {{ checkedNames }}</span>
1 |* t4 I" D+ R7 H5 t) V( l0 _ - </div>3 ~3 ]8 i6 ~# V+ e$ \! z
- : L+ t% ?# s# m+ X8 u5 U8 E
- <script>% l# R) R2 ]. d) E1 o# [
- new Vue({
$ t3 k( @0 n; e. F, R - el: '#app',
0 O- P, k2 M8 W- N6 O - data: {
4 ^8 e" R( I3 _3 H+ N - checked : false,
: b8 P4 M; Y! B; S/ F - checkedNames: []4 w8 s9 X4 d, \, L/ h* l
- }
( T# q6 A0 W' U% @" V% Z - })
! D" G3 ^- ^$ S - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
\' [9 j1 F# `$ Q- <div id="app">
2 L; C+ l. D! C3 ~7 F - <input type="radio" id="runoob" value="Runoob" v-model="picked">
% X5 m0 Y0 ~) f# n2 O$ ?; n. q - <label for="runoob">Runoob</label>
! m$ C/ n* k8 P, n6 d$ ~ - <br>$ W/ d- W$ C( y
- <input type="radio" id="google" value="Google" v-model="picked">
. @" @ R2 d$ K" ?% _0 t+ P - <label for="google">Google</label>3 y+ L% l- q! X t) l5 v
- <br>
9 c n" w- a i, D% s0 A8 r, A - <span>选中值为: {{ picked }}</span>7 d) E. K) @. T- Z# s) g
- </div>1 ^& j# |) t5 W7 K$ o
- 3 l$ j6 l6 b; W" V t) U
- <script>
# G3 C" I; t' D+ { - new Vue({
6 C3 A1 m9 W8 ]6 ^) W - el: '#app',
3 O2 }$ H1 L2 X; k% f2 _2 V( @ - data: {4 _. ~3 F* J1 s' U, f$ c
- picked : 'Runoob'
* M1 d! U# O, D% ] - }8 Y Y) O ]; n
- }); J0 u' [1 U% ^
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
t8 g$ M" X& K8 `- <div id="app">6 X g( @6 E5 e* h( _ Z( i
- <select v-model="selected" name="fruit">
9 s" B4 p" |6 ~* m - <option value="">选择一个网站</option>
9 Y! Y* R8 Y" e3 U9 w. J6 K - <option value="www.runoob.com">Runoob</option>
. z' n0 h; O( g. _ }) F - <option value="www.google.com">Google</option>
6 Q" r: r. |7 Y - </select>
O, `: s# N9 t s T4 U -
( \7 j; n5 _9 S' g1 F$ F - <div id="output">
* o, L$ U2 {7 h - 选择的网站是: {{selected}}6 z6 y7 X* A& k. H: K
- </div>
: D/ A9 h, j2 t - </div>, D8 c2 H2 ?( L2 f0 y$ O" n
- 7 r r4 q/ s. d( h9 a" m6 G) U
- <script>
, k# g# q/ K0 _6 N - new Vue({
& ? _$ k# t3 @ - el: '#app',
' d4 o1 p! Q# F4 l% l( c) r - data: {0 R6 S- w8 }! n* `3 K
- selected: ''
' M; ^+ Z+ Q& O, N6 k - }/ Z% P( R+ U: t. A8 _" s! O
- })
1 B/ T! a* _: g* m% E - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->* S$ f$ m" c, h: f5 S% 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({ z1 ?) ?- h% F l3 G* c) |# F
- el: '#app',0 P0 R0 D! d: D' e
- data: {. P, b: x: p- c9 A- \) D% r
- checked: false,
( i6 _# e( H- s8 t- v9 P - checkedNames: [],) U/ E5 p% Y: u2 F- E4 v
- checkedArr: ["Runoob", "Taobao", "Google"]$ f6 I) Q+ r0 g% g1 K. \6 e
- },8 ~, V* E; n; s
- methods: {& o8 a0 l. ?8 r: a0 X/ {
- changeAllChecked: function() {
7 @/ C4 q* {4 \$ V. T$ v0 Q7 F - if (this.checked) { @; @0 i! ?, l: r! w* I P
- this.checkedNames = this.checkedArr" `2 W; T6 K' c$ \
- } else {
+ @- S/ D2 R" { - this.checkedNames = []
1 v4 C( d# u$ `2 A+ @7 Z$ }, i - }- ^5 X4 w4 ?* b+ S+ E5 P
- }
3 k6 {8 L$ O ]8 }: M5 K1 V9 e - },, i w% |4 d1 `0 u
- watch: {5 w" n+ n( T4 g8 y
- "checkedNames": function() {
' B9 |; S6 X! ?: L+ n - if (this.checkedNames.length == this.checkedArr.length) {, J8 t0 I1 I. [
- this.checked = true$ e" i# x9 \- w5 R: H) Z
- } else {0 f& g" ^7 ~& b) U
- this.checked = false
$ k* o+ D; L) u$ {, ?8 B6 } - }5 O; J" j5 D2 s9 C) V# l( w) Q9 B
- }! {' d% q6 V a8 ]$ G
- }9 e; g3 B' s8 p9 }0 L" J3 q1 \ ^9 l$ P
- })
复制代码 " m) |. D H) C# B
/ Z3 |& B! v$ W' h2 c6 G( @* ^
3 G* h4 }& |) j! n5 a
. q+ k; w* X7 z; t6 `1 r5 S, j. a4 o5 k5 f7 {+ u5 w* f! x
0 {: g/ y4 d" m- @. f& {
- X; o, N0 n" d: G' V! K3 J- s4 i! H
5 E* J: n. \) [4 j0 P6 I' n
|