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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
& ~7 ~% ?. r! i) J0 U
  1. <div id="app">8 b: ^6 n0 _; Y% l
  2.   <p>input 元素:</p>/ U5 U1 K1 ?( i( e5 u+ r/ c- X. G
  3.   <input v-model="message" placeholder="编辑我……">, s5 Q: ^. l5 B
  4.   <p>消息是: {{ message }}</p>8 j% ^2 j+ g; J2 e/ r1 ?# ~
  5.    
    ; M" d% P( F% j% K1 U; U/ J* ]. J* c* _
  6.   <p>textarea 元素:</p>
    7 x' z+ I0 _. k5 Q
  7.   <p style="white-space: pre">{{ message2 }}</p>1 ]5 o1 H: [1 O9 U# N
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    - O; p8 l& Z2 O) s: p- `) n
  9. </div>1 w9 ^/ X) i) Q$ w
  10. 0 c/ M- j/ U- {# s0 D0 K
  11. <script>! s+ E) @6 o2 B, r1 b! N% N8 \
  12. new Vue({, Y8 f  N/ Q. P  l, c5 `- S
  13.   el: '#app',
    8 _; k* Y4 o, z+ z
  14.   data: {$ i- |  V" F& o& w0 ]
  15.     message: 'Runoob',
    ; S# g( ?3 L# P6 t6 p
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    ( `3 T7 I6 v: F; \
  17.   }
    / ]* |/ A0 z" r# b
  18. })
    ! ~+ r+ G9 ~8 q, g# p  a8 q/ i
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

4 j) U' K3 z8 D( R$ W6 `" Z
  1. <div id="app">
    5 H) w3 z8 ^: T3 k
  2.   <p>单个复选框:</p>8 J4 e, ]8 i: ?1 `2 C0 u  Z
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    : Q$ e8 Z, h2 i% l7 p7 ^2 s) S
  4.   <label for="checkbox">{{ checked }}</label>
    , A' m% t9 x4 R
  5.     9 A: Y5 M- j/ A. v0 _& V9 U1 S
  6.   <p>多个复选框:</p>
    + I2 @6 B- b& E6 Y: I! S4 F4 W
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    $ X( j9 t& p% d. L: f
  8.   <label for="runoob">Runoob</label>
    $ T+ A5 n8 B" A. w
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    # v( V4 x" \: F
  10.   <label for="google">Google</label>
    1 G8 \' R$ Z! x) @: W. ]1 p' ]( i5 Y: p
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">; Y) `* z0 l9 r' B+ S3 V9 D
  12.   <label for="taobao">taobao</label>$ C+ w2 L( o) @5 T8 e; G" R
  13.   <br>; Y8 m1 i2 \' Y, ]
  14.   <span>选择的值为: {{ checkedNames }}</span>
    7 a$ K: w6 Q2 i$ z1 g' x" n& c+ `
  15. </div>( j- z0 o7 b5 {5 _8 c( e

  16. # O% u$ g  L& G9 @( L
  17. <script>
    $ W, Q0 h& E! Y1 j) `" l
  18. new Vue({
      {% S% F% F% A7 {
  19.   el: '#app',$ C, y4 i$ ^" c8 j
  20.   data: {# L5 a: ]. C' `' Y
  21.     checked : false,
    + R' F* r. b# t) |3 r  ^0 r7 p
  22.     checkedNames: []- N% x% D  v  r' L, G# a
  23.   }
    . I# \0 Z. K' H4 x
  24. })& |8 W2 ^' o& {/ n& a% B
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
! }; d7 u4 \  ]5 f  i
  1. <div id="app">) e% u# h  j% X% W9 z2 P& U1 I5 Q
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    9 @1 i0 Y3 D$ Y2 {" r7 u1 o6 A
  3.   <label for="runoob">Runoob</label>, F( I) `* |7 S
  4.   <br>
    2 M" W" ~9 f9 b( m. D7 Y% F; `4 q- y0 H
  5.   <input type="radio" id="google" value="Google" v-model="picked">7 a: p, o- @' F& h9 l  ?) v% x7 E
  6.   <label for="google">Google</label>
    4 v4 i, X- r) Y2 f* m  c+ `+ ]! O
  7.   <br>0 u3 Y5 D- ]# S8 H* B
  8.   <span>选中值为: {{ picked }}</span>* i0 M3 W6 i: W1 m) f0 O+ {
  9. </div>
    ! `& ^: z6 h1 i. L

  10. ' o8 R- J, V( \0 k5 }$ K# g
  11. <script>
    ! g# `: F9 G. Y$ e( B# v- N
  12. new Vue({. u2 G% R/ T0 _4 z0 |2 l- p
  13.   el: '#app',0 d5 p* b& m0 P/ e! D
  14.   data: {
    0 ^: K7 F  P* z' {  F6 o' i
  15.     picked : 'Runoob'
    # r) t2 _* k- F  [- V
  16.   }
    ; ]9 n2 [4 |9 v8 N9 G, V9 k
  17. })/ ]$ V0 }) ?7 x1 q- W9 E/ a  w
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
( n) O0 P" y5 \7 q& b) m
  1. <div id="app">3 I" C& ]& [: M$ `! V: T  K
  2.   <select v-model="selected" name="fruit">
    % z: }  F9 [) J1 t; K; z: h
  3.     <option value="">选择一个网站</option>, M+ t) B. ]& `" E8 N( K1 A6 r& f. J
  4.     <option value="www.runoob.com">Runoob</option>8 l! X+ D$ v) K( D& }
  5.     <option value="www.google.com">Google</option>& h) o/ _, {& w0 I
  6.   </select>& g9 }# T- l8 y" M- B) {
  7. . e0 `  J# H* k; o, s
  8.   <div id="output"># C; P2 \! O! B
  9.       选择的网站是: {{selected}}
    & G' e! r3 e& b9 V( G8 C2 Y
  10.   </div>
    ; ]7 ^% a2 U; F2 F+ T
  11. </div>
    * I0 |4 h2 d# r+ R5 G0 V: S
  12.   N, L# r6 _' @0 V( O* \$ K
  13. <script>0 i+ }: u3 J3 g8 [  ~; o* `
  14. new Vue({% D+ R7 g0 _1 J3 {
  15.   el: '#app',
    0 E4 T3 k# U8 w
  16.   data: {
    6 S# A2 t$ }1 a9 v9 \. K/ k" i
  17.     selected: ''
    % ^9 i  O7 d8 C, c) v
  18.   }  T; Q& H: c5 A3 U( W
  19. })
    , `/ v0 b& Q& L/ r
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->" S- m) b& r- `8 h. k- k. G9 a
  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({
    / u+ i7 }- O# Z9 J) \2 \1 N
  2.     el: '#app',
    / \5 i7 Q4 G* Q1 V  C
  3.     data: {4 G6 O* \- a. u: x1 H
  4.         checked: false,! v8 b3 u/ e+ G  a1 k
  5.         checkedNames: [],% |- N: q  k( ~
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    ! J) l# y( }' v. l: @
  7.     },& o: q( }2 n6 b+ r# z' e5 A
  8.     methods: {
    6 T. o7 M! ]4 c1 _4 `, l
  9.         changeAllChecked: function() {
    - l' w" R& K; {$ ^  X$ H1 w1 H
  10.             if (this.checked) {9 d  r$ H/ O( d. I
  11.                 this.checkedNames = this.checkedArr
    6 I3 A& ~; C' k5 c+ _
  12.             } else {
    8 u" N& b/ O) N2 t3 ^
  13.                 this.checkedNames = []
    7 I* U: M% i6 U$ O" Q7 x) B
  14.             }8 O3 R+ _. V5 z! B, n# X1 m7 |
  15.         }7 _$ c" }1 V$ V4 l: f
  16.     },/ e. D1 [, X: X9 F
  17.     watch: {
    6 m  a3 |, a' Q- D) a+ u' P8 V
  18.         "checkedNames": function() {" C6 N0 O' \5 f) h4 A
  19.             if (this.checkedNames.length == this.checkedArr.length) {
    ' H4 B# `8 F" k( c, x
  20.                 this.checked = true
    ' p; m& ^/ k" x# m* F- J; P0 f
  21.             } else {
    3 [' H9 B: v- g! V1 O$ R/ Z
  22.                 this.checked = false" E1 T1 i  D' w7 ?
  23.             }& }( ~, T, w7 i* D0 j/ D; k8 j
  24.         }' K0 E& Q, e( k- v& B
  25.     }
    & O5 t/ @( P  E! K
  26. })
复制代码

8 {7 I8 ~+ n3 ~5 ?- i9 z( E
% F/ V1 B9 B$ P8 P
0 y2 C0 `8 t/ p; b) U  o' @$ y7 ^; y% g8 c# [" u. r5 n! W( Z: _
, }& e8 E8 Q. z8 Q) C
9 G9 j" B0 U7 O

9 t6 C' D3 B4 p5 d. K9 h
  p  R$ w& S: e$ D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.055173 second(s), 22 queries .

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