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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
. E  W# j& Z% q2 h2 R& t
  1. <div id="app"># x/ c. V% \6 K" m( d7 G
  2.   <p>input 元素:</p>
    & T6 U0 r- X( L3 v
  3.   <input v-model="message" placeholder="编辑我……">5 {) U  f$ s/ f
  4.   <p>消息是: {{ message }}</p>9 |' s1 Q. g1 x( ?( O" y9 U" @6 @2 b6 u
  5.     ; i0 R0 o5 B# o. H% s$ _+ o
  6.   <p>textarea 元素:</p>
    % `! A  T+ V7 C8 W/ @! B' R
  7.   <p style="white-space: pre">{{ message2 }}</p>- |8 x1 H% x4 Y& c7 f" A
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    + ^- R8 m/ J5 v$ \% y/ R
  9. </div>  S5 {/ W9 Y# U0 H: j3 O6 [' u) w5 v

  10. 2 F9 r/ K/ f+ A8 Z! \
  11. <script>  ?; H9 c9 l/ I4 u2 L
  12. new Vue({
    ) K! E2 t: J- S' P! G
  13.   el: '#app',
    . |! ~' L- u7 q- M1 q/ R# L! D
  14.   data: {
      B, }4 l& r. r+ M6 f
  15.     message: 'Runoob',
    + c5 q! z$ @9 _6 B! @( L; x
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'* [# D) l/ H# v' w4 l
  17.   }4 N8 W/ s* C* L; M9 `6 J
  18. }). Z: j* ~$ d/ d: u- b& \
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

