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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:

0 y; U" T5 |  M  f
  1. <div id="app">
    2 G7 n* E: F3 _; S* c% F: O* a, l) Z
  2.   <p>input 元素:</p>" N5 T# [* V. j* ]1 f0 d
  3.   <input v-model="message" placeholder="编辑我……">0 b  F: @, T5 j2 w) w- U: L  X+ @
  4.   <p>消息是: {{ message }}</p>
    $ \) I' K* Z% |# _( L3 d
  5.     ; s% I; C9 }6 G+ ], K& {
  6.   <p>textarea 元素:</p>8 r* M7 _( b9 Z0 h- E# P9 Y
  7.   <p style="white-space: pre">{{ message2 }}</p>
    * l6 r7 A$ L3 }- C* w
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>1 h/ U, ~$ K- M5 F- t
  9. </div>
      E. w/ F1 b- K/ Q
  10. - P$ Y4 G# `: @; o) @
  11. <script>. _: ]/ I  U6 g! u7 Y  k
  12. new Vue({$ X+ h8 F( P* {  j( p5 X/ W
  13.   el: '#app'," Z7 L1 p4 |% k4 A
  14.   data: {' y5 g- r* P! D
  15.     message: 'Runoob',
    & g& p( E- x5 F& d8 i* K& a4 R4 }5 [1 A
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'# c2 b$ l# p4 H- K9 `- E8 r/ g
  17.   }* G1 d( }4 w/ q' M) M9 U/ R
  18. }): ^1 T4 c7 ^" Q7 }) Z" w! C! @& l
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

  G8 A# W7 V9 U' ~) [$ N& Z
  1. <div id="app">( P8 W: t5 s+ A4 X: ]5 D) D
  2.   <p>单个复选框:</p>
    $ A# W1 \! `6 t' h# Q
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    - Q" U# C8 _' W! J: c5 W6 X
  4.   <label for="checkbox">{{ checked }}</label>
    4 u, h5 K' G9 e! H; H7 N! y( _  \
  5.    
    3 q8 ]  B8 i' n4 o/ f
  6.   <p>多个复选框:</p>8 ~! {% q8 `4 l' G/ P- t
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">, f; F- _: K3 p1 }
  8.   <label for="runoob">Runoob</label>
    " |! P& S8 W, z0 S% R0 B# o
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">$ F" R$ E2 t2 O" h8 `2 d
  10.   <label for="google">Google</label>
    1 l; a& Q$ I: e7 N$ `
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    2 D! E( v& K! D# k6 N, w& a
  12.   <label for="taobao">taobao</label>3 D6 e: |; p8 [! L' D
  13.   <br>  `3 k9 _# V$ X! \0 w9 d
  14.   <span>选择的值为: {{ checkedNames }}</span>9 ^+ P5 }6 @; M3 d% a# R) c
  15. </div>' Y' j) B; O  _  E
  16. $ J5 |# z+ O- _- x5 P- z6 D5 H, A
  17. <script>
    & _0 [: y$ c5 E; E7 u9 ?& @8 ?- T0 ~
  18. new Vue({
      U! o% R9 A: V9 p
  19.   el: '#app',
    % N# I) ?9 P- d# f
  20.   data: {
    $ C; V& D1 j0 S- u* ]
  21.     checked : false,
    7 S  g# r* z# R- _) ]/ C* |
  22.     checkedNames: []
    # w: H0 c* a  c1 o8 p
  23.   }
    2 A# J) X( E6 \) g( h8 {' h
  24. })
    . K# G8 k- N* y: _
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
( }9 ~6 j9 c9 d4 l% z7 q& b
  1. <div id="app">6 |3 _- Q4 C& J2 H. g# S) I; b" X6 w/ [. b
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    , @9 ~) m/ z' I8 |7 j2 }& t
  3.   <label for="runoob">Runoob</label>
    % M$ e$ {4 f0 m) P8 J6 r+ q
  4.   <br>5 e1 F4 z. _5 y
  5.   <input type="radio" id="google" value="Google" v-model="picked">
      V, l, j6 H+ j8 v
  6.   <label for="google">Google</label>9 [+ x7 i' o; C! m3 u5 Z
  7.   <br>2 Q7 W+ @+ b6 `0 V2 K
  8.   <span>选中值为: {{ picked }}</span># K$ V0 ]# O- X+ i' w8 s; q
  9. </div>
    / Y, S1 {$ n2 r" c3 d
  10. 0 a$ ^5 Q/ ?% s# ^7 n4 ~: t
  11. <script>' W# R% M: l( e/ H$ H
  12. new Vue({
    # l  @* L, e- @0 p* n: x$ {
  13.   el: '#app',
    2 V/ `! v+ A9 r& n" I4 Y6 @
  14.   data: {1 U7 u3 [: n& l* p1 p2 k4 b
  15.     picked : 'Runoob'
    ! r4 g* w3 B7 J6 ?# d
  16.   }
    1 N2 m! h. A) u: q- J
  17. })
    + I- U! o9 b+ ?9 J7 m9 Y
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select1 Y6 v; `2 H4 s' Y! R+ ?
  1. <div id="app">7 d8 s  J% j' N; I- S, A) T
  2.   <select v-model="selected" name="fruit">' s1 U5 q, l" k) ~3 t0 h9 m7 g
  3.     <option value="">选择一个网站</option>0 d' Z. V6 }5 i- s( A
  4.     <option value="www.runoob.com">Runoob</option>
      y2 P4 M: p; `+ }- p
  5.     <option value="www.google.com">Google</option>! }, ]! H) R% S. z3 E1 G- B
  6.   </select>
    ) P5 M+ D6 ?! x/ v
  7. . t! Y" y; l% d! @6 O; Z
  8.   <div id="output">( x6 K9 t$ Q+ v4 `2 b) ~
  9.       选择的网站是: {{selected}}
      M0 Q& G" v- K* P; T
  10.   </div>
    # ]: C& N8 y3 ~$ h
  11. </div>
    ; ^5 p* ]4 v+ O" Z7 |& j' d" x# U- u
  12. 2 ~6 \- `$ R. d8 H; V% {) x
  13. <script>: c8 N+ G- ~# A; k
  14. new Vue({1 n$ R: g( C: G, \4 G
  15.   el: '#app',
    - X6 a. A$ E0 j) Z$ w9 n
  16.   data: {
    ; j6 E+ s. T3 T& F/ D9 @4 z" B
  17.     selected: ''
    1 C5 g9 E6 @" u. K
  18.   }
    ) \6 [8 a( U( t# I5 x2 O( t* t/ M
  19. })) S/ S; P8 K- F* S8 U
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    ' H" z4 o3 t4 \( d
  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({; N# _( m4 u. J5 k& t7 @' E
  2.     el: '#app',
    * i2 a* R/ K+ R8 L# {
  3.     data: {! ?0 A9 K) R' q- Z# n
  4.         checked: false,7 A% S! w9 D5 o  T! b8 e, r  O: D$ u
  5.         checkedNames: [],, j# H; i' @: @# Y! W+ Z8 X
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    , A+ u- q: i* K1 N' R8 \$ Z& A
  7.     },
    2 ^" n2 X1 Z9 G$ }" L6 u' x
  8.     methods: {- A9 K4 G+ Y4 ~$ s0 l5 ]
  9.         changeAllChecked: function() {
    + Q* f2 h% C! ~' b: _% S; l. [; ~
  10.             if (this.checked) {" o  w2 B. v+ c
  11.                 this.checkedNames = this.checkedArr
    " f( o$ \( _: `  @  s) G. r) M" d6 y
  12.             } else {
      L6 i' A1 E' v% _: T, k; ]. ?5 O# d
  13.                 this.checkedNames = []
    ( Q+ F3 I; b6 b2 t/ U% f- ^1 z( e
  14.             }! K+ ]1 R# ^+ a' S' i: {
  15.         }
    2 D1 o7 H( b) T  F& p  |9 y
  16.     },5 F4 |6 Q( s1 Y
  17.     watch: {
    # u9 _& G& `1 ]- {' a# }
  18.         "checkedNames": function() {* b/ G% e7 l/ ~4 R7 f. A, h
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    7 z8 Q  G( x0 y: h
  20.                 this.checked = true
    , f4 ?: U) |$ g6 Z! w" z
  21.             } else {9 n/ C8 ~  R' |6 D3 h
  22.                 this.checked = false
    5 I* M6 H; x5 b5 i
  23.             }
    ! c1 _6 f0 ~6 a) J! ~. N& |
  24.         }
    % [# }0 u1 t1 I8 f  E' n' o+ M4 q
  25.     }/ @  O, t" X; y7 G' r/ y& v
  26. })
复制代码
* W+ Q8 D+ R+ s1 H8 k9 H
! C: m/ y) {  Y: m6 b4 C( J8 U

' U) P% E% ^3 v; X$ `* K! a' _3 M0 i  ?1 O# J, G/ g- R5 [, X- _$ y

& B! X! i# W, k
5 f! d0 F6 J: v% _- d3 F0 j5 f" y9 I) h) f5 |7 s& {4 y8 J
2 n1 l$ _3 q' o& q% d; D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:13 , Processed in 0.055897 second(s), 22 queries .

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