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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

2 `4 b0 j$ f, N
  1. <div id="app">
    # C+ I6 L0 S% ?
  2.   <p>input 元素:</p>
    8 @+ C$ }2 Z* K0 q
  3.   <input v-model="message" placeholder="编辑我……">$ H1 H: v& c- _
  4.   <p>消息是: {{ message }}</p>6 y: x0 ?" _2 O2 b' b+ @
  5.     # L% s: `( k8 y. i6 [, q3 q
  6.   <p>textarea 元素:</p>: O- U4 Y0 Z( ^8 G: a; o
  7.   <p style="white-space: pre">{{ message2 }}</p>
    8 M( t0 n; d( r. n5 G
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    2 }7 K1 S6 [, [* w
  9. </div>
    3 W: ]' W' I5 `3 t

  10. 7 A7 D) y! C1 Z/ g' }
  11. <script>- _0 }# I3 e! J7 X8 |8 j
  12. new Vue({
    $ H+ R+ b5 }8 r* u
  13.   el: '#app',
    / W' H7 A4 v7 p) z
  14.   data: {
    9 E( `0 }7 A8 I8 T1 d
  15.     message: 'Runoob',
    - I* M+ I+ X# \& p/ `
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'2 B6 p& c( l7 ~7 Z
  17.   }
    + t4 d9 `7 ^9 W7 E5 T* c- s) V0 Q! ]
  18. })/ t$ k) d" i7 n9 n$ F1 Z: J
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

. R" D* S& ?9 f
  1. <div id="app">4 j0 i2 x* [$ f. N- E
  2.   <p>单个复选框:</p>2 n0 C4 B. {9 s% B+ {5 n
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    5 b7 |" U) k# i
  4.   <label for="checkbox">{{ checked }}</label>
    ' [* U  f8 O& Z& T8 s7 b; ?# W
  5.    
    # c* P. C% H" q) W" I  }! A
  6.   <p>多个复选框:</p>2 I6 i$ S3 I8 a( G
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">, X( v/ f- i! s3 e" T
  8.   <label for="runoob">Runoob</label>& o! K  p+ v4 f4 @' ~
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    " j0 I7 t+ q  N# @) F2 r
  10.   <label for="google">Google</label>
    9 h4 ^$ `8 s/ N. O" s& \2 p2 C- @
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    ( L3 l- X$ D4 |: {  }6 H4 G  `0 j
  12.   <label for="taobao">taobao</label>
    , w+ q" m2 o+ }. i9 D
  13.   <br>
    6 L# c9 H- Q- u" X
  14.   <span>选择的值为: {{ checkedNames }}</span>
    3 i  r+ a0 W6 [+ [. _
  15. </div>
    3 ?! p9 J, L/ i' I! h
  16. ' p3 ?+ ^, r4 b& B5 j7 @. [0 @9 u
  17. <script>
    5 c+ ^2 Z% R9 h; `- k8 ~, W3 t
  18. new Vue({; g& J" _  M) k& Y5 f$ F6 X+ n
  19.   el: '#app',* |1 }3 b, G/ a( R1 q4 [4 Z
  20.   data: {6 D2 E) ^+ @( a
  21.     checked : false,
    # |) L7 X6 }* l/ X4 X
  22.     checkedNames: []0 A+ |8 [' M" L$ w, ?- F. F8 F) O
  23.   }
    7 j$ U9 u+ Y) s' ]
  24. })
    % k& I8 _( l: C8 a3 S
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
. B3 `+ |& v' U7 `
  1. <div id="app">
    ) \  C4 _' p1 T2 E. k8 }* m1 @5 W9 p0 j
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    1 ~) N0 M/ b+ C: D3 K( e
  3.   <label for="runoob">Runoob</label>
    6 d/ `: Y; w) g. {& X1 Q, g$ d" e
  4.   <br>
    & g: N9 R# n3 g1 m* G
  5.   <input type="radio" id="google" value="Google" v-model="picked">  m1 K% c6 X) s5 J, U9 w1 Y
  6.   <label for="google">Google</label>
    ! P6 `$ X+ K/ R1 G& t9 ^* S) I
  7.   <br>. N2 m1 u3 U! ^4 [8 @: _
  8.   <span>选中值为: {{ picked }}</span>
    8 O1 W) U3 b) I) c4 A# n/ {2 J
  9. </div>
    ! K8 x8 N- w# _9 S8 e9 T" @) v' L$ L
  10.   D4 M, J. Y* Q/ B
  11. <script>) o$ i( g+ n/ C) g2 I6 H
  12. new Vue({
    8 K/ Z- a) T  h2 b
  13.   el: '#app',
    + L/ ~2 R# t' u9 R3 B. J% }
  14.   data: {
    % b4 |; q1 s$ p; ?" ]
  15.     picked : 'Runoob'
    5 b4 Y7 ~( Z4 e! v+ d& L$ G
  16.   }1 E7 b" y( f( b7 ~% @
  17. }): G* O5 T" a0 `# s
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
7 \, g8 D. Y$ f$ F% D) K! c
  1. <div id="app">' n2 q3 H3 y) ~6 f* ]
  2.   <select v-model="selected" name="fruit"># m( {5 ~2 \! B$ U8 o
  3.     <option value="">选择一个网站</option>+ M- s( C4 ~$ V3 `$ Q$ q
  4.     <option value="www.runoob.com">Runoob</option>
    # t3 k  \+ {" b) L2 Z4 x; \7 ]
  5.     <option value="www.google.com">Google</option>
    # `, q. _$ E; P% G- y  |8 i3 x
  6.   </select>, j1 F, P$ ^, W' d) U
  7. % v9 X+ u( U) F$ D) Q$ G9 l
  8.   <div id="output">
    ) u/ m5 C5 V' z/ r8 O( S
  9.       选择的网站是: {{selected}}
    3 E1 M; z" x/ [1 m; }. F. M4 L
  10.   </div>
    ' o/ P9 _5 E! }. l
  11. </div>
    2 ^" H0 E* W* ]# Z$ ~( L; Z
  12. + r8 U; w  @7 C9 V: o2 j
  13. <script>
    / E3 Z! _2 q) I  q* N
  14. new Vue({
    " f6 r! y& y) I& m: b' P1 S
  15.   el: '#app',
    2 |4 C; ~& n* d
  16.   data: {
    2 s) V5 O+ x! I! o
  17.     selected: ''
    - w) d% ]$ W" ?  y0 c' S: u/ u# r2 H
  18.   }
    " r5 K4 }. V  ?! e$ B+ h
  19. })
    7 D6 H+ @& R3 r; s. y9 S
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    ; L& |) A. \; W$ d; s( b
  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({
    . t2 b0 I" N0 u# L% U
  2.     el: '#app',
    , a9 R8 v! T5 Q! x1 x
  3.     data: {( `# x+ I  B, X! r
  4.         checked: false,
    6 ^: Y+ ]  `0 n
  5.         checkedNames: [],
    & S9 x3 t6 Z: k. G* U% G
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    # O; F0 G" i/ q! v; X) ^
  7.     },
    ' V% S, t' m" o6 G1 G! n
  8.     methods: {
    " g3 l# @* M8 n, c% u0 W" f, A
  9.         changeAllChecked: function() {8 K3 l2 R4 D5 @* L. z! L3 a- v8 J5 ?
  10.             if (this.checked) {7 Y, f: c7 l& I/ i9 n. B! H
  11.                 this.checkedNames = this.checkedArr  q6 r( x  {$ O
  12.             } else {
    # f* H6 P2 L; [: x2 B0 I
  13.                 this.checkedNames = []( n% q' W$ C5 W) c. V
  14.             }+ A9 X5 M( K% P: }4 O' a& L
  15.         }
    , p# V2 z, D. N- _* e
  16.     },
    * ~5 j1 `) D" v: h  z: e9 u4 D
  17.     watch: {
    " h/ n7 z4 u" N6 p. p) V
  18.         "checkedNames": function() {
    / S" m8 k  |* t' U5 y$ S9 e
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    - u. k" c2 w0 k: R0 l
  20.                 this.checked = true3 p# m  D4 t3 U- O: j$ |& ~5 ^& t
  21.             } else {3 p% n/ W$ {$ I- }' R+ V
  22.                 this.checked = false
    * r: `1 p% t! n5 Q( t3 }7 m
  23.             }
    0 ?% }' l: z4 u. `9 @1 l( _
  24.         }5 W' b5 C4 Q8 o3 A
  25.     }) r" C" P- Y( |' \9 ]
  26. })
复制代码

6 L! [, @8 z! ]  [, S
" U  @8 q4 }( U( C4 p6 u& p" S* X6 O/ t' T9 a, Q
* A$ g  {& h# w' o& R2 `0 E& x

! U- w  i+ B1 p* O; Q" b6 @% A2 U% V4 M9 ?& r

3 O# a7 h- M0 A1 O- z2 R2 B8 D
5 x* B( v- G, A/ Z9 Q; k2 T! ]+ n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-30 13:34 , Processed in 0.155133 second(s), 25 queries .

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