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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

$ c  Z$ O) x3 e- B% x5 Q
  1. <div id="app">
    2 I1 [2 C! X+ ~2 E0 t3 a
  2.   <p>input 元素:</p>4 }/ |8 x3 Y& |; S0 x; Y& z
  3.   <input v-model="message" placeholder="编辑我……">  ?1 m& k: J6 ?$ {! w/ I5 O
  4.   <p>消息是: {{ message }}</p>* m; v5 g, y6 M
  5.     3 T5 X/ M, ^: \3 D
  6.   <p>textarea 元素:</p>7 a: l. u0 Z; J4 R5 D- y
  7.   <p style="white-space: pre">{{ message2 }}</p>. T/ u: Q2 |! b1 d: l3 T1 I
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>. G( c6 H6 i9 v5 N/ `/ `
  9. </div>, F* t- i/ B+ s, Y. K  O! h

  10. 6 l) c& c& ?2 c+ T( O3 k
  11. <script>
      {' S' T( h( f+ @$ |, ^9 O
  12. new Vue({
    & }9 ~2 ~2 \2 l) d$ a2 ^
  13.   el: '#app',
    ; t, q3 V. I  V1 C# [4 @
  14.   data: {
    7 N# ], S- H$ {# }
  15.     message: 'Runoob',
    ) r8 `' x0 z. i$ m
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'3 T6 x( s8 t' m( |2 x" l) j6 }( h& P
  17.   }
    ; k$ m5 @$ C- p& j. g* G
  18. })7 t5 w$ }, l' |. s$ @7 z
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

$ F) ^5 M8 @8 {2 @
  1. <div id="app">
    8 j: ?: ^) t4 T7 s+ B
  2.   <p>单个复选框:</p>! f5 A9 N: B8 g; ?( E
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    2 n7 [8 Z2 E5 J
  4.   <label for="checkbox">{{ checked }}</label>
    4 ]! \, W( M6 }! x) Z6 x
  5.     % X% G8 h& d7 ]. Y' m) o1 Q
  6.   <p>多个复选框:</p>- Y9 f- {3 g, u5 L, I
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">: D( N# {9 i1 D1 E9 U4 {
  8.   <label for="runoob">Runoob</label>0 ^* E% |/ K" ~8 `# S, O2 [1 L
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">4 H- k8 n+ n8 b+ K$ S9 h& S, W
  10.   <label for="google">Google</label>
    0 e  G) Y' V& I' g, M7 A' ^
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">0 ?- K7 m# M) A) e, u; K
  12.   <label for="taobao">taobao</label>+ G& }# `9 A, \  B$ C$ Q4 G% u
  13.   <br>* v- J7 O1 l* x, J7 @# t
  14.   <span>选择的值为: {{ checkedNames }}</span>
    2 G& U, |. s1 s6 y' s' m
  15. </div>6 e$ f5 A( |# g; S% s

  16. 6 Z6 F3 D3 c' l4 y
  17. <script>  t) z: P2 Z7 }
  18. new Vue({3 x: w" E; s$ V6 W( ?- z: X( ^$ q
  19.   el: '#app',$ D; m8 f9 m$ m( f6 d
  20.   data: {- d2 A! e9 g' I- R5 v9 I8 f
  21.     checked : false,  G4 X1 H. r; V/ t
  22.     checkedNames: []
    $ t( v+ B9 c4 R9 _% S. |: n
  23.   }
    - p5 O9 b4 l  e0 j( P# t
  24. })
    ; `9 w  U1 V' K: b5 a5 @
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
3 d) I# k0 y$ v- z
  1. <div id="app">% P4 n+ l- w+ e; |1 G
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    6 w% T3 S# u6 E8 U5 B
  3.   <label for="runoob">Runoob</label>; G( [3 G' n" k; C
  4.   <br>
      |5 l; A7 Q+ f2 L* A7 r1 Y. C
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    / }( k# h1 M) B) U- S2 }
  6.   <label for="google">Google</label>9 u( W9 N! x* @: S0 O9 \& r0 w/ t
  7.   <br>
    , x9 x4 C" u) E2 m0 M8 X) I
  8.   <span>选中值为: {{ picked }}</span>3 _; c- b2 d* K* Q/ Q, v
  9. </div>
    ( o* R3 ?4 @, n7 j; |
  10. 3 \+ K4 V, O: X
  11. <script>& K: }$ x) x6 @  n; z6 T" s' T
  12. new Vue({
    * Q8 H' x: X0 S
  13.   el: '#app',. u2 F+ J1 v8 q  w) p& H
  14.   data: {1 i" }0 O( }" Q, C7 x( c2 p/ g- H
  15.     picked : 'Runoob'8 C3 P5 q1 l, |/ |* _; N
  16.   }& \. i2 ?/ J9 \
  17. })$ Y! \8 M2 V# `8 D
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select( x% l2 |$ [' t$ o1 r* S# C
  1. <div id="app">
    & D% i  x8 N% Y+ u, n
  2.   <select v-model="selected" name="fruit">: ^4 [7 S% e' L5 ^( f3 T
  3.     <option value="">选择一个网站</option>
    ; J! Z& [' T$ N4 E7 c9 \
  4.     <option value="www.runoob.com">Runoob</option>4 Z  `& {( A% w7 t+ ]: a3 @, O0 }& T
  5.     <option value="www.google.com">Google</option>/ B: Z7 I7 N% Y8 b! ?
  6.   </select>  F$ d# n6 Y/ R+ w+ b2 t0 u, ]

  7. 2 X3 x6 i( _6 }
  8.   <div id="output"># I# q+ I: |' @) K- Z: _
  9.       选择的网站是: {{selected}}: I5 [8 E" a4 X" ~/ L0 J$ t* N
  10.   </div>7 k, I' ]- J8 d% W; N
  11. </div>
    - @" W/ T* }9 X& z4 A" i! y

  12. ! V1 ]' H, M+ V/ z/ F
  13. <script>: B' K4 z' f5 v: r
  14. new Vue({
    # ]" J  e9 O" B8 ~" ?8 ?& A
  15.   el: '#app',7 H6 f4 g8 k' W6 h! Q1 _3 [
  16.   data: {4 B& y/ E3 C9 U# I$ @+ D
  17.     selected: '' : `. M, p% r: b' o6 [; ?
  18.   }! b7 k- Q1 K* A1 ?' K0 {
  19. })
    7 z' w2 K7 U! _: n. k: t; h
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    4 M, f3 H8 F9 v7 |4 v# L# 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# n" t1 n; I% S+ a5 x3 E- F; J7 R
  2.     el: '#app',# N, M' ^: l7 O5 Q+ b3 y
  3.     data: {
    - i: ^- [3 C# B7 l
  4.         checked: false,( [" p" Y  }3 q% a4 e( a3 V
  5.         checkedNames: [],: h7 C/ K+ |9 k- x
  6.         checkedArr: ["Runoob", "Taobao", "Google"]( c. d8 G7 N& e& q% e  [
  7.     },
    1 ~2 E2 A! j0 H, b! S3 U; i
  8.     methods: {
      |2 y! t' j$ K9 Y
  9.         changeAllChecked: function() {
    . x! A& E/ {% C/ P0 Y% H- J
  10.             if (this.checked) {. R% w' F6 I* e# ]4 `1 S
  11.                 this.checkedNames = this.checkedArr7 H+ @2 y4 t& `- l' k
  12.             } else {
    ! _) H" t0 ~4 o5 Q7 G
  13.                 this.checkedNames = []- Q! I; g: r6 a) V7 B$ M+ W; v8 ~
  14.             }4 V1 p: t" }! A8 s: C* N" T
  15.         }
    # q" ?1 h% N4 ~4 X4 f* N9 p
  16.     },7 [3 r* b% o& y0 [5 J# D* b& Q
  17.     watch: {
      f: R; J, _! ~4 k7 L
  18.         "checkedNames": function() {
    / t# T1 R- T5 ^+ u1 S
  19.             if (this.checkedNames.length == this.checkedArr.length) {+ L2 A$ U! d# f
  20.                 this.checked = true
    & ~! G0 o) U: W: y; L0 x1 p
  21.             } else {
    0 ~3 H! c% r3 n1 `2 Z/ o4 [, s9 N* s
  22.                 this.checked = false
      a1 ?$ b" v6 D
  23.             }
    ! d( {, w/ Z# C. e* n0 r
  24.         }
    2 L  [' Q: h; A, Q$ @4 r
  25.     }+ l" `0 }7 M$ t
  26. })
复制代码

; V6 J$ A& t' J+ i3 \9 k8 V/ S' N; {" _
$ e# I2 F2 U- }9 _9 J, V9 y$ @
1 X( L: }! L  n3 p" w$ w. x0 \0 S& J* Z' n0 X# r( }
% n8 u% L- y) h, V- o
2 b4 K. F! e. K. n0 ?. A1 p) |
3 ?, \7 |' Z7 Q# d5 x& Y7 n1 z* R1 b2 W
( x1 a' e+ N6 J0 ?/ P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 17:19 , Processed in 0.061169 second(s), 22 queries .

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