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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

0 @% g& D9 p( E. B2 G3 ~6 P9 w
  1. <div id="app">! ^# F+ S/ A/ e. h7 I0 s: z
  2.   <p>input 元素:</p>& v6 Q- G' B0 X, Q: _( a) g
  3.   <input v-model="message" placeholder="编辑我……">  r) o+ o3 W+ _' W$ q
  4.   <p>消息是: {{ message }}</p>; G, R! w  l% C. \$ W
  5.    
    : j$ d7 O; Y! V. M4 {& [1 |3 z7 v
  6.   <p>textarea 元素:</p>9 m& {1 W; A/ h7 K
  7.   <p style="white-space: pre">{{ message2 }}</p>( j& x" ~. ^+ @) n, e; f5 U
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    8 M# C0 N! |" W* Z) D( A
  9. </div>( ]! U& U# Y9 h6 u5 g" u

  10. 6 O; |( |3 D% x1 ?/ ^
  11. <script>
    8 J. D% c4 e( a% a
  12. new Vue({
    , Y3 E4 X* p% x7 O
  13.   el: '#app',
    ) x& @& a( ]( E3 Z9 h; z
  14.   data: {) F/ M5 R, C. q, t
  15.     message: 'Runoob',9 z9 e' r6 d+ F/ J
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    % p8 Q/ Z4 M# b( R
  17.   }
      u' t: C) [* N6 r3 k5 D
  18. }): z# y& e) u) w, L; r/ R* C) K
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

3 x, }( U1 U2 C3 p6 T! T2 K
  1. <div id="app">6 k: y3 U# C# r# l4 v% A
  2.   <p>单个复选框:</p>
      g: _1 j0 A* D  r  ]9 O
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    8 m2 |1 F5 z# Z3 w; ~8 @
  4.   <label for="checkbox">{{ checked }}</label>- }$ U3 y. P! \( J8 `
  5.    
    8 T* m3 [* _- o
  6.   <p>多个复选框:</p>5 K6 x2 s9 K- m
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">! S* }4 m5 `/ \7 J' n
  8.   <label for="runoob">Runoob</label>
    2 o) ?' j! S1 ^( a# x$ a! x
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">) r+ C/ J. j$ }- Y% S
  10.   <label for="google">Google</label>" L4 N" P' f! s( |: G
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">! c' k( I/ z. \0 z& @6 Q: }1 b
  12.   <label for="taobao">taobao</label>. `4 {+ K4 F( f0 H9 g
  13.   <br>
    ) L1 @; I% G" E3 p( P
  14.   <span>选择的值为: {{ checkedNames }}</span>
    / n# X. ?- r) |1 \# z4 [( |% [
  15. </div>( A3 t, y. G0 V5 w

  16. ! A+ T0 j# N3 Y  g2 w
  17. <script>2 N" `. P& o. |; u5 |: i. W) @
  18. new Vue({
    . q" n' k. k, U" Y8 Y
  19.   el: '#app',5 l5 a3 i. z3 Y- `
  20.   data: {* _3 P8 x3 n% c1 x
  21.     checked : false,; ]) c' e/ v2 Q7 x' k& H! l/ @
  22.     checkedNames: []
    " [, A: ?7 W5 N' a- X
  23.   }
    # ^# @6 V+ i) r# H; L8 Z! a5 }9 p
  24. })0 @! e$ h: X7 d; v
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮/ |2 [: H0 V. Y
  1. <div id="app">
    . Q  z1 v2 H  N0 O  E* I- t
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    7 G" X+ G8 I. ?% b
  3.   <label for="runoob">Runoob</label>. Y  [! L) z6 _9 [; H2 r
  4.   <br>
    5 `) y0 h2 D) E7 t5 [8 @( I' O
  5.   <input type="radio" id="google" value="Google" v-model="picked">- B1 w1 r- Q8 L4 k! u' z6 G6 |
  6.   <label for="google">Google</label>
    4 _# X0 v# k  |
  7.   <br>- X  k# U( v+ R/ C$ r7 ~
  8.   <span>选中值为: {{ picked }}</span>  v2 v. R# Q0 P" L* f* h9 f
  9. </div>: @$ _+ Z0 o- I9 t# {

  10. 5 V+ F' U6 B: q& L: I
  11. <script>; k& r* y0 l  J% g
  12. new Vue({) @, [1 ~4 x, M
  13.   el: '#app',
    3 x9 g- s/ r9 l/ m
  14.   data: {
    ( V2 _5 J; k2 Q6 z7 N
  15.     picked : 'Runoob'
    ) N( Y  P9 B, N
  16.   }
    : h( t1 B" K: p0 d! {' F8 t
  17. })
    / T8 B# c4 c) S
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select5 a0 s: M; V3 Y' y! M
  1. <div id="app">
    ! E1 Z8 _$ X0 y+ q2 h( y
  2.   <select v-model="selected" name="fruit">/ S( j1 D  u: b. F* R
  3.     <option value="">选择一个网站</option>4 d. N# ~3 f" \+ j6 Q( j
  4.     <option value="www.runoob.com">Runoob</option>6 c$ S' Y4 `: G/ H& f% h4 N# E
  5.     <option value="www.google.com">Google</option>
    8 M: r0 r2 {. f, O; z3 I
  6.   </select>
    ) K, T8 E' ]0 _- _3 b- [  i! p

  7. 5 p7 k7 y+ r4 b  x2 j+ C2 `+ u
  8.   <div id="output">1 g9 b' q) h3 ~: N7 ^/ g- R: |) g
  9.       选择的网站是: {{selected}}8 a7 C+ ^9 R7 U0 C# P' z; U
  10.   </div>. [9 ?# ]1 s# |: @( \
  11. </div>
    3 }' l* C2 ?" t2 ^: o

  12. + a* g! A! G2 Z8 ~
  13. <script>5 }. j8 ?) t* D. b+ R0 A
  14. new Vue({* P) f& n) \( M
  15.   el: '#app',
    5 ~9 [9 N8 R2 B3 r0 }) G
  16.   data: {0 F) U7 G+ e; L  C
  17.     selected: ''
    8 O  |$ p; Y0 I' g) ]2 ?4 I
  18.   }+ V) `% g" a7 W' y% _$ V; @2 i3 `
  19. })
      n$ y. ~- s8 a1 [- s' P
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    + X, m6 V6 \" U2 h* H
  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({) x7 z( @, l. q1 S! a
  2.     el: '#app',+ Y5 l& }" {" |) T; P
  3.     data: {
    / l8 j7 M, W' O
  4.         checked: false,
    - w  F6 W/ \8 v$ j5 y- C/ ~7 {
  5.         checkedNames: [],3 o: T7 y2 r# \
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    0 G6 Q: ]  h6 O# s. Z# M! r% w
  7.     },
    - {( i4 z  ]/ I! h* I* n) e+ E
  8.     methods: {% _2 @9 w# B* ?) _0 s
  9.         changeAllChecked: function() {
    - x$ {3 Z& h; F' K9 B* _
  10.             if (this.checked) {
    + y1 z( g0 O# f. P$ y- ?. c9 s' S$ j
  11.                 this.checkedNames = this.checkedArr$ e) B6 B  K- \5 K
  12.             } else {8 L6 r" d7 @7 n
  13.                 this.checkedNames = []
    * k7 T7 l9 ]  U* ~
  14.             }
    - w4 r$ E" S# K( O# M
  15.         }; u8 V  F8 ]- C' q, ]0 ~
  16.     },
    9 Q0 h3 s0 q. M) S; b
  17.     watch: {
    2 r0 T, E! K+ z  r  C% h. }
  18.         "checkedNames": function() {6 X' r  x2 ^( D. v
  19.             if (this.checkedNames.length == this.checkedArr.length) {* A; i$ j! J) [
  20.                 this.checked = true/ ^8 R9 v9 z- ^* N, k& j& C& R1 J
  21.             } else {
    4 ~! ~3 O% H& b
  22.                 this.checked = false  r( }5 A% z0 i% ~. K* v' }- `6 N3 E
  23.             }3 N) |. U4 F7 ~. G9 m- b
  24.         }' f7 U8 q$ P5 t3 `, ^, y
  25.     }
    1 }+ p# V* i  N1 @0 P
  26. })
复制代码
6 B% @  r" o3 ]$ _. v5 e, E. o

9 ]$ M# C3 a& Y) I1 R, n6 z' C, T8 R, c, Z& Z
0 V  f  m$ @: l5 V5 \# ]

- r1 i# p( c4 r* X$ J% L2 Q9 P* k, p9 h

/ a: A+ w5 G- K4 J) F- N3 y+ G  z" R( E, t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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