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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

# {/ M, ]7 F. e: A
  1. <div id="app">% v4 j) @; W- L$ {6 B: C
  2.   <p>input 元素:</p>
    6 r& o$ m" b( @: o
  3.   <input v-model="message" placeholder="编辑我……">
    $ h2 D& F$ w+ ^5 ^1 L( H
  4.   <p>消息是: {{ message }}</p>
    9 p7 e: K( y! e  b9 B
  5.     8 ?  @3 E( p' Z9 }- T
  6.   <p>textarea 元素:</p>! j$ [7 a* u# R4 m- c" i) M
  7.   <p style="white-space: pre">{{ message2 }}</p>2 Y7 {# s, K, W. n  S9 W
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    1 m0 Z( ~& k' b, G$ ^" c3 N
  9. </div>
    ( m" s$ T! n: `* X3 T" a

  10. 2 N+ T) j9 k) T! Y0 T
  11. <script>, E; J4 Y1 Y- i: t' `/ R
  12. new Vue({
    5 e* P* \: b5 C4 l; t& U
  13.   el: '#app',
    3 |$ \1 x+ X" G/ V
  14.   data: {
    $ F! y# g# u+ b9 Y
  15.     message: 'Runoob',
    . o" ^$ P8 F# n9 L
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    7 ]- l6 g, o! X1 r$ n
  17.   }
    0 d3 V; \! [2 Q% `
  18. })
    : A7 C3 _+ b: V/ x5 D2 D4 r# M
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

0 w+ D/ y9 z+ X. y4 M
  1. <div id="app">
    , q* f0 D  R7 m5 |
  2.   <p>单个复选框:</p>
    1 g" ^& l- E" Y0 P1 _' g. F; Y
  3.   <input type="checkbox" id="checkbox" v-model="checked">+ C. c# r9 ]3 T
  4.   <label for="checkbox">{{ checked }}</label>( t: O7 u- ]) \; a: e+ V: a
  5.     . ]; u. w( G! r, e' J" g. i0 q
  6.   <p>多个复选框:</p>
    : ~. R: j8 _/ C- z1 O& b1 o
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">/ k* h9 w! r2 h1 d) S1 k* \: `
  8.   <label for="runoob">Runoob</label>
    , ]1 o# Q! S+ t( X: }
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    $ z' C; ~1 {/ {; P2 A- X  U7 p3 I
  10.   <label for="google">Google</label>
    2 X- Q1 l8 Y9 Y! N7 X4 g& V  @
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    ; w) Z- O, `1 O2 F2 s
  12.   <label for="taobao">taobao</label>/ f. [$ ~4 M% i
  13.   <br>$ m+ S2 I8 o& @) C# K3 t/ I
  14.   <span>选择的值为: {{ checkedNames }}</span>
    1 |* t4 I" D+ R7 H5 t) V( l0 _
  15. </div>3 ~3 ]8 i6 ~# V+ e$ \! z
  16. : L+ t% ?# s# m+ X8 u5 U8 E
  17. <script>% l# R) R2 ]. d) E1 o# [
  18. new Vue({
    $ t3 k( @0 n; e. F, R
  19.   el: '#app',
    0 O- P, k2 M8 W- N6 O
  20.   data: {
    4 ^8 e" R( I3 _3 H+ N
  21.     checked : false,
    : b8 P4 M; Y! B; S/ F
  22.     checkedNames: []4 w8 s9 X4 d, \, L/ h* l
  23.   }
    ( T# q6 A0 W' U% @" V% Z
  24. })
    ! D" G3 ^- ^$ S
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
  \' [9 j1 F# `$ Q
  1. <div id="app">
    2 L; C+ l. D! C3 ~7 F
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    % X5 m0 Y0 ~) f# n2 O$ ?; n. q
  3.   <label for="runoob">Runoob</label>
    ! m$ C/ n* k8 P, n6 d$ ~
  4.   <br>$ W/ d- W$ C( y
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    . @" @  R2 d$ K" ?% _0 t+ P
  6.   <label for="google">Google</label>3 y+ L% l- q! X  t) l5 v
  7.   <br>
    9 c  n" w- a  i, D% s0 A8 r, A
  8.   <span>选中值为: {{ picked }}</span>7 d) E. K) @. T- Z# s) g
  9. </div>1 ^& j# |) t5 W7 K$ o
  10. 3 l$ j6 l6 b; W" V  t) U
  11. <script>
    # G3 C" I; t' D+ {
  12. new Vue({
    6 C3 A1 m9 W8 ]6 ^) W
  13.   el: '#app',
    3 O2 }$ H1 L2 X; k% f2 _2 V( @
  14.   data: {4 _. ~3 F* J1 s' U, f$ c
  15.     picked : 'Runoob'
    * M1 d! U# O, D% ]
  16.   }8 Y  Y) O  ]; n
  17. }); J0 u' [1 U% ^
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
  t8 g$ M" X& K8 `
  1. <div id="app">6 X  g( @6 E5 e* h( _  Z( i
  2.   <select v-model="selected" name="fruit">
    9 s" B4 p" |6 ~* m
  3.     <option value="">选择一个网站</option>
    9 Y! Y* R8 Y" e3 U9 w. J6 K
  4.     <option value="www.runoob.com">Runoob</option>
    . z' n0 h; O( g. _  }) F
  5.     <option value="www.google.com">Google</option>
    6 Q" r: r. |7 Y
  6.   </select>
      O, `: s# N9 t  s  T4 U

  7. ( \7 j; n5 _9 S' g1 F$ F
  8.   <div id="output">
    * o, L$ U2 {7 h
  9.       选择的网站是: {{selected}}6 z6 y7 X* A& k. H: K
  10.   </div>
    : D/ A9 h, j2 t
  11. </div>, D8 c2 H2 ?( L2 f0 y$ O" n
  12. 7 r  r4 q/ s. d( h9 a" m6 G) U
  13. <script>
    , k# g# q/ K0 _6 N
  14. new Vue({
    & ?  _$ k# t3 @
  15.   el: '#app',
    ' d4 o1 p! Q# F4 l% l( c) r
  16.   data: {0 R6 S- w8 }! n* `3 K
  17.     selected: ''
    ' M; ^+ Z+ Q& O, N6 k
  18.   }/ Z% P( R+ U: t. A8 _" s! O
  19. })
    1 B/ T! a* _: g* m% E
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->* S$ f$ m" c, h: f5 S% i
  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({  z1 ?) ?- h% F  l3 G* c) |# F
  2.     el: '#app',0 P0 R0 D! d: D' e
  3.     data: {. P, b: x: p- c9 A- \) D% r
  4.         checked: false,
    ( i6 _# e( H- s8 t- v9 P
  5.         checkedNames: [],) U/ E5 p% Y: u2 F- E4 v
  6.         checkedArr: ["Runoob", "Taobao", "Google"]$ f6 I) Q+ r0 g% g1 K. \6 e
  7.     },8 ~, V* E; n; s
  8.     methods: {& o8 a0 l. ?8 r: a0 X/ {
  9.         changeAllChecked: function() {
    7 @/ C4 q* {4 \$ V. T$ v0 Q7 F
  10.             if (this.checked) {  @; @0 i! ?, l: r! w* I  P
  11.                 this.checkedNames = this.checkedArr" `2 W; T6 K' c$ \
  12.             } else {
    + @- S/ D2 R" {
  13.                 this.checkedNames = []
    1 v4 C( d# u$ `2 A+ @7 Z$ }, i
  14.             }- ^5 X4 w4 ?* b+ S+ E5 P
  15.         }
    3 k6 {8 L$ O  ]8 }: M5 K1 V9 e
  16.     },, i  w% |4 d1 `0 u
  17.     watch: {5 w" n+ n( T4 g8 y
  18.         "checkedNames": function() {
    ' B9 |; S6 X! ?: L+ n
  19.             if (this.checkedNames.length == this.checkedArr.length) {, J8 t0 I1 I. [
  20.                 this.checked = true$ e" i# x9 \- w5 R: H) Z
  21.             } else {0 f& g" ^7 ~& b) U
  22.                 this.checked = false
    $ k* o+ D; L) u$ {, ?8 B6 }
  23.             }5 O; J" j5 D2 s9 C) V# l( w) Q9 B
  24.         }! {' d% q6 V  a8 ]$ G
  25.     }9 e; g3 B' s8 p9 }0 L" J3 q1 \  ^9 l$ P
  26. })
复制代码
" m) |. D  H) C# B
/ Z3 |& B! v$ W' h2 c6 G( @* ^

3 G* h4 }& |) j! n5 a
. q+ k; w* X7 z; t6 `1 r5 S, j. a4 o5 k5 f7 {+ u5 w* f! x
0 {: g/ y4 d" m- @. f& {
- X; o, N0 n" d: G' V! K3 J- s4 i! H
5 E* J: n. \) [4 j0 P6 I' n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:12 , Processed in 0.056637 second(s), 22 queries .

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