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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

9 `( I/ ^- [: n8 M7 H, n+ O
  1. <div id="app">6 B% M' B% M8 _5 {! L) P
  2.   <p>input 元素:</p>7 k; L9 j+ b& n( ^: q, m
  3.   <input v-model="message" placeholder="编辑我……">
    0 c% Q8 _) U0 {1 q# t
  4.   <p>消息是: {{ message }}</p>
    ; D0 z  U3 n; H+ t
  5.     ! @, T  u% r5 t8 j/ v  _2 m
  6.   <p>textarea 元素:</p>
    3 t4 m7 {$ y0 h
  7.   <p style="white-space: pre">{{ message2 }}</p>7 B5 S# T1 h, ?8 F  W' O9 E2 z
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>" P1 ]0 f' E0 f, P. a. X: T
  9. </div>
    1 u! Q: v, |; K6 M
  10. " p; z. N9 l' k" p2 p5 d
  11. <script>8 e7 P; [6 b2 `' G* b
  12. new Vue({
    0 V' S. r8 n8 m' s3 g8 a
  13.   el: '#app',* A8 _0 m8 \! x8 S/ b$ i
  14.   data: {0 e. W6 _( A- k0 j  G( c
  15.     message: 'Runoob',
    / I# E; v9 ]* n( D9 B" k& m/ F2 ?
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'# G  D8 V& _- B' U' {; z
  17.   }0 F+ P! v0 V  O: Q3 V
  18. })
    3 R8 {" U$ u+ Z* l( x4 i7 w2 Y2 |# x
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
2 i5 y- {# o8 N2 ^5 W. h% v6 q8 r
  1. <div id="app">
    6 }: l6 x3 O$ Z0 V: x2 W
  2.   <p>单个复选框:</p>
    3 q; ~( z  _' p' _; F
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    / _/ o0 \: D. ^: _' h+ m
  4.   <label for="checkbox">{{ checked }}</label>6 j. {. Y  e" D8 R" p+ K, p
  5.     : S, w) ~7 z$ W3 N  P2 v
  6.   <p>多个复选框:</p>
    2 x+ d0 E; w, s: l1 G9 j% G
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">. n: c8 z3 a% }# L- w' h- ~
  8.   <label for="runoob">Runoob</label>( B7 P0 a" z( `3 k; B
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">+ @0 w5 C; u" d+ o: {, I
  10.   <label for="google">Google</label>
    . m# C2 E! M9 T" F
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    : j: P: |+ r9 b' M! \3 b. T. k
  12.   <label for="taobao">taobao</label>- h' _* L$ e; X* \" x
  13.   <br>) ]6 i! r! @  z0 l* J$ d
  14.   <span>选择的值为: {{ checkedNames }}</span>
    ! N9 U) w8 [  q& R
  15. </div>8 ?! |! r6 t( S

  16. % X& g- u$ M" N) ^8 U  K: f+ C
  17. <script>$ K9 E0 R0 G1 g2 M
  18. new Vue({  E' h; E" B3 v  n+ v4 A5 {* n1 {
  19.   el: '#app',
    0 X- [- P9 y4 A' P  A! L
  20.   data: {
    ! x8 a# {) t1 U, Q/ y2 _5 z/ f
  21.     checked : false,
    ' n' z6 l' I& ~4 J# v
  22.     checkedNames: []
    ( [$ b$ ]% ?6 ^8 m; S6 d* ?+ m
  23.   }
    " F% i- |! ~6 T+ e1 P
  24. })
    - x) j. i5 i9 _7 p" i$ X) F
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
; i; R& u2 v2 ?# Y# H- J! f% M
  1. <div id="app">
    . T; Z( X: N; o( e
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">" R" }, Z5 w$ i% u! U
  3.   <label for="runoob">Runoob</label>1 ^" K4 R3 S+ B% D' G. F$ h# Q7 }+ ^7 v
  4.   <br>; u& W8 r% }2 X2 B
  5.   <input type="radio" id="google" value="Google" v-model="picked">) S0 C% n  F1 B" n5 @
  6.   <label for="google">Google</label>
    1 U$ y1 G* K1 T" |" B
  7.   <br>
    1 x7 b+ e1 ?+ M: ]' @; S! [* t- N
  8.   <span>选中值为: {{ picked }}</span>/ w- C1 N! O* h; @; U+ h
  9. </div>  k  F; d% ~; d) N/ l
  10. # g4 H+ `: K8 H
  11. <script>
    7 C; i3 _3 i' k% K" v1 @! N
  12. new Vue({
    : E' P( j1 z# p
  13.   el: '#app',- X" ~5 z5 z: ~: s& ^1 L2 G
  14.   data: {
    0 ]( j7 m6 \/ ~6 x. w- x, K
  15.     picked : 'Runoob'! q0 M; v1 E5 ]% Y2 R% W
  16.   }
    : ]) m) j. G) W$ I7 T% X
  17. })
    & k6 X2 o/ c- E8 w% @4 Q9 w
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select) C  ]- t9 n0 m. t+ }0 q
  1. <div id="app">' p: P" ^6 b) w. q' {
  2.   <select v-model="selected" name="fruit">6 a- G  k4 y: u+ R) h5 S. j6 j4 m4 X
  3.     <option value="">选择一个网站</option>; v. \5 _2 d/ v1 Q0 v' m0 Z9 P
  4.     <option value="www.runoob.com">Runoob</option>
    $ A7 x' \% _& F' T( P8 K
  5.     <option value="www.google.com">Google</option>
    9 u) F* ]' B  t. H4 Q9 U' f
  6.   </select>
    ! v+ a& ]. u4 ^4 H

  7. 6 X) s& ]1 o( z# v+ ~" u* W5 ^' }
  8.   <div id="output">7 l" K0 {' r6 c; T( ~( a3 V" E
  9.       选择的网站是: {{selected}}1 V- h, x7 b- x. K* d3 O3 Q
  10.   </div>0 t6 \" h( a& |/ K* c' x
  11. </div>
    % i: b8 `% Z+ Z, @( g" O0 x  U% D: A

  12. * e% s: V) V- p
  13. <script>! R8 N  j3 \. u
  14. new Vue({
    * q+ H1 |- M6 L
  15.   el: '#app',
    - Q1 p+ k, ]4 u7 _
  16.   data: {
    " A% p5 b2 x, r" u5 j
  17.     selected: ''
    5 U) u& Z0 S7 t" m
  18.   }+ Z. v  ^0 c0 u: ]% r
  19. })
    4 J) B3 I5 ?' ~1 _- g
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    * T  h. I* y: S* Y. `* w# k+ h# ~: D
  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({, Y. r* y) w2 f
  2.     el: '#app',
    7 |8 `: w! j, A4 ?
  3.     data: {
    9 H2 [- L7 o- T
  4.         checked: false,( M6 e1 m- @% m: R
  5.         checkedNames: [],
    0 |) E. g/ y, V9 c" D
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    ) \* \6 o" F$ t8 }( j" V0 W
  7.     },) q; O$ O% v4 \0 U9 J0 s
  8.     methods: {
    0 \  \0 s7 u0 T- ?* |
  9.         changeAllChecked: function() {( [$ A% @. d- F+ e( K' e$ l
  10.             if (this.checked) {
    % T  |, D, |& d8 @0 |7 @. F2 S3 D' K
  11.                 this.checkedNames = this.checkedArr  z  `4 l: |) u, D5 @" G
  12.             } else {  L+ w# z4 T$ U
  13.                 this.checkedNames = []- C  i: z% o9 C0 t- T4 g& @
  14.             }
    ; j$ X( L9 c( h
  15.         }% p) }( k' u$ x1 P( J) K' G
  16.     },6 |& c9 m( W: J7 Q' }" @% ?( V
  17.     watch: {: @  S( B2 Z. B0 ?8 u- P$ p
  18.         "checkedNames": function() {
    / f* j6 g, \4 p7 l6 e% q
  19.             if (this.checkedNames.length == this.checkedArr.length) {
      b/ `! u0 b2 l' b
  20.                 this.checked = true
    * Q* L+ E8 v0 N, K* A8 t
  21.             } else {
    / |# K' T  y0 W% C" c
  22.                 this.checked = false
    ( j7 x& [& o- \* j
  23.             }
    5 G+ x, e, g7 @+ X2 m
  24.         }
    ' v& Y/ q/ l  o6 {4 H( u
  25.     }
    9 b# _, q8 d: \
  26. })
复制代码

: f6 F$ Z. ~; _! h$ h( Q2 [. z$ r9 G6 {% Q3 F4 S% `" r5 F
3 z7 M* ^5 E3 w: m$ p
# d+ x/ P4 @; U) ?  \3 e! T
# R" y- @3 S: Y6 @
  {7 y2 |" L8 g+ |' @0 l$ f
% s0 ?9 N5 b; G( o2 G5 t; c

/ E& i# ^) M4 O/ Y) f$ d# u+ A7 C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:46 , Processed in 0.122986 second(s), 22 queries .

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