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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
6 E% o! Q1 M" ~0 ]6 U
  1. <div id="app">
      Y+ [8 e) T3 `, }. B
  2.   <p>input 元素:</p>
    - S2 |6 \9 l# |
  3.   <input v-model="message" placeholder="编辑我……">
    9 S) v5 t7 |4 k& u/ @  T- j' a7 r
  4.   <p>消息是: {{ message }}</p>! b1 u# t- f; D: b
  5.    
    ) O2 q- J6 f( u! f/ v$ v
  6.   <p>textarea 元素:</p>
    % M% C7 I  ]8 D' }$ f6 f
  7.   <p style="white-space: pre">{{ message2 }}</p>
    $ |$ A" d( ^% }( Q/ r
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    5 f% T$ O. s: O4 D5 `" o
  9. </div>$ [9 J8 `- T0 y4 v& A$ o2 M

  10. 3 C- }: J0 e0 s: T0 w
  11. <script>
    ' |; c* e! e  W9 a4 ^
  12. new Vue({9 q' r+ k( W6 Y9 R2 e  `
  13.   el: '#app',, t  G1 s* w; `4 [5 ]7 n
  14.   data: {6 {! K4 u' v1 Q0 C5 O# e2 q
  15.     message: 'Runoob',9 i5 s1 r  q/ z
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    2 I4 z, N. n8 `: @; l, a8 ^3 m
  17.   }
    $ ?( e' N- ^% z; c: {* ~
  18. })5 T+ Q( ~5 O- U% u
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
' ?2 Q$ n4 {! ?, n$ v; V
  1. <div id="app">
    0 V4 Y0 y! ~+ B; L4 ?7 m5 V
  2.   <p>单个复选框:</p>' U) q5 N4 `) [1 w3 _8 w0 ?3 f/ S
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    6 W" G% x4 l% }. A4 Q# [
  4.   <label for="checkbox">{{ checked }}</label>
    2 W7 D9 a) [: R$ r- N% b# {
  5.     - T) Q/ N3 n5 ~8 {
  6.   <p>多个复选框:</p>' b% V1 |; K! S5 C
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    ; {6 f% H9 ]! C
  8.   <label for="runoob">Runoob</label>
    % \9 u3 T2 v! D  K& h
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">  c1 b) l/ ^0 u" a# t
  10.   <label for="google">Google</label># Y) g) p6 g9 r" A; U
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    ( M1 x$ H) t  n: q  h
  12.   <label for="taobao">taobao</label>
    2 @- z) w9 w7 P9 M
  13.   <br>0 Z! U8 d4 o5 U( w9 X" T
  14.   <span>选择的值为: {{ checkedNames }}</span>) ?' \, F2 X4 h( q8 c
  15. </div>2 A. B8 \% H5 F) i. m  I
  16. # B" S: ~* g7 H1 p6 f
  17. <script>
    , l- h: W0 A# t- c
  18. new Vue({, y4 y. V5 S: j/ T9 M+ `1 y2 n: f
  19.   el: '#app',
    9 {% V5 p2 X! p: e
  20.   data: {
    , n/ Y% \4 p5 R+ z
  21.     checked : false,7 \8 K9 q1 X5 O& R6 f$ ?' O: C2 c
  22.     checkedNames: []
    9 U! O0 N; l7 @. \
  23.   }+ Z2 z9 T- `$ B& D) G' Z
  24. })
    / G9 V. a  E; }$ r
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
+ K1 V3 n0 q! [. m( \
  1. <div id="app">' P& @9 Y% ~0 n  N& {
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    & w$ S* f/ p% {  {2 y
  3.   <label for="runoob">Runoob</label>& @2 Y9 D5 ]9 @
  4.   <br>
    , Q8 S2 T8 H9 R* _
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    % }3 e: V2 }7 m
  6.   <label for="google">Google</label>
    ' T/ ]3 s6 i/ U+ T! X) M  j8 R4 k
  7.   <br>
    * {9 x0 T% ?( W
  8.   <span>选中值为: {{ picked }}</span>0 V" v( G* g! V) J; Y: q3 k
  9. </div>
    7 [' K( ^7 `) K# \, U* g
  10. ' S# l5 s+ L' u) \
  11. <script>
    . d, p* |3 x9 z( _% K3 B
  12. new Vue({
    " F0 u! c" p& E2 p) E* H6 [. E
  13.   el: '#app',* H5 W* F: y" E2 A
  14.   data: {
    5 f, K, y3 z9 T6 R4 h5 T
  15.     picked : 'Runoob'. K# T" m1 y. W  z( G8 I- G
  16.   }" m; B% A0 W5 W: y
  17. })9 C" t4 F; Q6 G. f$ n
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
! i+ i. b8 K; l  y
  1. <div id="app">) `! R( |- z$ _( f7 @! ]
  2.   <select v-model="selected" name="fruit">5 G8 Z+ f) }$ J3 [7 K& f
  3.     <option value="">选择一个网站</option>
    1 b6 @8 ]; e, k5 w: d; }+ p- C; w
  4.     <option value="www.runoob.com">Runoob</option>5 m' a, ]2 A6 ]. A( v1 H: ^8 F
  5.     <option value="www.google.com">Google</option>
    ( j1 J# J" d% ^
  6.   </select>
    - \; w& n( s' x% K% ?: T

  7. / Y5 K# m; w3 j/ G9 l
  8.   <div id="output">
    : P) Q# T5 ]( U. a* T
  9.       选择的网站是: {{selected}}
    : w4 M" V+ [& i. s* ?
  10.   </div># d- a" y, Q- w9 i- r5 z, c
  11. </div>
    8 I" k  z( `9 P& f
  12. / U, ^; ?3 O2 Z( [: e! z, r, q3 {
  13. <script>& c! y6 F9 L: j- T4 O# `1 o
  14. new Vue({
    4 W0 {. ?8 j6 V
  15.   el: '#app',
    , `. e  X. f) l$ e& w0 j
  16.   data: {
    6 P  ^) ?6 i2 O/ \7 H5 k
  17.     selected: ''
    ) @7 F1 R! G! Y$ o2 D$ |- z& c- s
  18.   }& y. K5 B' `7 R2 P& b% d& P- I
  19. })
    % P2 W/ A: K% D% C3 q
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    , [. A+ m3 W. J, }5 g( l" i
  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({
    ! G  S, T0 t7 b
  2.     el: '#app',
    . Q- A: t3 G+ u
  3.     data: {
    - A; s5 a# n, ^
  4.         checked: false,
    + ]: U0 s. c7 ?+ n& |/ R
  5.         checkedNames: [],
    ) y, l6 ~+ N. q5 W+ K
  6.         checkedArr: ["Runoob", "Taobao", "Google"]8 ~3 A* u- ~' @! W& p% u7 H. i0 T
  7.     },6 w* ]( h: Y" Z6 V% ?1 s
  8.     methods: {( w2 X, Y8 Y' P. e
  9.         changeAllChecked: function() {: I6 p7 X& Y1 w+ L
  10.             if (this.checked) {
    2 A3 H" N3 y4 @; H7 P  _
  11.                 this.checkedNames = this.checkedArr
    4 r1 k5 l5 y' W8 @& b# m" [
  12.             } else {
    0 x/ y3 d4 D; R4 g5 Y
  13.                 this.checkedNames = []
    9 C2 h  T+ y0 a  Z
  14.             }
    ) A0 q- u0 A3 L
  15.         }
    $ M8 E3 G  H- y' j* @
  16.     },/ ^" }0 O7 {$ b' b: K$ \
  17.     watch: {& x* r: Z9 p7 {
  18.         "checkedNames": function() {
    ; ?! N, D' z/ P  ]5 Y; O: u
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    ( V) T( e; h$ x+ y" i
  20.                 this.checked = true$ F/ V1 _" x' q" o* i# K4 Q: ^  d
  21.             } else {! J; {  A6 ^# T2 ?
  22.                 this.checked = false3 J+ u7 m* {. R4 t* P0 t' o3 D
  23.             }! j8 Z9 T$ G8 f( z& \. |2 [4 |
  24.         }0 k" z2 i) G( T! ]
  25.     }
    $ O& C+ R& e" o) z3 a
  26. })
复制代码

' h# o6 U. ?- ?$ ?8 t
/ O: N* j: P) Q
3 F/ B3 n% x4 L4 _' j" g/ j/ y1 G9 r% g8 K; f' Y2 r+ K- m
5 s4 _$ @3 A& w! }" a! ^
1 Y2 u, y8 r% X2 Z# V9 x' ^

  Z3 s* u8 |, k
; }* Q' F/ G% z% p3 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-7 10:15 , Processed in 0.129654 second(s), 22 queries .

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