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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

, J4 i$ s+ J: U- V. P- i
  1. <div id="app"># x8 N. s5 F/ \( A4 _$ b* p3 {# S
  2.   <p>input 元素:</p>) h& n2 X3 T( q. S) M$ Y. F1 r
  3.   <input v-model="message" placeholder="编辑我……">! h: u4 z* R) q" O
  4.   <p>消息是: {{ message }}</p>% D8 O. M$ l3 q5 B! W9 K+ {: ^7 V
  5.     ( ^$ ]5 J( N4 k2 T# E' b1 V
  6.   <p>textarea 元素:</p>2 k. `5 R& g' Z3 U0 X
  7.   <p style="white-space: pre">{{ message2 }}</p>
    . H: X" d% y+ N* X% h) n
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    ; U4 x3 a, ?/ y
  9. </div>
    6 l0 p. S1 B8 v

  10. # A; [% B' B& j  X6 |- Q" V8 p
  11. <script>2 K: o8 m8 F4 S- m/ B: W4 o  Q
  12. new Vue({, }$ u, R, z7 H2 y- |- o) Y3 I8 t) u
  13.   el: '#app',
    1 ?) z: Q+ F7 Y/ w
  14.   data: {
    / \: n" T% d0 f. N5 X" c7 f- b4 {  Z
  15.     message: 'Runoob',2 n$ P' j( p0 e5 A* b
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    9 {! x2 e- m* {1 g7 ?
  17.   }
    . {/ ^0 j* ?1 z) M3 `/ ]  [( x
  18. })% z4 O% w8 l$ ?4 A& L  L* N
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

" h9 k$ v3 V6 D# M& j3 l
  1. <div id="app">
    ( f% v$ Z' \& L: W3 n6 Q% T
  2.   <p>单个复选框:</p>
    4 d. o8 k' j' Q# Q* V5 j& O$ ~
  3.   <input type="checkbox" id="checkbox" v-model="checked">8 Q+ A' E3 o& H! t: C1 s
  4.   <label for="checkbox">{{ checked }}</label>  n8 x% E+ x7 @/ A
  5.    
    ; \2 a* `. c0 O% U# Z. m
  6.   <p>多个复选框:</p>
    # A- B) e: Q$ x
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">& k( F/ {. |( {6 P
  8.   <label for="runoob">Runoob</label>
    7 Z5 j$ Q' _4 X. E0 q! u
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">6 R% x0 J9 S2 M. \
  10.   <label for="google">Google</label>  V; _% p) D9 d( J% C( B
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">5 q8 R4 s" T" h; b1 o
  12.   <label for="taobao">taobao</label>' ^, n7 Y) H( m5 G  ~
  13.   <br>
    5 j: d; {  F$ Z+ e
  14.   <span>选择的值为: {{ checkedNames }}</span>$ }; d$ w& P3 x( h2 b& H
  15. </div>- M$ o2 ~& {; ^) L9 R# x$ E9 s( I4 j
  16. 8 @8 j* _# s8 O: i4 Z( O. R5 W
  17. <script>
    % d5 Y8 h+ |1 e# K# ?0 G; l
  18. new Vue({. m( o) G: e( N+ H# x6 [+ P
  19.   el: '#app',' {% Y( r0 [5 }7 K) _  ~6 l* o
  20.   data: {
    8 K, _) g6 R& m" \
  21.     checked : false,
      ^# b4 E* u4 O0 H) n# b' Y# @. n
  22.     checkedNames: []) Y0 T8 T( F' \4 j6 C
  23.   }9 g' f' |( R+ j2 e7 Q5 U& z' j
  24. })$ E6 o& f( `& k
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
+ K: p: \: |$ ^0 G
  1. <div id="app">+ F1 C2 h+ b& r* ^
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    ) ^* C' L$ ~$ I7 o" R6 @$ L% v
  3.   <label for="runoob">Runoob</label>, t, F& D% M' S" l( c
  4.   <br>
    + J& c% w9 @- g6 Y' \1 |
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    ) h8 b7 V& o* E, f: x8 u# E
  6.   <label for="google">Google</label>
    # t$ n/ C  N' K% ~8 K
  7.   <br>% [+ {5 T2 d# \- [% d' S7 R" d
  8.   <span>选中值为: {{ picked }}</span># f3 k6 K6 u  O+ R- u
  9. </div>
    " p, |6 S7 l' g5 ?/ {6 v
  10. 7 M0 Z* j3 P/ x4 y: l) D
  11. <script>
    * w. Q7 w  b; k* y: O; B
  12. new Vue({. D- I) K, Q8 N5 P; W; m
  13.   el: '#app',
    - t  Y: G& S5 s* m+ L
  14.   data: {
    / D, A- b6 ~1 w! `: w; X% b
  15.     picked : 'Runoob'
    - T. q8 d% C0 g  p9 B' @
  16.   }
    3 u$ z& d, R% i3 n
  17. })
    4 v' k* K- E/ J) ^
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select& |' f" f& _  r: p+ {) w4 i
  1. <div id="app">
    - }; {3 M% k" \2 |9 J
  2.   <select v-model="selected" name="fruit">+ v3 Z" v2 X. [
  3.     <option value="">选择一个网站</option>
    : P2 L, S& v1 s, r' A3 m
  4.     <option value="www.runoob.com">Runoob</option>
    ; v# X$ ?9 U( a+ _% b% P
  5.     <option value="www.google.com">Google</option>
    ) {8 b" N' Z: N# r/ \
  6.   </select>
    ; m6 m. u3 k( A
  7. 6 [# M4 b4 w8 q% K
  8.   <div id="output">
    + L# p2 W& D6 c- g- j3 T
  9.       选择的网站是: {{selected}}5 D3 e5 m+ j+ ?: S$ @
  10.   </div>
    " _/ J6 m+ ?. M; o( v1 f
  11. </div>2 {. t3 p% O% B# z0 s* Z

  12. 0 O" c) L8 F* C& o$ Z# f) ^& n
  13. <script>: v- }0 M$ U$ S* x* B" c
  14. new Vue({4 g5 ^4 R6 }$ @0 P- ]! T' i6 l: \
  15.   el: '#app',* x: z. e4 e' }( I' C4 e
  16.   data: {6 U; I3 u8 F& O
  17.     selected: '' 3 c6 ^- y2 _% h  S/ l4 A
  18.   }
    8 c, M/ j5 G, q9 W; b
  19. })
    : [7 F7 m, m' W
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    4 h& i8 T9 Y, @) S0 c6 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({1 h! w4 V- h$ u
  2.     el: '#app',% O: i9 ]7 X; S+ `7 P; Q: E
  3.     data: {! m" J, A6 m- ]2 G2 `) _
  4.         checked: false,( j$ h" g% `+ u4 y  L1 l
  5.         checkedNames: [],
    4 z) v/ {' [. R8 q9 L
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    ' l7 u1 D+ @2 P5 [7 L6 \3 D+ W
  7.     },' F: |0 ^( F: a+ P% m' B
  8.     methods: {6 P) O7 f7 T& y: ^3 G( v3 j& V
  9.         changeAllChecked: function() {
    ! V* u( c5 [1 ]4 B
  10.             if (this.checked) {3 o8 t) h1 V0 E! w/ z$ t
  11.                 this.checkedNames = this.checkedArr5 U0 N# i! h" H' ^- x. e- A
  12.             } else {
    9 J& C. |" q8 ^% U+ X  S$ _
  13.                 this.checkedNames = []
    # r# ^- U/ v! q. H0 k
  14.             }, i) G9 D# o  C0 c, f$ n: a
  15.         }
    # Z1 J) O, E) {) o
  16.     },
    + \* M* f# x8 u2 {' r$ y4 _
  17.     watch: {8 Y, ]1 L  X7 Z6 J
  18.         "checkedNames": function() {) M1 w9 V, a: }- `( ]4 N' e/ U  o
  19.             if (this.checkedNames.length == this.checkedArr.length) {! h; S: U* g  W* j" g
  20.                 this.checked = true
    / \- e) l4 ~6 w6 {
  21.             } else {, T6 q6 }" m& n' _; d5 V! c
  22.                 this.checked = false
    ; x- P9 @6 T1 M+ V1 D
  23.             }
    0 g* m- L0 I1 W5 l% C% O( x
  24.         }, c" c3 D% K+ v% g$ e
  25.     }
    : S- j' ]7 S* h+ z* ~& H
  26. })
复制代码
% R- j' w. Q" w7 h+ \$ l

  L+ [& f" S5 {4 E( Q
% k: l: r) g0 ~. ^/ D( ?) T6 k' {. X3 g  V! D
( F6 _/ c; d8 g& `. o$ c

0 F' j  S0 A- z5 E5 W
& D8 C% \6 w& M7 ?& S
& N% x6 @6 {) j2 M! l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:14 , Processed in 0.072766 second(s), 23 queries .

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