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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
4 W7 ?" K7 S3 n) n8 f# {5 k5 F
  1. <div id="app">- o: u8 x) f9 x& ~
  2.   <p>input 元素:</p>1 N: l+ v$ H0 i! G0 L
  3.   <input v-model="message" placeholder="编辑我……">
      J- M. W# r! S. Z
  4.   <p>消息是: {{ message }}</p>
    6 v) H: |0 S  ~) K. x9 i7 h
  5.    
    ( p& A3 d# N. |) `6 l
  6.   <p>textarea 元素:</p>
    0 z, K  Z/ Q  f  K( W/ G
  7.   <p style="white-space: pre">{{ message2 }}</p>
    ) B4 A0 D  K- T$ n+ X
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>, C7 E$ ]; X! h5 W7 Z, k  D
  9. </div>
    1 j1 a( |: a; I* T/ ?
  10. & q1 M) A& y8 j' h; y' {
  11. <script>5 L9 b8 U9 T, k9 h, N- {
  12. new Vue({
    * q, l/ G* {0 q4 \1 v+ J% k1 _
  13.   el: '#app',
    5 k) P, s8 i$ |, T+ E8 ^( H
  14.   data: {4 e  `# C; w: F' f% R! {9 `* f. a
  15.     message: 'Runoob',
    5 g  t) a7 q$ \3 i
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'4 q( B- m3 q& g, S6 ]. ]
  17.   }! S. d3 }! E9 [  V/ Y0 k+ o5 }, p
  18. })
    7 @* _8 z  ?: s/ f. h9 r" l4 U; U
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

) V5 Q8 r$ e. K
  1. <div id="app">3 a# t0 J+ E$ Y. z3 u/ u
  2.   <p>单个复选框:</p>! N0 _- F3 d! N
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    1 p- v, H" \, f1 ]4 k) U" {
  4.   <label for="checkbox">{{ checked }}</label>
    5 S' f! y- S) w$ j! N: \
  5.    
    ; C$ l+ [# H4 k
  6.   <p>多个复选框:</p>
      A+ Y: n" k' o/ A% z
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">* U0 s. h2 }8 u. f0 m8 V2 L# f9 m
  8.   <label for="runoob">Runoob</label>7 t& _1 G* b& e9 W0 f
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    . H4 n7 D4 Y: y8 |
  10.   <label for="google">Google</label>
    % L$ s6 t7 }/ j* A
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    2 |: z4 \" l) ]7 ^
  12.   <label for="taobao">taobao</label>; |) h0 e; |2 {1 h: H/ L
  13.   <br>- r/ A4 _5 J% ?3 c
  14.   <span>选择的值为: {{ checkedNames }}</span>
    ; V' u3 K1 Q* @9 I4 U
  15. </div>5 d) x2 W' N7 s0 H7 ]
  16. " }; v+ N7 h$ o4 v4 l7 `7 ^
  17. <script>! [: K! p2 G3 u1 J! e- J9 z3 T4 }+ ^
  18. new Vue({3 z4 U, s$ I$ z' v! P
  19.   el: '#app',* g, E# H- G4 Y
  20.   data: {
    6 e, ?' n6 j2 G; U! X* k3 U8 a
  21.     checked : false,
    5 D  b9 m% X3 A- {; d: n& @3 t5 T
  22.     checkedNames: []
    5 m7 A7 W: R- k, \& g. n/ _
  23.   }
    $ N+ {8 X$ F/ I, Z7 `  C% {2 _" x  O
  24. })- |4 S" M9 s5 M( ~4 |
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮% m- a& H5 I2 T0 _
  1. <div id="app">- J3 N* u! |4 I
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    $ P* R. B2 X& z& L* R( f. V
  3.   <label for="runoob">Runoob</label>9 `0 }- B" N% a
  4.   <br>, `# t" N$ y# C6 B' y  S$ `" d" i! O
  5.   <input type="radio" id="google" value="Google" v-model="picked">- {- Z" e* n0 m: u8 S
  6.   <label for="google">Google</label>
    ! ?# |7 P% o& H" X& O
  7.   <br>1 M$ D. s8 y; L5 f$ b1 W
  8.   <span>选中值为: {{ picked }}</span>  Q4 r6 y% c; H) ?. K
  9. </div>
    , m/ S& h) V7 Q& C% L2 I% j6 e

  10. ( Z; ]' `7 f6 c: S8 i9 j
  11. <script>
    0 n, ~6 }" N" `& M- {( s
  12. new Vue({8 L; v1 c, P1 A8 U/ C
  13.   el: '#app',
    9 U4 T% d$ `+ K* k8 a
  14.   data: {6 E7 h5 ^6 W: |; \+ d- E- N5 O
  15.     picked : 'Runoob': ]" }/ e9 I/ t1 x5 s' j5 ~/ `
  16.   }* X$ R9 o0 m" c  g- s9 U, N5 ~
  17. }): O- ~3 W- x- t- Q- b
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
, F8 q, @! S# |: L. x
  1. <div id="app">
    7 f. b; B" n$ w" r
  2.   <select v-model="selected" name="fruit">; I1 E' j" {& ^$ m
  3.     <option value="">选择一个网站</option>
    6 \9 e+ O6 z$ L3 _
  4.     <option value="www.runoob.com">Runoob</option>
    6 d$ S  ?" T% L
  5.     <option value="www.google.com">Google</option>  P+ b; b; P: H$ Q8 g( F3 t# P0 M
  6.   </select>
    ( ^5 P4 Y: T; q# _

  7. $ ?: l' {5 Y* f' C) c" _$ y- T
  8.   <div id="output">
    ! F1 D$ u( b. w" _3 g& B
  9.       选择的网站是: {{selected}}
    1 [# R* t& ], z+ C" U
  10.   </div>
    7 F" ]9 F7 b& v
  11. </div>* {8 Y, G/ _5 B1 X. e0 M6 n! h
  12. & r) H' b$ D5 H" |6 H8 t( s+ L+ i
  13. <script>
    ! A) j* {& G, C$ C. [
  14. new Vue({
    - M2 o* ~6 m( s* a: D! G" C2 E5 Z* d
  15.   el: '#app',, o8 ?; U! ]/ m( l' b
  16.   data: {1 F: b& E( `9 u4 }. H0 C- v2 g
  17.     selected: ''
    & J% U9 W( n. e1 x; i; A! Z. Q
  18.   }
      }$ r9 w  ]9 T) A8 p" p% ]
  19. })
    ( U5 H; x. I$ c6 s7 x
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    ( N* h, s+ e2 t- M) _; ?" M1 O( J
  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({$ N/ J  u* ~2 T; G: K
  2.     el: '#app',$ e9 s0 E: }7 |) o, a2 L/ v
  3.     data: {
    ( e( j, g. X  W: A. U2 x$ |" S, ^
  4.         checked: false,
    ! k! ?+ h* a* T6 }4 Q
  5.         checkedNames: [],  j/ o! i6 d% J  H- ~7 O- n  B
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    * Z# n  @: m0 ], ?  C
  7.     },
    - A. Q! o. L/ `
  8.     methods: {
    8 K1 E0 x5 H# i. `
  9.         changeAllChecked: function() {
    4 b6 p7 L4 v. g) l2 f  J& F) k
  10.             if (this.checked) {' c" ]. U% R' R4 j4 X& T
  11.                 this.checkedNames = this.checkedArr
    8 o* B, C' h+ k3 |( j
  12.             } else {
    1 A2 ?6 q+ T( ?  B# P) {8 T; o" t9 |
  13.                 this.checkedNames = []* C- g4 J6 \% [' I
  14.             }
    1 i3 R, e; B/ d  d9 {' `/ ^, g
  15.         }
    ( M. N1 e. J# H
  16.     }," k& `& n, ^  y! D: R: d: m3 p
  17.     watch: {
    . g* b  o* M9 O$ d. W3 R
  18.         "checkedNames": function() {
    " R( k( V3 I2 y( b3 S: ?
  19.             if (this.checkedNames.length == this.checkedArr.length) {# l! ^/ g! L7 |6 u4 W
  20.                 this.checked = true
    7 \  i& A6 R8 n- j3 {- V5 U& p7 q
  21.             } else {
    ) S6 B1 S& R" a
  22.                 this.checked = false
    9 ]8 M/ K: k" b/ ?3 W9 ~
  23.             }4 d# m$ g! P6 B* G! V
  24.         }) F, i4 r# F1 {; r- v/ K, w/ T
  25.     }
    : _5 U# C. {, n6 n/ y* l
  26. })
复制代码

- O+ u: w  r$ \7 i# J+ u7 p
7 B/ C! H0 V: E5 t2 ~- w  \$ V
8 H! H5 U5 m7 U  N- H. c8 M
* _7 O6 n# U" t1 K+ \" C8 M/ r6 X# m( c  d5 O

/ w. U# v- m! G: V9 E- E; Z" |
  W2 D3 o/ G# Y9 \. U  m2 T- i" [, h& V0 ~% J6 f9 u8 p. \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:57 , Processed in 0.061809 second(s), 23 queries .

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