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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

% @5 m" @$ ^9 b2 x& O: U
  1. <div id="app"># a. b/ k+ {  Q9 O# U
  2.   <p>input 元素:</p>
    * F; y& I. J! _. F0 l$ t/ d* q
  3.   <input v-model="message" placeholder="编辑我……">5 H) R0 t4 W2 i. C+ I+ G
  4.   <p>消息是: {{ message }}</p>
    3 V1 j" v( Q8 V$ u
  5.     0 \( O2 d2 \( b2 t
  6.   <p>textarea 元素:</p>
      D8 T+ [+ _7 z1 E0 b% V
  7.   <p style="white-space: pre">{{ message2 }}</p>
    : R  `4 E  }6 n0 \
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    . i! z. j( h8 C7 Z
  9. </div>
    9 j( T3 ~1 w- W

  10. 2 Q( ]  [: V) \2 \8 R8 |7 ^
  11. <script>
    9 E0 L% L  Z% n* H( z" L
  12. new Vue({
    ; V* w" V1 f- |
  13.   el: '#app',& z" ~, k: b% f' d
  14.   data: {
    + b# R/ S" U9 o; C, q
  15.     message: 'Runoob',
    # w* z% v. j7 e$ T- D
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'8 w; Y: t, p! M9 _2 r  Y
  17.   }
    ' H* g6 ^1 X; S2 y2 Z4 u5 e
  18. })
    6 d0 j0 r$ ]! I, j% S
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
1 d3 j8 D9 p0 J. I0 Z8 E
  1. <div id="app">! D& v" G. `) R
  2.   <p>单个复选框:</p>
    & t; |) ~- n6 @! H( j% c
  3.   <input type="checkbox" id="checkbox" v-model="checked">) J$ T& q  G8 [* m: r
  4.   <label for="checkbox">{{ checked }}</label>& Q, w$ a$ i8 l! [( g2 \, |
  5.     / U% s% B- v; z; K
  6.   <p>多个复选框:</p>
    ; e: y1 K( O8 o& i4 G3 a4 X
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    * ]7 K0 n$ {4 A- h% N) r
  8.   <label for="runoob">Runoob</label>
    + I0 \% j, X; B& C  j3 U5 l  P! e, ]3 [; t
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    0 u  B1 ~5 s* v( }0 Q* i# W- f# T' `
  10.   <label for="google">Google</label>
    7 r" g. l2 j. {& i1 x  P5 X$ L" O
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">3 X  s  Z8 z, g
  12.   <label for="taobao">taobao</label>
    ) H  G. v: C" }/ R0 @
  13.   <br>: ^1 O# v8 V, w  R0 Z# q
  14.   <span>选择的值为: {{ checkedNames }}</span>2 J: ~' Y7 u5 ]9 t
  15. </div>& b5 [% E" v5 g0 I: j- M

  16. 9 J7 G; {5 M' J+ A( ^; y0 Y! d3 |3 C
  17. <script>
    # [( s: F. D2 ^
  18. new Vue({
    5 U5 c* h0 a/ a$ K3 {
  19.   el: '#app',& V! h0 ]# M3 O7 ~
  20.   data: {
    - \8 U# {5 B! S7 c* Y6 n* E% F) @
  21.     checked : false,# a8 i" [: u4 c% Z; e1 q, ?
  22.     checkedNames: []* E5 p- U7 b/ V) t8 y+ Q
  23.   }
    5 |, ^" D( A- ^) ~! B6 j) I8 X2 V* z
  24. })
    . c+ c0 J' Y5 R" k* X4 y
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮3 l- H/ R" O# a) L
  1. <div id="app">
      i. p* W4 m5 F8 w0 w+ n7 J/ N
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    " S( Y( h3 o2 h6 k, K, _
  3.   <label for="runoob">Runoob</label>( T9 Q6 O. c! b* a+ V
  4.   <br>0 u: M, b0 i0 ]" Y. ]! K4 z
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    8 M+ X' {6 y% R, D. b& b& @
  6.   <label for="google">Google</label>, {/ F3 |2 [6 u- c* x: X& Z
  7.   <br>/ V4 y/ [) W7 `+ N
  8.   <span>选中值为: {{ picked }}</span>
    9 A8 c. p) A& C8 q& ^
  9. </div>
    ( s7 A5 @, N& i( B2 o8 s
  10. 3 T2 S- I: `3 w2 g9 f7 N
  11. <script>( X, t# ^( t4 F, {. V1 O
  12. new Vue({
    # G- c3 g! U2 s$ K! W
  13.   el: '#app',
    2 q/ g. g6 S. ~1 p; |% \- J0 k8 B' w
  14.   data: {/ q8 a: G6 r) X/ Q/ ], x
  15.     picked : 'Runoob'
    , D. H# Q+ B; E/ Y
  16.   }
    7 i# q+ |: j  c/ }& ~& n& w2 k* l- X
  17. })
    4 a) i7 ?4 H7 Y. E* d9 c
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
: g) l. H" B9 i' V7 K( a/ }
  1. <div id="app">2 n1 z9 b- ?, Z) S0 C: N& f- G) ?0 |. V
  2.   <select v-model="selected" name="fruit">
    8 w- Q6 P% h/ z8 m
  3.     <option value="">选择一个网站</option>
    7 h, x9 ]( D1 e6 ?8 C6 {
  4.     <option value="www.runoob.com">Runoob</option>2 G# Z1 T/ {7 {
  5.     <option value="www.google.com">Google</option>
    6 U5 i  b0 l" {+ A) j: p
  6.   </select>+ S1 d% f9 r# o: u! d

  7. + I, Z0 n/ }7 k" \; B
  8.   <div id="output">
    6 \  ]7 x* R* ?. c" O* C, t! x
  9.       选择的网站是: {{selected}}$ O3 t6 v" D& C9 i. m( ?) c' f
  10.   </div>
    # K" D% l. t6 e, `% V4 \. X
  11. </div>
    8 |4 o3 Y' F7 `) d$ Y* r
  12. / k( i6 G7 u, M+ Z4 o
  13. <script>
    4 m. }( X" u8 z$ [: K- @  e
  14. new Vue({
    # X& ~0 q3 ?! H
  15.   el: '#app',
    / q1 H9 _. t1 n. O2 b$ C
  16.   data: {# \( n6 @" P6 @2 G5 }$ v
  17.     selected: ''
    0 f1 Z) F2 ~( @, Q1 h/ C1 Y
  18.   }
    ! }6 a# `. g) y5 q/ Y5 h. ~* X* V- J
  19. })
    9 P) `8 d' D$ l4 ^6 s  R5 r( d" T* |
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    ( {  X. k' E' p) ^" o' C
  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({* Q6 _' b/ l" X
  2.     el: '#app',
    3 p: M# l- A. b6 T- f
  3.     data: {( B) T0 j4 p+ z  q  O. M
  4.         checked: false,
    + H7 c1 N$ T+ m- r8 a: }) r
  5.         checkedNames: [],
    * C6 y% z' |, s6 O: B4 a- ?
  6.         checkedArr: ["Runoob", "Taobao", "Google"]; s0 M* @: S( O$ [7 @$ B% a$ _
  7.     },  w: m7 a) g* ]7 e' C  d
  8.     methods: {0 D# k  B" E) V  S
  9.         changeAllChecked: function() {$ a( S. P# I2 z+ C5 k. }) |
  10.             if (this.checked) {' _" O! ?( T& H
  11.                 this.checkedNames = this.checkedArr3 y/ e. p4 c+ B$ j; [5 W3 W
  12.             } else {
    8 F% T8 V) f: W
  13.                 this.checkedNames = []: P  V% i6 k5 R+ f
  14.             }
    . d8 u+ D* d6 X) S
  15.         }- }+ |% K2 z( n) z* b. k5 w; u* z
  16.     },
    2 K1 M/ L2 V6 Q/ N
  17.     watch: {" a. a4 g9 C7 W' ?! q' P. k
  18.         "checkedNames": function() {2 D2 V) ?* h( T. @' U0 R3 t
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    ' [  @% o, _/ X% g$ Y
  20.                 this.checked = true4 ^; \8 {5 R$ q: l0 M0 C) }# U
  21.             } else {
    , K* T7 ^, {# x4 t- v
  22.                 this.checked = false
      i1 O# u& U  }( G; O
  23.             }
    3 y- H* p4 L. C2 n
  24.         }+ s2 b* K+ ~# c% V4 W4 r. A
  25.     }" C: J6 X- S/ Z. b& U: C
  26. })
复制代码

7 }" U  V/ ^% q. |
: [& G* x  c6 A  K
# R' j; _% G% H
. @; _: o* ?1 ^: y2 b% @: H6 Q' s
1 T) K' V. i# Q. f' s% A
0 `) {' j/ ]5 W  [; _1 A% F+ V+ p: I4 S; f
/ I% x, L) m( b9 T) \8 v( K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 17:21 , Processed in 0.061888 second(s), 24 queries .

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