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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
* V5 a. ?7 A# M* T# U; {. y
  1. <div id="app">
    9 _+ z$ Y5 h9 {3 Y
  2.   <p>input 元素:</p>
    # h+ g  E' ?+ x4 y
  3.   <input v-model="message" placeholder="编辑我……">  c5 U) G' {/ ~. f% }* [
  4.   <p>消息是: {{ message }}</p>
      S5 M7 @  |( P/ S$ L# q, c3 x
  5.    
    ; m( u* z3 G, y
  6.   <p>textarea 元素:</p>& C" R) G4 w3 y
  7.   <p style="white-space: pre">{{ message2 }}</p>/ u) k; r/ E2 U) a4 M, T4 k1 z# G/ {) a
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    ( n) O% `1 }4 ?9 p0 [# C9 f' D9 t
  9. </div>6 u7 _5 d- i$ c+ }, L
  10.   Z: ^. Y3 D: y6 L( q
  11. <script>
    . D+ C. ^% A! i5 C
  12. new Vue({
    " G3 ?/ J% f9 k$ p1 n5 }; i( E
  13.   el: '#app',* P' K2 ]4 O  Z0 u+ B5 o+ P
  14.   data: {5 A( t- z% Z! ]8 g" w& v
  15.     message: 'Runoob',
    " m. x0 W! d/ B8 u" [0 T8 I2 q% [
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    - H! [7 ]. }/ i! z! E6 [
  17.   }
    # R: o% H4 K" I7 k
  18. }): q9 T2 Q! Y, W3 Y8 s! W- f4 ]1 f
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

, P$ {) S- [( f; S* z) o
  1. <div id="app">& Q$ `: {1 `) p  v0 R: m+ I
  2.   <p>单个复选框:</p>
    - i( |/ B1 Z4 D# m/ H
  3.   <input type="checkbox" id="checkbox" v-model="checked">: J( @. @# }" ?  Q* ]; h& Z4 l& g
  4.   <label for="checkbox">{{ checked }}</label>+ C; v% p# M' ]/ w$ r% W
  5.     ( u$ u' ]+ D. J
  6.   <p>多个复选框:</p>
    ! r3 n* S) q, n" e. e
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">$ l7 A- b& V' v$ s0 Y2 r. ~" B3 u6 s
  8.   <label for="runoob">Runoob</label>! u6 m6 {( R+ d5 t% I
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    ) G# E" W5 v+ m" D
  10.   <label for="google">Google</label>8 y( a- {3 k" T0 P- k) H9 _2 w
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames"># q: B2 z% W" g8 I
  12.   <label for="taobao">taobao</label>9 y: }3 ~3 k# ]- P/ ^) H% p
  13.   <br>) O( z2 ?4 L, l. t- x
  14.   <span>选择的值为: {{ checkedNames }}</span>, V, N9 X3 V  W% V
  15. </div>. U+ n8 U% ~" |6 t% e# a& l/ x& ?- R
  16. . ?, Z) j- q9 M8 _2 I" ]) v
  17. <script>
    , T' s+ }$ D2 S! ?: S* N: M
  18. new Vue({) A4 l8 ~" ?0 H* W; q* V. E4 ^0 B4 C& j
  19.   el: '#app',
    ' I* t; F8 a; }( a
  20.   data: {
    ' K5 a4 f$ ]5 g
  21.     checked : false,
    % C. h, ^( E6 F7 V+ @
  22.     checkedNames: []
    $ G3 j; |# m9 [# J) ~
  23.   }4 D$ Y/ d$ I9 \) U! y$ g
  24. })
    ) B7 N6 p, L0 s2 y7 [
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮6 o5 X/ F8 {2 c, [  r( M, E' \
  1. <div id="app">$ _" @8 F' \$ j% q- m( X. e
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    - z+ z) o- `5 ^! R3 c
  3.   <label for="runoob">Runoob</label>
      b! H# P& U2 C! h! ?% Y8 u
  4.   <br>
    % T7 L. X7 @% b# c
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    # Z" R+ k3 ?$ V+ k! Z
  6.   <label for="google">Google</label>
    7 V! F' ]" l9 B: |7 K! g# H4 f
  7.   <br>5 ~9 N( ^7 S5 s) W6 @
  8.   <span>选中值为: {{ picked }}</span>" Q* M  Z& S" R/ a- e3 {
  9. </div>- _2 I/ H" v) P" |

  10. 3 F, h( t; v0 x1 B# q, P: |
  11. <script>$ J) ]1 D/ Y' h% B+ e' L
  12. new Vue({
    * l& l( t; L: E5 u5 t
  13.   el: '#app',
      R( L( ]: E% `2 ]. K3 y
  14.   data: {
    ! N4 J' {" P1 g# b' @7 a
  15.     picked : 'Runoob'
    * H& \3 H6 |1 \" S
  16.   }
    ; b4 X) `! Y7 F
  17. })
    ( z+ [3 {! k/ ]1 u2 `
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select2 l9 R0 L4 F; X$ \4 P
  1. <div id="app">& O0 L8 L# e! g5 [( e4 ?9 h0 D
  2.   <select v-model="selected" name="fruit">* @0 D1 T& J- H3 I8 `7 g% O* {: S) j
  3.     <option value="">选择一个网站</option>  N; S* V$ q6 M! W: F# j
  4.     <option value="www.runoob.com">Runoob</option>4 |* h2 [1 X; _3 r
  5.     <option value="www.google.com">Google</option>4 K2 n7 B& z  h
  6.   </select>
    . B5 w! L7 |! P+ p
  7. - f* r+ f: X6 h, ~9 C
  8.   <div id="output">
    3 M$ ]5 G5 q6 ]. a2 z5 C" c
  9.       选择的网站是: {{selected}}- @  |% r; h5 Q" \; u
  10.   </div>
    / a1 Y" t4 S9 n. q+ F
  11. </div>
    2 y  P: w3 g: N- ~' z
  12. . |+ e7 d, C7 F4 M7 P; p. E
  13. <script>
    8 A/ d4 E8 ^) V
  14. new Vue({9 W7 t: @# D5 v% `* F
  15.   el: '#app',6 t2 O1 {2 R/ d
  16.   data: {
    7 L9 V. Y' V% X+ A
  17.     selected: ''
    6 p/ Q  g8 n, g3 e1 Q/ A' I: y, ~0 X* d( g
  18.   }
    . e* n) \1 C% E( A" b. c1 s
  19. })
    ; W) F) i7 r+ D& s* N: O2 H! D
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->2 n  t9 R6 f  u% N2 O( B
  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({
    8 P+ K+ R+ j# s$ W% g5 u
  2.     el: '#app',  ^- `& S/ @  k
  3.     data: {$ ?6 e2 d& q$ t& }  U3 C
  4.         checked: false,; y- C; h/ O9 X3 C2 K, D
  5.         checkedNames: [],* f* f" S+ j" W! T
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    0 T( l3 d* [" w) @' q
  7.     },* B+ p! `0 E. v1 d9 Y4 b5 F4 S6 R+ r
  8.     methods: {
    : {: I! n  s, |
  9.         changeAllChecked: function() {
      ?/ X& h' I5 Z8 I1 D  s
  10.             if (this.checked) {
    : |* a3 H' \* J) ^2 u# ?6 d  V
  11.                 this.checkedNames = this.checkedArr: t0 p  t9 L$ {+ J
  12.             } else {( u& F* W* t9 C* l8 m* _" y
  13.                 this.checkedNames = []
    $ p; J7 h# a: c% E% ~6 d
  14.             }
    3 r" t  |; m; D- n) O5 b& B/ G$ j! O
  15.         }
      A8 T" o% Z+ M0 d6 |) V
  16.     },
    4 M, a4 ?4 J7 g' `3 k9 d
  17.     watch: {
    1 F  r: Q1 K) c) d( Y& {, v6 a; K
  18.         "checkedNames": function() {
    # ?5 r6 j: N# M: ], ?/ r
  19.             if (this.checkedNames.length == this.checkedArr.length) {1 x% |: F8 w+ _0 z
  20.                 this.checked = true
    4 ?# }" U% |: l) T
  21.             } else {
    + H3 c4 t# T- i( ]& X- n" k. S8 R. \
  22.                 this.checked = false/ P. G/ q6 G$ m" B  C- x" G3 Z) N
  23.             }
    * @! w- }5 _$ o6 u
  24.         }
    & W. }0 p' g( X5 Z& M& b( H
  25.     }) r$ E" m: X! i, @) T
  26. })
复制代码
+ ~8 |2 c0 ~8 B+ N5 a5 `4 T

4 w) p% n9 a% V+ F, t( r2 j% \5 Y9 L. V( F3 z% D

# H9 o- E) S: [' |5 A% m" [( D  O$ X0 h7 s

/ O: {' u  t# n( U  f7 E. @6 D- L& W
. i5 a$ N& C7 q1 J1 a; c
$ W  k& ]# P0 p9 y; e) u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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