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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
& }4 L) t: d$ ~0 f9 H0 U6 M: t* J
  1. <div id="app">
    - H* }6 w1 E2 d" |* K
  2.   <p>input 元素:</p>
    ! e% ]2 P/ E5 z/ B8 g7 v
  3.   <input v-model="message" placeholder="编辑我……">
    ) p4 {$ Q: e" y) b
  4.   <p>消息是: {{ message }}</p>
    9 @2 x: [. c" m
  5.    
    8 v8 S% A; q; d9 p% ]
  6.   <p>textarea 元素:</p>1 O; |! a7 j2 N% |+ N
  7.   <p style="white-space: pre">{{ message2 }}</p>
    / _  y2 B2 v( O1 V
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>7 X$ x2 e% I. g
  9. </div>
    4 L, h% c, o- |' p

  10. 3 S9 _4 s$ r/ n7 Y( H4 I, f
  11. <script>( o; z% O" {" A+ A; t% @* A; Y5 S
  12. new Vue({
    % b( ]6 Z0 Q2 e2 j2 Y7 N6 |
  13.   el: '#app',  N  X; X7 D9 o7 I
  14.   data: {6 }6 t- g' ^% f- n( f0 k& }
  15.     message: 'Runoob',0 T: n5 ?" U  A3 o" A
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'" k( K! I9 [" Y
  17.   }  Q/ {( M$ l( ~7 Y& A& W" i+ e; O; W
  18. })$ w& O0 o1 \4 w5 Q
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
+ w" \/ R9 ?1 x
  1. <div id="app">
    . q4 t: \% S  N- ]# \
  2.   <p>单个复选框:</p>$ S0 c/ z9 q% @1 ?/ |/ t0 l3 w
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    : u3 E" A6 U- l
  4.   <label for="checkbox">{{ checked }}</label>6 ]: C  U. j& K+ n& ~
  5.    
    1 F$ l  a; W8 c- U/ `& S. y; Z
  6.   <p>多个复选框:</p>  t: U6 m" d- A  p8 Y' @
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">' h" `# [: w8 V9 }7 F
  8.   <label for="runoob">Runoob</label>+ j+ \' U% J& I( J) c1 p
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">! i6 h' n$ k( `7 U, d6 i: ~
  10.   <label for="google">Google</label>7 @1 g  R2 }! W
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">6 F  r  I) A" k$ y
  12.   <label for="taobao">taobao</label>% Z9 E% I8 p7 Y5 M
  13.   <br>
    4 C  K9 a1 T9 L! W* k2 L) C7 f
  14.   <span>选择的值为: {{ checkedNames }}</span>: Q  h* U' ?  S% s) t$ o
  15. </div>
    . y1 k, v. |2 w1 z4 ^3 ^
  16. 6 L0 i! T3 w/ y9 y
  17. <script>
    ( G4 N+ z$ M  Z8 L
  18. new Vue({( ~1 K0 P) g' e% |
  19.   el: '#app',
    + N" e2 N8 {% x! O
  20.   data: {- T, s$ g+ ?$ D! D4 M& O( P
  21.     checked : false,+ A. }& ^, o( S' V: K* T( ?
  22.     checkedNames: []
    8 j' @/ d  H. n" Z
  23.   }
      E- ^0 G/ x4 q, |- a- q
  24. })+ O, R) [$ s+ `1 Y
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
  L: s( x+ B: ~% C* u; `' T
  1. <div id="app">7 I1 y; @( X5 l  }1 _! x6 r
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">7 o/ N7 R" L  v
  3.   <label for="runoob">Runoob</label>
    1 B6 B+ S; d  z* Q- x
  4.   <br>) {9 G" R% |3 [7 N* r
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    : L/ A5 ]% I, @, ~/ `, ?. o6 \
  6.   <label for="google">Google</label>) e. P3 `* w5 _; _* ^+ I
  7.   <br>
    ) V2 o: Z5 M$ s  J" X
  8.   <span>选中值为: {{ picked }}</span>
    : @9 O& x4 W$ j3 y' T
  9. </div>' W0 D9 B5 D. C7 K
  10. ( ?9 d" n4 W$ O8 N
  11. <script>
    3 b8 \1 T5 \6 J' P& }6 g: C1 l
  12. new Vue({
    # O0 l" v" F5 ?1 s  B
  13.   el: '#app',$ p. U7 j( H; `( q5 V
  14.   data: {/ y& P) X! s4 ~  H& w
  15.     picked : 'Runoob'/ c* s7 z% `; n. k9 K
  16.   }
    ! s! b1 i7 y/ u& O$ ?/ V# x: A2 ?
  17. })
    . P% Z; m. y) G) {1 v0 T1 g, e
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
5 m! ?7 W4 M% j$ Q
  1. <div id="app">
    # h0 @( z8 b5 ], N; Y4 H
  2.   <select v-model="selected" name="fruit">- D3 n$ F. H/ O& q8 a9 l6 g. q
  3.     <option value="">选择一个网站</option>0 y+ Y! ~' A7 n( }8 T5 K
  4.     <option value="www.runoob.com">Runoob</option>
    6 W8 B- }8 [) V5 R' V
  5.     <option value="www.google.com">Google</option>4 e) l5 K' |& [6 `
  6.   </select>, a8 o9 l  i: J6 l7 ?: K0 e& b
  7. 2 l, h) Q0 }8 `! \, D! n
  8.   <div id="output">) Z( L8 L2 {8 ~. W1 F, z5 a
  9.       选择的网站是: {{selected}}3 V5 m$ j& E$ y0 Y7 f' I6 M
  10.   </div>
    , A5 D6 p, {* h5 n& s+ r1 h
  11. </div>+ K$ w& i& ]; U$ u, M: R& J9 s
  12. $ j, a: J7 Y) @
  13. <script>
    8 ~7 z# n+ }0 H7 l" o; y
  14. new Vue({
    * ]; {4 B* G* R: V5 U" p  `) \
  15.   el: '#app',
    " g- m' {2 |, {5 s5 q7 n  {
  16.   data: {8 F9 ]- F6 t& z" U- z% w2 p% ~
  17.     selected: ''
    * X* H% a/ ~  V
  18.   }
    0 Y; n, k1 j5 @% R
  19. })( l/ S! W4 ~2 }$ B- @0 Q* o/ x
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    : x8 {5 C( M# W) W3 J" n
  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({; L/ }1 l) M. k9 t3 r* \
  2.     el: '#app',
    + A0 b0 ]0 ?. i- H
  3.     data: {2 X9 w: t9 [7 R4 X* d+ N6 _- l
  4.         checked: false,
    $ @. D# C& }9 |# s7 n) X
  5.         checkedNames: [],
    7 ?, Y' o3 ~7 G
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    . t1 {; |( Q% z0 F
  7.     },
    2 S+ F# V+ C. L3 u* a/ G2 m$ _" w
  8.     methods: {) `# c! L# o  P# ?% ^
  9.         changeAllChecked: function() {, M' V& Y3 E# z+ p: o$ K. y# f
  10.             if (this.checked) {9 p- @* ^& R4 \1 }9 x4 H0 M: h
  11.                 this.checkedNames = this.checkedArr
    4 m6 B% z$ x1 u4 N- d% ?
  12.             } else {1 p& V+ c  k6 z9 P5 G
  13.                 this.checkedNames = []
    8 @! h( l5 z' v& o% s& Y3 b
  14.             }( o2 r# O3 j1 H( h
  15.         }
    3 \" i) [7 @# @
  16.     },
    3 g* R& j6 j& l. w* n
  17.     watch: {. Z3 \- L  ^' s4 _+ m, O4 [  g' m
  18.         "checkedNames": function() {
    1 A8 J/ M: J4 h! d+ v1 T8 z
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    & j* c0 I' t6 S7 h
  20.                 this.checked = true4 L) C4 N1 C3 y. u% t
  21.             } else {
    % K7 L/ n% T" \/ _+ X
  22.                 this.checked = false, m- Q5 D* z' h& ?+ `% a
  23.             }1 R' G! G; E( ^. ^3 m% @, v
  24.         }
    # Z! ^& H. M' @  `+ A9 h
  25.     }
    " O- P* K7 f  Y" H; o; W5 Z8 b0 y
  26. })
复制代码

  |3 A( K$ Y/ B# P5 d9 J) J
8 J+ e* J" ~* e. G6 R& l+ [. I- N  m( Q4 w, x

7 M6 {1 e# [5 e  v& Z& c, N. O% |5 [; ^( b) N/ i4 V: q5 B! s* O

, e! E: T( e4 {* b; z) q# f: t8 ?( m
/ u8 I2 n+ Z9 P
6 ^5 o; {7 x. A# Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:28 , Processed in 0.059535 second(s), 25 queries .

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