& C$ B  U' p  a. G4 ^
  1. <div id="app">
    9 I' k( {4 d; [2 e. Z
  2.   <p>单个复选框:</p>: s' i: ^2 w8 p8 J$ B8 f
  3.   <input type="checkbox" id="checkbox" v-model="checked">
      u* }1 {( U# u% r' x+ @
  4.   <label for="checkbox">{{ checked }}</label>
      d( V, w4 `% [3 `& f- K
  5.     : e' d! \- K. _8 ?
  6.   <p>多个复选框:</p>- g$ Z8 m+ c/ {+ p% }
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">! C0 z' Q' Z' [4 Z- F
  8.   <label for="runoob">Runoob</label>
    . {8 Z# a" G* \* m) Q
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">- \! ^' e6 d, ^/ [- {1 q0 b$ M1 [
  10.   <label for="google">Google</label>
    1 ^' ]* ^! \* [: V' h& n! p( b
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    - k) Y: \6 [5 X8 e& G: L# Z6 T
  12.   <label for="taobao">taobao</label>
    + }7 p$ N; D. ~( x: ?( A
  13.   <br>
    ! y5 i8 G& {; }% I* ~
  14.   <span>选择的值为: {{ checkedNames }}</span>: I6 L8 L* ^# o4 R5 z, k' {
  15. </div>3 Y8 t7 l' G* |

  16. 1 {3 s( \! m3 ^! E4 t
  17. <script>
    " L& F5 i7 @: J1 v0 n" a8 T
  18. new Vue({. B3 O! r2 b9 o5 X2 Z; C
  19.   el: '#app',* y9 }/ m0 k$ I  _& u
  20.   data: {
      h; V  n4 C6 F) U3 m( B8 _3 t
  21.     checked : false,$ Y( m7 I) _6 Z9 r1 w! U: S
  22.     checkedNames: []
    8 Y6 ^4 [; ?* r1 y# ^& U+ ^
  23.   }
    * t5 t. G3 |. S
  24. })
    . |# D. ?4 ]$ I) f  Y2 e
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
( p' D0 {+ e1 F) z) b
  1. <div id="app">- S  A9 l" {) z5 U: n- Y8 Y
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    4 b/ Q& q; _7 @, K- v4 r
  3.   <label for="runoob">Runoob</label>
    9 f+ Z9 S$ {: Z# }% U6 `
  4.   <br>7 O5 b  U0 o# f3 s$ M
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    $ |# ^/ X! \- M; {0 t
  6.   <label for="google">Google</label>. t6 H+ S6 |% H: a* V
  7.   <br>
    + q9 S# A7 ~2 ^+ Z2 b1 X
  8.   <span>选中值为: {{ picked }}</span>% j9 g5 E0 \4 q  r
  9. </div>
    ' p/ W2 O! L0 i, l% j
  10. 8 ^7 ~- M% ]  u4 D. _
  11. <script>, e6 ?( c% M8 {. u5 {. Z9 k
  12. new Vue({
    - S0 S  b. l7 i2 Q
  13.   el: '#app',
    5 ~, [# N( v, x& r' x
  14.   data: {
    * w5 N8 J/ ?& |9 ~
  15.     picked : 'Runoob'* P. b0 Z4 Q& p
  16.   }
    * H( E, y- R0 A5 |6 Z( i6 `
  17. })
    % m( v# H  }* I% D0 s4 A: M: P
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
+ G. C6 @. t) k" h
  1. <div id="app">
    % E* [0 W3 r1 }& d' S8 P" f
  2.   <select v-model="selected" name="fruit">
    9 L: X, B* i, [5 d: b3 T% z
  3.     <option value="">选择一个网站</option>  E( E) L' e4 F3 ?0 U7 j5 J
  4.     <option value="www.runoob.com">Runoob</option>! Q3 m  J& |  O% T9 Q( O
  5.     <option value="www.google.com">Google</option>
    2 n) R+ X5 f. W3 |' w( r
  6.   </select>) P# |9 m6 c/ P. a7 S) i/ O6 _
  7. 0 @9 _2 x/ H% e( B  D8 ]3 M7 [
  8.   <div id="output">
    1 o  s# B, d' h% S2 b
  9.       选择的网站是: {{selected}}. X3 x7 z& X7 k, l3 ~+ Q1 C
  10.   </div>
    6 N6 y% V4 X! k3 D( P5 }
  11. </div>
    7 T9 _$ [2 b% ~/ N6 u6 `

  12. 4 [: a  h$ i$ b# e) t9 @
  13. <script>5 B0 i. d( P2 k( n
  14. new Vue({# R. k! L" c! M* E4 I
  15.   el: '#app',
    2 E5 L4 {: f4 \2 ]7 ^- A9 m! d" Z& S
  16.   data: {
    & _6 }7 q, E6 M3 Q
  17.     selected: '' 0 I) O$ i: ?9 U( S- e3 ^& Y5 T4 b
  18.   }
    9 K' c: F9 F7 _% ~1 V+ L" p' |
  19. })4 _: U' G" R( p1 m4 I
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    9 _; r" O. X9 O
  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({" B) B: O6 b. o5 a) R+ c
  2.     el: '#app',
    ' s; D$ s8 g& J+ g4 p% b7 ]
  3.     data: {
    . P: b: w5 ~2 s  Y& O3 n4 s, ^
  4.         checked: false,
    & N3 M, S1 }5 c% h; O" L* u
  5.         checkedNames: [],
    1 y$ ^" A9 b6 \- d
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    . m0 w. P2 Q. F" u; C) A
  7.     },
    % _* h$ v4 K, _, f
  8.     methods: {
    $ v. E; {6 W* m% h4 g' H
  9.         changeAllChecked: function() {
    , c% ]4 W5 ^, [& I+ H2 Y; R6 F1 z
  10.             if (this.checked) {
    ( {& P! r, j* r8 W( g7 o  ]1 p+ Q
  11.                 this.checkedNames = this.checkedArr3 j3 b% V" o4 S) Y* a
  12.             } else {+ L8 n' P3 p) t5 n+ f! u' w
  13.                 this.checkedNames = []; x5 E$ \, A0 Z/ \
  14.             }5 G5 \/ c! j6 Y9 D- @, \7 l7 |$ j
  15.         }
    1 V& d+ w0 o) h: Z1 w6 n4 E+ t
  16.     },
    8 n$ Z8 @- G2 p. Z- Z! W
  17.     watch: {3 S# v! K7 J  D% r3 K
  18.         "checkedNames": function() {4 r1 @8 ^- e( [. H# i; q' e
  19.             if (this.checkedNames.length == this.checkedArr.length) {) ?. G% M  A% `3 a' b5 e2 j
  20.                 this.checked = true
    4 v/ @2 }6 |) H; u1 \8 F; l
  21.             } else {
    3 {$ u7 s; k7 f9 X
  22.                 this.checked = false/ @: c; |7 A$ x2 P4 E
  23.             }! h0 x( G: W/ n8 J- }) l
  24.         }
    $ G9 V. H0 ~* u2 H
  25.     }
    ! r9 j9 G4 Q8 n, G2 ^
  26. })
复制代码
8 h9 o3 t8 j+ u% J: b

3 b, y8 |2 y/ E4 ^. y* Z7 L. C  K2 x( Z
4 L" u5 L# v# v# ^9 u0 @1 ]
( O% }! |- X, |0 ]' N

7 \: {7 S; b. i: I6 y* a
5 a. _0 N+ X* H2 A- i) p
) T& C8 ~) I7 ?. H+ {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:38 , Processed in 0.069080 second(s), 22 queries .

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