您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15485|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
& J! t/ Z$ i- n! k
  1. <div id="app">
    + H4 @. V1 c$ L% q( T
  2.   <p>input 元素:</p>* K) p% i4 Z& X! m+ z7 l1 M# Z
  3.   <input v-model="message" placeholder="编辑我……">
    + X7 O3 w1 S  L- J7 T5 f
  4.   <p>消息是: {{ message }}</p>2 }( A6 h6 a! Q, T& |5 k  o
  5.    
    * m; d( {& x5 \: ]% N3 M9 I
  6.   <p>textarea 元素:</p>  ?4 ]2 P+ c+ E3 |2 y  l
  7.   <p style="white-space: pre">{{ message2 }}</p>
    3 y" S$ w( \1 A/ e0 ]
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>( l- _( P9 `( k  E' k
  9. </div>
    9 |( K+ p2 D; @, t
  10. 8 n- W! Q( E7 @5 G, L
  11. <script>
    . }# g" I4 @( ?
  12. new Vue({2 Y5 n2 e/ U7 K1 g( Z9 Y8 k
  13.   el: '#app',
    " a# L5 D0 E: _3 A  @, i
  14.   data: {
    " ]1 j, d/ B  C, n; S- h
  15.     message: 'Runoob',6 J* ^; M# |4 X7 G: `
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'0 q  X4 b2 h' d& x3 E: f1 r
  17.   }4 U8 d( m9 d; `. I+ D* K" i
  18. })1 c& }& C  l% F/ I
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

- @! ]/ z# U; g; |5 V: v9 a
  1. <div id="app">
    7 [. U6 K) Y4 }) f7 K
  2.   <p>单个复选框:</p>
      |9 `5 B( ^8 w7 ?7 W6 I$ @* }
  3.   <input type="checkbox" id="checkbox" v-model="checked">  K! n7 _* Z8 K5 A( x" s; K
  4.   <label for="checkbox">{{ checked }}</label>% t- M; X5 h6 B! @  H5 M/ C) }7 Z
  5.    
    1 a0 V3 I8 C, r; f4 P6 r
  6.   <p>多个复选框:</p>6 a: V7 e: D0 p( q4 z, x% P$ n
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    9 W5 ~1 ~2 H. |/ v
  8.   <label for="runoob">Runoob</label>6 H' {( y" m5 H7 J
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">  [3 n$ K% A8 s
  10.   <label for="google">Google</label># t7 y6 i. [4 ]. r& c
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    5 c, q( R: E* B% f7 x" u' r. y% ]
  12.   <label for="taobao">taobao</label>, v( r1 }; a2 x! T
  13.   <br>
    0 W; z1 g  D% x: U# o* X0 L
  14.   <span>选择的值为: {{ checkedNames }}</span>
    $ e4 f( D6 I; Z' i# B
  15. </div>
    7 V& V! c" a; `: \6 m5 q5 J1 y* e

  16. 2 t" q) e  }( m" j3 H
  17. <script>+ s* A( N# Y, \6 Q7 f6 P
  18. new Vue({
    ( {6 \8 a% n, K4 f: W- {' {- q
  19.   el: '#app',
    & U  o$ D9 f7 g9 x. A5 w: ]
  20.   data: {9 M2 g" K  ~0 T! k4 v+ q, `7 l
  21.     checked : false,2 `7 `9 @. p: b# Z& D, I3 m
  22.     checkedNames: []2 b  L: w) @1 k6 e9 I
  23.   }
    1 y/ B; \; ^) Q% q( r
  24. })
    $ W; Q( K$ @* M/ x5 d9 Z; ^
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
  e$ M+ P, Q, m+ ~, ~% e, u. z
  1. <div id="app">& ^4 Y% ^0 m7 b; m
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">6 N3 ~3 I  R8 G' {& R+ @$ F$ [' i
  3.   <label for="runoob">Runoob</label>& g5 \% E3 ?- O. J! [2 O+ P
  4.   <br>
    2 Q/ t1 l' M  x
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    ; `! r! q! t2 ^
  6.   <label for="google">Google</label>
    ! `4 Y4 ]6 ?: z
  7.   <br>
    ! C. y6 d% N" Y+ Y% _6 u1 u
  8.   <span>选中值为: {{ picked }}</span>) W/ ]. {' T; E6 m5 w/ q. j
  9. </div>
    & @0 `; u" D4 k6 X, M* m! t

  10. 2 @, q- Z4 h+ m2 L$ d* N
  11. <script>
    0 O( R' Y' _( H% O. N2 L
  12. new Vue({! Q7 Z& g* N, `% I8 \3 K
  13.   el: '#app',
    " s. u; O- h7 G* f4 J
  14.   data: {
    3 L' F* e- r/ h* _
  15.     picked : 'Runoob'
    8 e& g( E' c( O2 e% K
  16.   }
    ( W4 _* O4 W8 `- k9 U, l' J' R
  17. })" U7 n8 ~9 P2 G! r- z5 T
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select# h# \6 Z  b" J( }
  1. <div id="app">) {% E, p$ `+ Q) I# j2 }& N
  2.   <select v-model="selected" name="fruit">: S- M4 q0 U* e$ v- m: u, d
  3.     <option value="">选择一个网站</option>- a; x4 ]7 a/ r! Z
  4.     <option value="www.runoob.com">Runoob</option>
    ( M6 n/ m. R* y5 Q( l3 j( X
  5.     <option value="www.google.com">Google</option>
    - _/ j2 w: Q6 \6 R! i
  6.   </select>" f2 K- \6 O* {

  7. 2 o/ w) b% e6 s6 {! p
  8.   <div id="output">
    1 y+ m' _7 }$ w- N9 X1 [5 b2 t
  9.       选择的网站是: {{selected}}
    + d# I0 c$ P+ q
  10.   </div>
    ; [2 i5 p# O2 S8 y- F3 H, w
  11. </div>
    4 B& ~' r5 Q( C9 e# x) q$ ?

  12. . b( K7 x* j  {# k. S8 [/ y
  13. <script>
    " T8 U8 l0 h+ S
  14. new Vue({
    ; E: A5 y' k. s9 T# j+ d0 m( J
  15.   el: '#app',& i2 G5 i. D) }5 |9 r7 i* u+ b! }
  16.   data: {' e1 k/ M  l; n" S9 a( q. u
  17.     selected: ''
    5 w) K7 C. y1 F) d: n
  18.   }
    4 n$ N) z) }- r( x: H2 x+ d
  19. })) q, j2 G  A, Y: T4 k' }; o
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->( {3 F0 V; V5 Z5 d: O( f1 ^" g
  2. <input v-model.lazy="msg" >
复制代码
.number
如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值:
  1. <input v-model.number="age" type="number">
复制代码
这通常很有用,因为在 type="number" 时 HTML 中输入的值也总是会返回字符串类型。
.trim
如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:
  1. <input v-model.trim="msg">
复制代码
全选与取消全选
  1. new Vue({
    , W+ l  G0 m% j; O
  2.     el: '#app',
    & i0 K6 g  x' N2 O: d+ U
  3.     data: {0 p0 j. j7 b- t
  4.         checked: false,
    6 [; V- \/ q4 c/ c7 \: E
  5.         checkedNames: [],# B4 U( z* N1 T; n) `) ~( `9 Z7 o
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    6 D  y& U5 _; h% t2 k" V
  7.     },+ Q8 ?- \9 ~% h
  8.     methods: {
    : o. G) w. b, \: g8 k* e- S8 N* @0 j
  9.         changeAllChecked: function() {
    2 R# {0 W: x# B, p# T; M
  10.             if (this.checked) {6 Y( s! ~6 x: ]8 O8 c$ G0 j
  11.                 this.checkedNames = this.checkedArr- {# M' ?! Y+ i% l+ A! @
  12.             } else {
    : z* B. r4 T8 x! k/ ]0 p
  13.                 this.checkedNames = []
    / F) m% {& \+ E5 @* ^/ c7 h
  14.             }
    $ b1 F& o1 \0 B: U
  15.         }
    ; C2 l( f: f& Q4 |2 n& }( Y7 ]
  16.     },
    0 a( [, L1 P# f$ _" @# Y% M' d
  17.     watch: {; X4 e2 D( G: A" a
  18.         "checkedNames": function() {4 n: U) _' }6 {  I$ j7 j/ T! l
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    - O( w. P  U6 e% k& G) s9 }
  20.                 this.checked = true' d) `0 n9 t+ M, m6 m" K% s! |  _
  21.             } else {# f- f3 e' b" H( L( P; @
  22.                 this.checked = false
    0 c/ ?2 s1 ^# T" t# i
  23.             }
    2 o& ?& }# g7 c* k5 r% {
  24.         }
    1 b: I9 F7 @1 K7 z5 f
  25.     }' E3 t. L2 v% w4 A8 m' u
  26. })
复制代码
% F. l/ d& z$ V, d7 w7 @( N) P
0 X3 f3 A# h  s
8 ]7 ^% p2 N. m5 l1 h: {( `
6 U) L- p0 Q7 C. y( ^0 F( P

; }% r1 {9 t6 z1 v
; c6 \1 @! c9 R) T2 f. q9 _* e( h5 }- B

9 F1 ~5 e( }1 k* @: P% o- ^! H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:33 , Processed in 0.061159 second(s), 22 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!