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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

$ B4 [# h* ^' [  d9 n6 A
  1. <div id="app">5 t0 z' ^1 b, V+ Z  }2 A, D
  2.   <p>input 元素:</p>' Z+ y5 a2 H& N' n
  3.   <input v-model="message" placeholder="编辑我……"># {+ D) o" H7 j  {
  4.   <p>消息是: {{ message }}</p>. s4 T- a( r8 {2 H3 V7 w
  5.    
    - X# Y7 {' U6 R( @- ?' i; m
  6.   <p>textarea 元素:</p>
    0 H- L& n# p) f$ W" A' {! I, z1 p2 ]
  7.   <p style="white-space: pre">{{ message2 }}</p>1 z: P/ k1 |7 W2 e4 c
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>2 t* v4 ^" ?1 K9 s1 v( q& ~
  9. </div>
    9 g" b/ i% x% d& [

  10. ! a: ^9 D1 j, P; F
  11. <script>& j/ s# \0 }! a4 c+ P* J- ~
  12. new Vue({
    . Z" O2 F" ]! Q4 U5 p
  13.   el: '#app',9 I; B# S. k$ J+ s3 B
  14.   data: {
    ! k, l7 |+ N- U/ o) r# u; ]' V, L
  15.     message: 'Runoob',! @' l+ a" {  @# j# V
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'  U6 B  |5 t8 h# m* m7 A
  17.   }
    1 r% `$ r/ \1 Y7 Z2 ]/ \, V
  18. })
    / V) e; s, S  |# j! z3 [/ O
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
) E, P/ i1 J6 X  u2 D( x1 H
  1. <div id="app">
    $ v2 _9 H" s' {* T8 y- c* y# q
  2.   <p>单个复选框:</p>! H, Z& I' S/ p. M5 F
  3.   <input type="checkbox" id="checkbox" v-model="checked">* i9 c* X- i2 x
  4.   <label for="checkbox">{{ checked }}</label>
    5 t1 W8 h. ~8 x0 g& C
  5.    
    ! c4 p" w4 Q+ \3 Y% a; a
  6.   <p>多个复选框:</p>
    5 ~4 W9 u& {, ]! E
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">0 a( W9 J3 M4 e6 P2 u8 q2 C& z: b
  8.   <label for="runoob">Runoob</label># P) c0 G$ \5 T6 z1 H* O
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">! s& J0 B# [9 D' M* Z. N  x
  10.   <label for="google">Google</label>) y6 q- P- [& ]' ~$ _
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">: t) c! h9 J0 [. `( s! U" o
  12.   <label for="taobao">taobao</label>
      g4 ?+ w/ [8 }) [
  13.   <br>: Z6 u' b" W3 B) G2 ?6 {! X
  14.   <span>选择的值为: {{ checkedNames }}</span>2 y6 N# N# P) H: L& H6 K
  15. </div>, @% p8 E- L% e6 N* G
  16. ) M8 |' [7 h/ K% [) ~
  17. <script>/ J7 u8 H, P3 n: U
  18. new Vue({
    ' W8 }, T8 r7 |8 @+ o# @
  19.   el: '#app',+ S( f& X; ]8 x: s- W% m
  20.   data: {
    1 |. Q% H# r) j$ {- Z! Y
  21.     checked : false,
    2 K/ f5 K; \. d* G7 {0 _
  22.     checkedNames: []
    % _$ b" [8 ]1 k& @
  23.   }" J2 e' d/ T: O2 A
  24. })
    8 w, [5 @: d. C
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮# C# X7 _6 [' \  x4 v" W
  1. <div id="app">! G8 T. j' S% D2 B5 h
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">" ?8 p' D- @* ^  v, Z; |, p
  3.   <label for="runoob">Runoob</label>6 U& Z+ Z4 U4 r, U+ H& I: T
  4.   <br>9 u2 c, {" Y2 B2 ?
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    2 j9 W1 g0 w8 X0 B* `
  6.   <label for="google">Google</label>
    ; H7 H6 X" v; [+ F5 O' |
  7.   <br>
    " Y- q+ t9 s0 J8 N; i; f
  8.   <span>选中值为: {{ picked }}</span>
      ?8 H! R, W* [# v  }) Y/ j
  9. </div>
    - j7 C( r1 G& f/ `+ b) Y
  10. 1 W- Y7 s7 |- R# ^
  11. <script>
    9 _( h1 \( I( _
  12. new Vue({
    , l' d2 K6 i: X( }8 M
  13.   el: '#app',
    , U/ `. O, {& v; k9 |- j5 T
  14.   data: {
    ! M0 E: G  n' I) Z& B
  15.     picked : 'Runoob'& W. b2 q7 l; U- p1 s
  16.   }: O9 _% m8 F+ E7 l2 _( p$ O
  17. })
    9 u  O5 \3 L6 ?) U) y
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select7 s. G' }% h& o, S% Z: J! O' ^
  1. <div id="app">; l9 R% M& o; |+ E
  2.   <select v-model="selected" name="fruit">
    0 @: q9 X! ~) T! j
  3.     <option value="">选择一个网站</option>
    " _3 ^# k9 k0 |, V
  4.     <option value="www.runoob.com">Runoob</option>) s  c* E& [: y" B
  5.     <option value="www.google.com">Google</option>* b" T; A7 r. \! e
  6.   </select>
    ) @+ u; p% O. y2 e

  7. ! v, L+ |! v+ T/ Z5 _: C
  8.   <div id="output">* X* w/ q! r, M, p- M( e& Z2 ?
  9.       选择的网站是: {{selected}}
    ! G" {9 p( G' d# t" A1 b) U
  10.   </div>8 m8 K4 n5 T' }# I! x4 j* Q6 K
  11. </div>5 l, }; Y$ `2 P$ i0 O* i

  12. : a: `3 y/ q, k& A
  13. <script>( U" `  S, ~" s
  14. new Vue({- ~) S# ^7 h7 N2 ^# a- s( G
  15.   el: '#app',
    . ~' v3 L2 _+ [
  16.   data: {
    . p9 {' e( n7 s; c
  17.     selected: '' 3 T: A' w5 s6 W
  18.   }
    ! y1 B+ o9 d# B0 r, B. R
  19. })1 a* B$ ^& a9 y5 G
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    1 M! {9 Y- D4 c1 i' e/ {
  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({
    % q/ B+ u/ Y# _; \2 n/ D: I* b5 @
  2.     el: '#app',' t! {+ Q" G# t2 r3 m6 q
  3.     data: {% y% G9 L$ ?* @+ h
  4.         checked: false,
    , ~5 u3 z* Y" u+ ~0 d- |. d
  5.         checkedNames: [],
    6 s! a6 u2 ^! C6 t- a
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    # ?: B3 B# N" [" B) ~0 B
  7.     },) q- S  p0 D  \0 O
  8.     methods: {& W) ^% U' b! }" F/ q
  9.         changeAllChecked: function() {- y& C! @" j$ O, w" k0 m
  10.             if (this.checked) {7 w0 {* U* V' {3 f/ ~9 @0 h
  11.                 this.checkedNames = this.checkedArr0 b; e( y. ^+ i% m" J
  12.             } else {8 z' g/ n" v5 Y8 p
  13.                 this.checkedNames = []; l$ {* V( S+ U* [2 o
  14.             }
    . y3 o: @4 Q. R+ l5 k( D
  15.         }
    0 `4 N: Q; |: v5 `
  16.     },
    ; _" r& T6 {6 v: g4 w( T. a
  17.     watch: {# K3 v5 `1 l$ c5 @
  18.         "checkedNames": function() {% D& `# k! [) c; d8 F
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    . a3 C0 }6 ^& g' h5 E  U
  20.                 this.checked = true
    . p- v3 p0 S* j7 d0 S- ~
  21.             } else {
    - b" \7 s+ Q6 i$ t$ A% j' s& n
  22.                 this.checked = false
    * e! E4 f3 A# h
  23.             }' ~7 `* `* O4 T* B
  24.         }
      k( P" j# ]' ^0 ^. }' P: J
  25.     }
    1 U, [$ }/ H6 w$ l2 P0 M- D* ~
  26. })
复制代码

/ o: w) a: q, `5 f+ B
6 `1 [$ q) p  E* o; B
9 O: o1 q5 [% u5 k# A: d' |
2 e+ E* h/ |7 H9 |3 g  u5 Q. e/ a4 \/ q; Z% L3 g

' O; F, Q/ I4 J2 e' O1 c+ s+ D2 ]6 _
9 B; a9 w$ T5 d& y7 g' y9 u  V. H2 R: D5 H1 z+ s$ O5 x  q' p: n/ ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:43 , Processed in 0.060402 second(s), 23 queries .

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