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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

* h2 T$ U6 X: k! f" e; ~
  1. <div id="app">1 ]- I) h7 y; J
  2.   <p>input 元素:</p>( N+ e+ h; s5 y3 I" K  F
  3.   <input v-model="message" placeholder="编辑我……">7 k' @$ _7 {! U- P. n1 P9 [
  4.   <p>消息是: {{ message }}</p>
    ) g4 i4 @7 ?  J1 j" u, S8 A
  5.    
    ! l* ?: a/ }4 ~6 ?$ r! \- L8 d6 T
  6.   <p>textarea 元素:</p>  L9 h& A7 [4 \3 k1 T) M! ?9 M
  7.   <p style="white-space: pre">{{ message2 }}</p>* M+ U: D8 ^; C3 `5 E% j4 s
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>  \/ Z; |9 F6 X
  9. </div>
    6 R+ d: r$ j0 R, Q( \
  10. ! k" N' d+ z* }9 q
  11. <script>
    4 Y8 h: D6 c0 o- Q( B
  12. new Vue({
    4 S+ j. K- k" D
  13.   el: '#app',- p6 e* ]0 k7 s' ^3 v( C0 n( s! ?
  14.   data: {# A# a9 D; q3 _, l9 [
  15.     message: 'Runoob',# {. S0 c( n9 D7 {' j# }. R# d
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    1 t9 L; j* [! e: c: C' g
  17.   }
    % M$ S: g. B2 S& Y& [/ A4 h8 r
  18. })
    . p8 j3 o- C' X, P
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

4 C) o) W3 w9 G- Z6 I# F1 k7 C4 r
  1. <div id="app">; @5 L: L& g7 O9 n  j# R
  2.   <p>单个复选框:</p>
    7 y# Y0 l+ m9 K  Q( X2 ?- M. t8 A
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    1 e8 ?2 B$ k: h) T& t
  4.   <label for="checkbox">{{ checked }}</label>
    : m! K, M2 ]4 r. \9 h
  5.    
    * ^" t  _. k/ [& r- h
  6.   <p>多个复选框:</p>
    * @& Q1 O3 a2 Y
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    3 n% O  x$ [% }2 {. r& c
  8.   <label for="runoob">Runoob</label>' e; w$ ^' j5 M' L
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">( ~* M1 v+ {% R( t( t( ?
  10.   <label for="google">Google</label>
    9 k2 y  q  ~+ u/ F; f" _2 o
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">3 [( a0 Q# O5 i9 ~. n
  12.   <label for="taobao">taobao</label>& P$ i: }1 n9 V* V* w* n+ o" u
  13.   <br>
    - L6 ~& Z8 g9 c; v7 d! X/ K
  14.   <span>选择的值为: {{ checkedNames }}</span>" A5 H) C& m( D4 ~) A3 J
  15. </div>
    2 p- @9 q) b$ Q, K4 F# f. Z: R

  16. / _2 i0 O: s+ G% c
  17. <script>
    % F. v2 O6 Q2 m! M. N% n* O9 ~
  18. new Vue({2 M3 ^( C$ d8 D' r7 g: V
  19.   el: '#app',  q( M& `, X$ J* {: m) b7 |: K6 T
  20.   data: {2 {, H2 F5 L" v  Q8 ]$ Y3 q9 k
  21.     checked : false,
    4 p0 H; @: h2 k
  22.     checkedNames: []' D4 X' A) a/ J3 h' }
  23.   }
    3 l* N, H! j) u" a1 L
  24. })9 N! O7 q8 Y1 E& H$ @" e) L( `7 q% W
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
5 w/ g' |  s! F  L
  1. <div id="app">
    - L& n$ Y7 p1 i. J
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    2 T2 ?3 v% P+ q! g- C$ c
  3.   <label for="runoob">Runoob</label>! o8 y5 w$ w1 O# Y
  4.   <br>$ Y& D9 H+ A4 F
  5.   <input type="radio" id="google" value="Google" v-model="picked">2 N7 s5 \$ U3 E' F& a: m5 ]
  6.   <label for="google">Google</label>/ @1 e6 u( h, K% @2 \
  7.   <br>  h4 _& A7 o6 ?, Y) ?' Q
  8.   <span>选中值为: {{ picked }}</span>
    9 i0 G5 [5 R) a. ~- C# h
  9. </div>
    $ Z5 h9 Y: P; Y* d! Z
  10. 5 _# |8 u! V. c+ |1 U
  11. <script>
    ! _* o# X7 i' L% J: L9 f
  12. new Vue({' k" y: q. U+ L! K
  13.   el: '#app',
    $ S5 ?# A% `, O- @- j) W
  14.   data: {
    & j/ u6 S6 `4 x
  15.     picked : 'Runoob'
    ( o+ U* ?) i  F+ U8 T! Q
  16.   }! u2 \/ V- J2 t! q* s! Z7 u
  17. }); R$ @1 j6 ]* h8 ~3 h8 O5 ~
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
! h+ u1 g! {' H( W$ P$ f
  1. <div id="app">
    ; j' c1 P% J( s3 w, l# N+ |
  2.   <select v-model="selected" name="fruit">- j/ \- P! {1 e
  3.     <option value="">选择一个网站</option>. h" a" P+ B3 S  B! Q
  4.     <option value="www.runoob.com">Runoob</option>- E" i) n, M8 P/ g7 J+ m
  5.     <option value="www.google.com">Google</option>+ q" k- {, r6 Z. p% S& r6 J
  6.   </select>$ ]/ Y* Y) m9 \3 J# u) ]6 t: m. p

  7. % H% V& c. b& x* q5 X. G
  8.   <div id="output">
    4 [; g7 p! `, M1 g+ t: Q5 o( e  _
  9.       选择的网站是: {{selected}}. {4 M( M8 i4 T& j
  10.   </div>
    7 _* P1 j: H4 z
  11. </div>
    2 I0 L8 L$ _0 Y1 k* n8 p

  12. 8 ~* N& T4 j, ~3 |( u
  13. <script>
    9 }' h( S& |/ X4 A: W. r
  14. new Vue({
    7 o, W$ p, n: _$ b$ `1 m
  15.   el: '#app',* @% m! E4 n2 H8 S5 |. n
  16.   data: {5 ?$ J2 @% B. ?! D# |5 }
  17.     selected: ''
    7 i& l+ p* i/ x0 y
  18.   }
    - b. n# T  m( }) W/ R
  19. })
    8 X! h0 X) D; T2 c! l' \3 P
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    4 a  i4 B8 f9 U  E% o1 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({* ]- j  d' z& i  }# Y$ C2 F
  2.     el: '#app',9 w, A7 S  s* G8 L+ e9 L3 ^
  3.     data: {
    # v- w4 |" B2 o+ I- W; i3 S- G* n
  4.         checked: false,% f" {8 E- F+ Y1 j1 I* x- [
  5.         checkedNames: [],
    * B1 w3 a1 q9 L2 R* I6 g
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    3 O8 z. k2 F& {0 o% h1 i2 `
  7.     }," h! P. C- S4 Y2 _3 B" F
  8.     methods: {
    " l% F& s' W8 D  j* p" U/ ^. l
  9.         changeAllChecked: function() {
    4 V& D# h* ]9 e0 Y$ ^( r% m
  10.             if (this.checked) {" ~3 R+ Q/ D7 Y' ]5 c
  11.                 this.checkedNames = this.checkedArr
    6 R' X4 ]; ]6 O: ?" `8 Y
  12.             } else {: q% c1 N; |# o" X
  13.                 this.checkedNames = []
    2 T, B8 A9 P! o1 T1 p$ r2 ?
  14.             }
    + ~+ M2 Z. S0 G4 [0 ~
  15.         }
    , ?+ G5 L. z) E+ B
  16.     },2 e! a9 x5 h  F3 l/ Z7 k
  17.     watch: {
    & P& U( ~2 h; A6 C
  18.         "checkedNames": function() {7 {, B, Q3 m+ z% G0 V
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    8 j* Y4 k5 S! {, _) R2 s& g
  20.                 this.checked = true
    8 ~  A5 k4 y( @) {
  21.             } else {" C6 u1 F/ J& w+ G
  22.                 this.checked = false/ g) o# j$ d1 g$ f
  23.             }2 A: V* v5 N4 b7 }! }- O3 d/ w
  24.         }
    $ l' {1 f, a& Z! d, F+ E* P+ c' l
  25.     }
    1 C7 T% P/ ~! {1 n
  26. })
复制代码

; a! m$ L- C+ F) @1 V1 \4 o) q6 x5 h% K! E) s
% W% v: d1 [! l' ^

8 u% Q) t1 J7 Y% [' Y( ^' X: T8 P) z. U8 a$ [5 L) ?( F" p

' W0 H0 m# i# }5 T# X% B
. L7 e& {* o# b' G& e
' d; H2 p3 O  m. O' Q- F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 18:04 , Processed in 0.088896 second(s), 23 queries .

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