|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: . E W# j& Z% q2 h2 R& t
- <div id="app"># x/ c. V% \6 K" m( d7 G
- <p>input 元素:</p>
& T6 U0 r- X( L3 v - <input v-model="message" placeholder="编辑我……">5 {) U f$ s/ f
- <p>消息是: {{ message }}</p>9 |' s1 Q. g1 x( ?( O" y9 U" @6 @2 b6 u
- ; i0 R0 o5 B# o. H% s$ _+ o
- <p>textarea 元素:</p>
% `! A T+ V7 C8 W/ @! B' R - <p style="white-space: pre">{{ message2 }}</p>- |8 x1 H% x4 Y& c7 f" A
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
+ ^- R8 m/ J5 v$ \% y/ R - </div> S5 {/ W9 Y# U0 H: j3 O6 [' u) w5 v
-
2 F9 r/ K/ f+ A8 Z! \ - <script> ?; H9 c9 l/ I4 u2 L
- new Vue({
) K! E2 t: J- S' P! G - el: '#app',
. |! ~' L- u7 q- M1 q/ R# L! D - data: {
B, }4 l& r. r+ M6 f - message: 'Runoob',
+ c5 q! z$ @9 _6 B! @( L; x - message2: '菜鸟教程\r\nhttp://www.runoob.com'* [# D) l/ H# v' w4 l
- }4 N8 W/ s* C* L; M9 `6 J
- }). Z: j* ~$ d/ d: u- b& \
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
& C$ B U' p a. G4 ^- <div id="app">
9 I' k( {4 d; [2 e. Z - <p>单个复选框:</p>: s' i: ^2 w8 p8 J$ B8 f
- <input type="checkbox" id="checkbox" v-model="checked">
u* }1 {( U# u% r' x+ @ - <label for="checkbox">{{ checked }}</label>
d( V, w4 `% [3 `& f- K - : e' d! \- K. _8 ?
- <p>多个复选框:</p>- g$ Z8 m+ c/ {+ p% }
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">! C0 z' Q' Z' [4 Z- F
- <label for="runoob">Runoob</label>
. {8 Z# a" G* \* m) Q - <input type="checkbox" id="google" value="Google" v-model="checkedNames">- \! ^' e6 d, ^/ [- {1 q0 b$ M1 [
- <label for="google">Google</label>
1 ^' ]* ^! \* [: V' h& n! p( b - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
- k) Y: \6 [5 X8 e& G: L# Z6 T - <label for="taobao">taobao</label>
+ }7 p$ N; D. ~( x: ?( A - <br>
! y5 i8 G& {; }% I* ~ - <span>选择的值为: {{ checkedNames }}</span>: I6 L8 L* ^# o4 R5 z, k' {
- </div>3 Y8 t7 l' G* |
-
1 {3 s( \! m3 ^! E4 t - <script>
" L& F5 i7 @: J1 v0 n" a8 T - new Vue({. B3 O! r2 b9 o5 X2 Z; C
- el: '#app',* y9 }/ m0 k$ I _& u
- data: {
h; V n4 C6 F) U3 m( B8 _3 t - checked : false,$ Y( m7 I) _6 Z9 r1 w! U: S
- checkedNames: []
8 Y6 ^4 [; ?* r1 y# ^& U+ ^ - }
* t5 t. G3 |. S - })
. |# D. ?4 ]$ I) f Y2 e - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
( p' D0 {+ e1 F) z) b- <div id="app">- S A9 l" {) z5 U: n- Y8 Y
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
4 b/ Q& q; _7 @, K- v4 r - <label for="runoob">Runoob</label>
9 f+ Z9 S$ {: Z# }% U6 ` - <br>7 O5 b U0 o# f3 s$ M
- <input type="radio" id="google" value="Google" v-model="picked">
$ |# ^/ X! \- M; {0 t - <label for="google">Google</label>. t6 H+ S6 |% H: a* V
- <br>
+ q9 S# A7 ~2 ^+ Z2 b1 X - <span>选中值为: {{ picked }}</span>% j9 g5 E0 \4 q r
- </div>
' p/ W2 O! L0 i, l% j - 8 ^7 ~- M% ] u4 D. _
- <script>, e6 ?( c% M8 {. u5 {. Z9 k
- new Vue({
- S0 S b. l7 i2 Q - el: '#app',
5 ~, [# N( v, x& r' x - data: {
* w5 N8 J/ ?& |9 ~ - picked : 'Runoob'* P. b0 Z4 Q& p
- }
* H( E, y- R0 A5 |6 Z( i6 ` - })
% m( v# H }* I% D0 s4 A: M: P - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
+ G. C6 @. t) k" h- <div id="app">
% E* [0 W3 r1 }& d' S8 P" f - <select v-model="selected" name="fruit">
9 L: X, B* i, [5 d: b3 T% z - <option value="">选择一个网站</option> E( E) L' e4 F3 ?0 U7 j5 J
- <option value="www.runoob.com">Runoob</option>! Q3 m J& | O% T9 Q( O
- <option value="www.google.com">Google</option>
2 n) R+ X5 f. W3 |' w( r - </select>) P# |9 m6 c/ P. a7 S) i/ O6 _
- 0 @9 _2 x/ H% e( B D8 ]3 M7 [
- <div id="output">
1 o s# B, d' h% S2 b - 选择的网站是: {{selected}}. X3 x7 z& X7 k, l3 ~+ Q1 C
- </div>
6 N6 y% V4 X! k3 D( P5 } - </div>
7 T9 _$ [2 b% ~/ N6 u6 ` -
4 [: a h$ i$ b# e) t9 @ - <script>5 B0 i. d( P2 k( n
- new Vue({# R. k! L" c! M* E4 I
- el: '#app',
2 E5 L4 {: f4 \2 ]7 ^- A9 m! d" Z& S - data: {
& _6 }7 q, E6 M3 Q - selected: '' 0 I) O$ i: ?9 U( S- e3 ^& Y5 T4 b
- }
9 K' c: F9 F7 _% ~1 V+ L" p' | - })4 _: U' G" R( p1 m4 I
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
9 _; r" O. X9 O - <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({" B) B: O6 b. o5 a) R+ c
- el: '#app',
' s; D$ s8 g& J+ g4 p% b7 ] - data: {
. P: b: w5 ~2 s Y& O3 n4 s, ^ - checked: false,
& N3 M, S1 }5 c% h; O" L* u - checkedNames: [],
1 y$ ^" A9 b6 \- d - checkedArr: ["Runoob", "Taobao", "Google"]
. m0 w. P2 Q. F" u; C) A - },
% _* h$ v4 K, _, f - methods: {
$ v. E; {6 W* m% h4 g' H - changeAllChecked: function() {
, c% ]4 W5 ^, [& I+ H2 Y; R6 F1 z - if (this.checked) {
( {& P! r, j* r8 W( g7 o ]1 p+ Q - this.checkedNames = this.checkedArr3 j3 b% V" o4 S) Y* a
- } else {+ L8 n' P3 p) t5 n+ f! u' w
- this.checkedNames = []; x5 E$ \, A0 Z/ \
- }5 G5 \/ c! j6 Y9 D- @, \7 l7 |$ j
- }
1 V& d+ w0 o) h: Z1 w6 n4 E+ t - },
8 n$ Z8 @- G2 p. Z- Z! W - watch: {3 S# v! K7 J D% r3 K
- "checkedNames": function() {4 r1 @8 ^- e( [. H# i; q' e
- if (this.checkedNames.length == this.checkedArr.length) {) ?. G% M A% `3 a' b5 e2 j
- this.checked = true
4 v/ @2 }6 |) H; u1 \8 F; l - } else {
3 {$ u7 s; k7 f9 X - this.checked = false/ @: c; |7 A$ x2 P4 E
- }! h0 x( G: W/ n8 J- }) l
- }
$ G9 V. H0 ~* u2 H - }
! r9 j9 G4 Q8 n, G2 ^ - })
复制代码 8 h9 o3 t8 j+ u% J: b
3 b, y8 |2 y/ E4 ^. y* Z7 L. C K2 x( Z
4 L" u5 L# v# v# ^9 u0 @1 ]
( O% }! |- X, |0 ]' N
7 \: {7 S; b. i: I6 y* a
5 a. _0 N+ X* H2 A- i) p
) T& C8 ~) I7 ?. H+ { |