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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
) J4 G& b# l9 m7 ]% m4 {- n/ x
  1. <div id="app">
    ; M* s; w, x. r( F* S$ V6 e
  2.   <p>input 元素:</p>( `" O$ `4 R4 q( h6 g) T$ t
  3.   <input v-model="message" placeholder="编辑我……">, R+ L+ |/ E1 m# C6 Q; B
  4.   <p>消息是: {{ message }}</p>$ k  Z* y: Z" `0 x# |8 B
  5.    
    # x& D  d5 K. c* r7 |) Q9 \
  6.   <p>textarea 元素:</p>, W- S! Y0 \1 M) f; q$ K% g
  7.   <p style="white-space: pre">{{ message2 }}</p>9 U  G( g. [) P! r  \
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>' Y  z% ~5 ~3 {1 V3 _$ ]+ ?
  9. </div>
      `' ]4 c8 M, o8 z0 b- o
  10. ' j% h  S/ y& N8 c/ ]. u
  11. <script>5 k: V3 u5 c- y( A6 k8 c
  12. new Vue({
    7 t7 v3 `( V9 Q+ s" t
  13.   el: '#app',+ e) e& Z: @6 U1 b+ \6 M2 H
  14.   data: {. O( t. G8 Z/ v, X. a* q: L& ?: d; b
  15.     message: 'Runoob',7 K$ o  ~6 e& u6 F
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'- }" X- h' G. S9 T* c
  17.   }, D2 M: B5 ~  O2 T
  18. })& B" f0 u0 M0 _, M
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
- Y/ _( ]0 n! V: j. N# \
  1. <div id="app">5 b! k0 t) c9 a' W: ^2 z
  2.   <p>单个复选框:</p>
    $ g: P' p+ Z0 |
  3.   <input type="checkbox" id="checkbox" v-model="checked">" q  N2 a% k; f
  4.   <label for="checkbox">{{ checked }}</label># Y# i; u( y' w% @2 H
  5.    
    3 Y, e2 j5 X+ H! E  H1 z  z
  6.   <p>多个复选框:</p>
    5 R" o# x' x/ v0 [" j4 \
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">. j6 K- t* r% y$ c
  8.   <label for="runoob">Runoob</label>" Y3 n5 s0 G( l) s
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    9 A4 Q' `5 I) r& I6 j" B2 V! F% G
  10.   <label for="google">Google</label>
      x% k# ~4 t6 Q
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    " [" I& g) t. r# V9 W' H
  12.   <label for="taobao">taobao</label>
    " r, v9 z1 U; r. E+ }
  13.   <br>
    - a1 |  o" L9 c5 A' H+ }: R
  14.   <span>选择的值为: {{ checkedNames }}</span>
    : ?6 L8 w! M- R: M* L, H# V
  15. </div>( f. c4 p& C& Z1 P+ d
  16. 5 v8 f7 B0 V$ z- ]
  17. <script>8 V4 e- G7 k* h/ z' `
  18. new Vue({* O4 p$ ?7 _* _  U, x+ e
  19.   el: '#app',( G  O1 v: w+ r: D. F# Z& o
  20.   data: {
    2 P1 {/ W( r- e, K7 e
  21.     checked : false,7 E$ L! ^6 J' C6 V/ v/ t
  22.     checkedNames: []( l' y: e$ ?( R* b$ H
  23.   }5 {' J! A) \2 I. T% R
  24. })
    . d  t. t$ V" g# D8 V1 E8 W
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
8 ^5 {( q; Z. Q
  1. <div id="app">
    ; O' ?# L, p7 h  f) E, Q  f: s
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    " {+ J0 ]4 e! S, ]/ f$ r8 j: g
  3.   <label for="runoob">Runoob</label>/ U0 Y/ i& k$ a( J% k/ I8 I2 h
  4.   <br>% F& }8 X) I4 q; n" x9 D
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    6 U; K% C$ b" K) @( A1 W# S2 i  X
  6.   <label for="google">Google</label>: @' W! k8 m8 Y2 @
  7.   <br>
    * Q* J4 |* Z: ^4 X- X0 _1 x% ^
  8.   <span>选中值为: {{ picked }}</span>' l: H: G& d: ?8 F; h7 l/ g
  9. </div>! R, j3 t# O1 `4 B1 B6 ?* o2 P
  10. 6 A* l* y2 U* t
  11. <script>
    9 A& i1 ]9 S0 K7 m5 L" [6 H" s4 A
  12. new Vue({
    8 x* `1 w7 E" }: C2 Y
  13.   el: '#app',7 ~4 A* ~4 a& ]0 o2 |
  14.   data: {7 @) z# b' \" g
  15.     picked : 'Runoob'
    8 L9 F& |2 T# ?( s/ J
  16.   }
    & Q7 B3 E0 O0 {
  17. })+ E/ c% Y/ L- R
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
* S; l' z9 N+ l2 H9 a" M! }
  1. <div id="app">6 x$ K! s: d$ V+ O) b  @0 L% W
  2.   <select v-model="selected" name="fruit">
    0 Q8 r& W% L3 ?/ K) q( z, }( Y: Y
  3.     <option value="">选择一个网站</option>
    ) Y- D& D7 f, g
  4.     <option value="www.runoob.com">Runoob</option>
    ) l* S, `0 s! a% a7 Q
  5.     <option value="www.google.com">Google</option>
    4 j+ E* i" b) Z& w5 s
  6.   </select>
    . ?. g9 a# H. `0 N& p

  7. 5 z/ b; V. p( [, q* C& w- R
  8.   <div id="output">1 |8 z, Z7 q% B8 @% j6 v# }. U4 q
  9.       选择的网站是: {{selected}}
    + t2 A2 W% i6 @
  10.   </div>; k4 c8 h' k6 [8 W' b2 r5 _0 r& p
  11. </div>
    . j% L7 e8 c, f* X  J8 a4 b
  12. + i: k! B! a% L' T2 D
  13. <script>/ i1 g/ @1 B* @6 P" C
  14. new Vue({
      l, ]7 L- d+ @" g) M
  15.   el: '#app',
    0 v6 j" d7 l9 T" M
  16.   data: {2 G$ l0 {6 q0 ]+ l% e6 m1 y
  17.     selected: ''
    . ~: \5 r- ^' K8 ~6 ^
  18.   }
    3 e: U5 B. K+ G
  19. })
    ) O' J0 f( e) O1 X  I
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 --># f* M- f2 @# t9 I  D6 T
  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({. m9 `  m5 ?. m: _. I8 B& i
  2.     el: '#app',3 M# [- p$ C, U. g% x$ O
  3.     data: {
    3 p1 v( T  T0 V: O- _! I) S
  4.         checked: false,  ?6 Q/ [, ^' C
  5.         checkedNames: [],+ U1 _6 U5 z+ K- O0 t4 r7 ~1 e" m
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    ) d  r) X) W" I/ i: Q) Q5 l
  7.     },. V' [& Z3 a% o/ @5 |0 l5 D/ z
  8.     methods: {
    3 F" w) k: e& l, _2 o
  9.         changeAllChecked: function() {
    : [7 r3 H$ h8 l: G4 u- Z7 P$ e
  10.             if (this.checked) {
    / B' X5 c. k1 v8 p: `$ d; I8 i
  11.                 this.checkedNames = this.checkedArr
    9 J, t, E9 F6 K2 L. H* ]
  12.             } else {
    8 F8 X; J* n. c7 ]
  13.                 this.checkedNames = []  l5 s9 ^1 V' k
  14.             }
    % }: ~( p) v7 m6 S$ p; r, @+ V  n
  15.         }& u+ D9 P+ ]) v
  16.     },
    2 t5 ^$ N. m, f8 W
  17.     watch: {
    $ h1 u- n( r7 m- T5 F  e" E( ?0 J
  18.         "checkedNames": function() {" u' R" k* {, U# B
  19.             if (this.checkedNames.length == this.checkedArr.length) {' E& Y% C( I8 S& N- I
  20.                 this.checked = true. [, c4 T& l  T* k0 [3 {. U
  21.             } else {+ g. |8 i2 J: {
  22.                 this.checked = false
    0 N% a: r! e8 E9 s" Y
  23.             }) |  |# t) t) ?9 |9 q6 e% @
  24.         }
    % b+ f) `+ _7 o1 R: C) x4 m4 l. g
  25.     }
    % |9 Y+ r+ t& C3 B; C0 X
  26. })
复制代码

4 ?+ L6 Q6 b7 t# p
5 H4 N: j3 r5 P* y
5 t; A) g& U: j3 {* c2 E6 B3 c1 Z; b- ~1 `& `$ Y5 s

7 @' H9 O/ [: X9 x: w" D5 Q7 e4 i4 ~
: W- t$ j6 p- ?! i+ l/ p9 @% {9 C

0 t8 I' p* h$ a: |7 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 15:53 , Processed in 0.068851 second(s), 26 queries .

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