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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

  s  Z1 m# [% Y0 Q$ f6 T% E: M
  1. <div id="app">
    3 O3 b. _* O. _+ @6 }, z9 J
  2.   <p>input 元素:</p>) W4 P, b6 r2 |7 R& a% r1 K
  3.   <input v-model="message" placeholder="编辑我……">/ o# _- B- b' W, C
  4.   <p>消息是: {{ message }}</p>
    $ z& @, g% P* T% S$ P0 J6 S; l
  5.     2 Y4 i8 l: J/ b5 m$ C- Q- H
  6.   <p>textarea 元素:</p>; X2 c' O- L: K& F$ K9 o7 u
  7.   <p style="white-space: pre">{{ message2 }}</p>5 ~; x2 j) r( V2 y1 L
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    % ~/ ~1 w" o3 J' e1 I
  9. </div>* Q5 \/ l$ d+ }/ [* d  K/ U. |
  10. 7 C: e! Z0 A% i$ L) T& y" M
  11. <script>
    ) r  T) V# c/ W0 h# p
  12. new Vue({, t* ~" R  g4 Z* z; c) g
  13.   el: '#app',9 Y3 e0 Y3 p6 h) ~  U2 A& J" j
  14.   data: {* [8 ?. [( I- O+ |1 N; ?$ H7 W
  15.     message: 'Runoob',: @* h. q7 u+ n' \
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    ! y9 J/ H- a7 l* w. _
  17.   }
    ! {- L9 A" e- R' B5 u# A6 I' m+ S, b
  18. })# u3 y1 S2 M! n! k+ c
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

. F2 x& U" z9 K8 E8 w5 o3 j3 l- r# g% f* P
  1. <div id="app">
    ' Z7 v; h: R3 _, ]
  2.   <p>单个复选框:</p>
    , Z2 S) C* F8 n& d7 c5 t
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    ) f4 n9 d. K# @" E5 e- d, w. ^6 P
  4.   <label for="checkbox">{{ checked }}</label>2 U$ J6 ~* y# Q; F* ?( a1 K
  5.    
    & v* K- U( r0 K1 L* W4 z2 M" C
  6.   <p>多个复选框:</p>/ k6 K5 r0 O( @' F
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">: H6 p0 i5 b! Q5 U
  8.   <label for="runoob">Runoob</label>- F/ i9 N5 L3 c1 J+ Z
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    5 R: X% `3 s% U
  10.   <label for="google">Google</label>
    ) k; ]' A% `2 T) ]5 ]' c) ?
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">+ o% k# v7 W* Q8 A
  12.   <label for="taobao">taobao</label>
    . Q! B3 R0 c& Q6 F/ R0 S% ^4 D
  13.   <br>
    6 w% n- n% ^( }
  14.   <span>选择的值为: {{ checkedNames }}</span>8 O8 Z2 G1 |" P  c& V& Z
  15. </div>
    7 Z2 `" ?! l) v5 c& r

  16. ! {' v" k5 M$ [4 @! D, z
  17. <script>
    # C/ K, F! K0 ]# i' U& |; a, @
  18. new Vue({
    5 z4 t. L0 Z9 R3 ^& T
  19.   el: '#app',
    / f8 t3 l. o: y9 Y5 f6 ~
  20.   data: {
    ( r. B- y4 o4 ~" h5 {/ P' w3 F- j4 N
  21.     checked : false,! T; F" X' J( l$ r3 ~% i0 d
  22.     checkedNames: [], B+ b) h# |% K) ^
  23.   }1 \  ~4 h1 B3 S0 I  Y' ?! J) U% Y# C
  24. })" g$ ?. t1 F4 |  b+ Y4 K% C
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
/ a4 W( M4 T: j. ^# i
  1. <div id="app">+ G3 c# a; U: z; q6 e; U% I7 T! V
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">9 r0 y$ M7 h! c8 J1 s' H
  3.   <label for="runoob">Runoob</label>" E! j. d7 Z$ M! s7 l  n
  4.   <br>, e8 A8 {% b0 S- s9 }. q7 }  s
  5.   <input type="radio" id="google" value="Google" v-model="picked">. E. A9 q! d8 v* v, O/ S
  6.   <label for="google">Google</label>; _1 T4 K! P) H7 t
  7.   <br>- T0 Q+ w$ t7 h7 v2 r9 a( I
  8.   <span>选中值为: {{ picked }}</span>
    - b+ J7 A- X) w2 n# E% ^
  9. </div>
    6 }4 k/ x4 t, T  ]& S( h- b* D

  10. 5 X2 n, M/ ?" o6 n: N! Y
  11. <script>- {# D6 ^. C0 O$ B4 z
  12. new Vue({* H. ?/ x( a" a, [  v& F) b9 v) L
  13.   el: '#app',
    1 c! s9 Y" f8 A: z1 `" N
  14.   data: {
    # W6 f5 f/ ]! p+ |
  15.     picked : 'Runoob'
    1 ~8 I* L0 e; k) S$ L5 ?& c
  16.   }
    0 Z) `+ m, l8 D/ d9 e. U  G3 e
  17. })
    9 [5 A  @3 c! ?
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select' `) D$ g$ M* z6 ~4 G; q
  1. <div id="app">+ j( r% M# k! H) w1 _& ^5 a* t
  2.   <select v-model="selected" name="fruit">
    . C# t/ E+ f9 m% z% x6 Q
  3.     <option value="">选择一个网站</option>2 U& M" j6 S8 z
  4.     <option value="www.runoob.com">Runoob</option>, g- t" R) d4 y4 B& H+ i3 O  B
  5.     <option value="www.google.com">Google</option>
    & C/ \0 L3 O* Y
  6.   </select>
    , a3 ]. Z7 C5 a* a- B' f. ^

  7. * E8 l! O  s% x- Q
  8.   <div id="output">0 J# J0 x1 e/ k/ ]0 f* l9 l
  9.       选择的网站是: {{selected}}- _4 M# ]) `" E% d! v, ]0 S6 J8 p
  10.   </div>- a, C- d2 G' s: s7 T0 A
  11. </div>
    * }: y0 g' h. v- I5 Z7 z
  12. # x9 Y; J; P, Z- p) W7 v2 x
  13. <script>
    1 P1 _6 r: x; K- i
  14. new Vue({+ [" [" c, J0 z+ V) g0 ?/ U1 x
  15.   el: '#app',3 g: q! Z) v7 I! y% v
  16.   data: {
    8 z- F/ x; d) U$ @% ]2 G6 d5 j6 C
  17.     selected: ''
    " L% a1 G) J" T3 t% b5 C8 D0 B" X
  18.   }9 O* T3 R6 v( z+ C/ P) W2 L) X: H& [, y
  19. })
    ' R* b+ c5 S1 X' A. B0 J, g
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    8 Q: g+ k8 S4 d. Y4 W0 m
  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({# E  j5 I; t0 [. d8 ~
  2.     el: '#app',# g$ b* M8 t  B) k" r" e
  3.     data: {' E# O$ \# Y+ l7 W4 ~3 s- h$ F" z
  4.         checked: false,- W2 X' _8 F: O/ k& y
  5.         checkedNames: [],
    # d/ Q" L) }* B; F* d, L: |, t
  6.         checkedArr: ["Runoob", "Taobao", "Google"]9 T3 o; U0 u/ T, h( D, l
  7.     },9 c+ y  T. N! p; i  X
  8.     methods: {* M1 ^- b: |8 c; n8 N/ O
  9.         changeAllChecked: function() {
    $ A/ e. l; C5 S! _: ]
  10.             if (this.checked) {; h) G: P% f/ }2 k8 f7 g
  11.                 this.checkedNames = this.checkedArr" q5 v* {8 J3 f& i: k: c% o6 M! t
  12.             } else {
    0 P% f1 d8 m1 L6 y2 e: ]. S8 o
  13.                 this.checkedNames = []
    , E% s" z1 G9 u6 t0 s
  14.             }
    . U$ {# w$ i9 {) l* a2 n
  15.         }
    $ I5 c- _( a2 x5 M9 K1 @- @
  16.     },
    ; N8 k# O4 _+ ?& A: }2 m) X, A
  17.     watch: {1 g" K2 Z2 D! @6 }- n) q! K/ ?
  18.         "checkedNames": function() {% h& _0 [* ^+ @% `
  19.             if (this.checkedNames.length == this.checkedArr.length) {8 h9 Q+ S6 r! B, \% Z1 R
  20.                 this.checked = true
    ( K9 G0 ], u7 I1 B
  21.             } else {
    ! j* f5 s' ]. _1 y, e
  22.                 this.checked = false
    , O6 F8 t/ s7 D  s  u7 K
  23.             }
    / Q, }  J0 \. E* y+ p$ n
  24.         }
    ( H* I+ `5 `2 `7 L! Y( E
  25.     }
    5 U4 u& |0 n- f" A5 t: {
  26. })
复制代码

- ]9 z8 A" i$ h3 K- [% L& S  U: H7 c" G! K/ V5 S

' b! [3 D% j$ H9 U% D& H# w0 x8 s6 R
. W1 z+ q# Z( Y  ~. D
6 m# {' h" t% @" P
0 F8 R1 u2 c  z  n2 C* k+ V, v( \0 y8 [( W5 k% F$ p4 H% ]
% w* f# k  e8 P" D+ V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:09 , Processed in 0.060033 second(s), 22 queries .

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