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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
9 e! Y. p& P% G1 c" }0 U% i' V
  1. <div id="app">
    , ^8 ?7 T5 A- l7 }; e; E
  2.   <p>input 元素:</p>
    5 V. T& ^  @3 h( x! M2 d; l8 R
  3.   <input v-model="message" placeholder="编辑我……">
    4 h9 ^0 x) G$ V8 ]
  4.   <p>消息是: {{ message }}</p>
    4 H& {8 @- Z+ k" c
  5.    
    ' j7 r6 Z/ M1 S1 p
  6.   <p>textarea 元素:</p>
    ! l' d. d& W( h) K8 J
  7.   <p style="white-space: pre">{{ message2 }}</p>
    ( {2 e- D2 I+ S7 K7 o
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>% k1 R' G' k3 W3 [
  9. </div>8 [7 t) a9 @  L3 Y( B% K& L* i$ Z

  10. 7 h% p. k, s7 r- B6 W" r5 x1 r6 m
  11. <script>
    ! o4 m, n% V7 @) s' P
  12. new Vue({
    9 I# E% Q- v/ |3 i+ ^* c: _
  13.   el: '#app',
    ) S: }* i% ~, a
  14.   data: {. K) M) a5 t6 c6 P  t6 Z; U
  15.     message: 'Runoob',
    9 K5 A( V. S7 }( J$ Y* [" ?0 x# J
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'* f! y. G5 ]+ S8 y
  17.   }
    ; }4 i3 |; w* ^; U! c
  18. })  }1 L# ^2 `2 U- ~
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

8 r9 E4 t: @# F4 l4 t) K
  1. <div id="app">) ?8 |+ P- G. ?4 ~: h, v7 Q" J% n+ v. {
  2.   <p>单个复选框:</p>: `. R5 _% [+ e% ~7 ?, ]0 x5 y
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    & h: y. y1 O& j6 _$ W) K# [
  4.   <label for="checkbox">{{ checked }}</label>
    " ]5 o7 J/ x( w. G$ F: d) ^
  5.    
    - {5 U) o! J/ J8 Z* O
  6.   <p>多个复选框:</p>% a8 W3 l% V8 o  z& i" ^' }
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    5 o2 K0 m, L& |
  8.   <label for="runoob">Runoob</label>
    & j; L0 R  Q- C% F' w
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    % v! [+ j) N, p# D( ~; M/ Z
  10.   <label for="google">Google</label>
    4 C$ ?. u( U9 g% a; |
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">% d0 O( n* j9 [' o; V  t6 p% `- L
  12.   <label for="taobao">taobao</label>
    & ?/ p; F( s( T6 a; ]
  13.   <br>
    0 A! {) H) B# P$ U& m7 {
  14.   <span>选择的值为: {{ checkedNames }}</span>
    % d; W% A4 f. y) H, p2 R* Q: x
  15. </div>1 v0 s+ e: t% `" S0 e6 V7 Z9 G
  16. , l. T9 E% o/ W7 E- S; R( C
  17. <script>4 h5 B9 y) ~5 n4 o0 [
  18. new Vue({
    % Q& l: m$ ~# }/ n5 V6 W
  19.   el: '#app',
    . t0 Q% n/ O0 t
  20.   data: {
    2 {5 X7 @- w% E* ~  e$ d
  21.     checked : false,# O* R. ~  u, ]# d4 [* z
  22.     checkedNames: []  B& ?0 C8 G+ O3 A6 b/ N
  23.   }
    $ f6 R, W( S1 I5 v" E  V# ~
  24. })0 V2 a# @+ S" H  C* p) ~: |
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮# H3 P/ r/ X4 {; I9 {* [
  1. <div id="app">
    9 x3 D9 b' Z9 w# M& y# p
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">& c4 s9 N& U5 H1 q9 s/ c
  3.   <label for="runoob">Runoob</label>8 Q- R9 W$ a. @: X
  4.   <br>$ Q1 n9 @4 ^" V. F- x9 [
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    1 S0 M# u) I# u  j9 |
  6.   <label for="google">Google</label>% j- Q- l$ u: j/ y1 p# J
  7.   <br>( b% L$ T/ [. z: E6 @; ^
  8.   <span>选中值为: {{ picked }}</span>
    3 t4 {, B. Q) _9 d
  9. </div>$ C& Q1 h2 ^' K" I3 G1 U2 C! m- z6 ?

  10. 6 g: [3 B2 n/ `  Z8 ^' M" e
  11. <script>2 t3 G8 W( ~( v/ F. e" C; U( Y
  12. new Vue({
    ; L* d% |8 m* M$ ?2 c
  13.   el: '#app',
    1 ]  `5 p! s; b2 ~2 B3 P! |
  14.   data: {/ O; V- P; `# K- T0 F
  15.     picked : 'Runoob'/ y# f4 o( Y2 P  f, U. o, ^  b
  16.   }
    $ I9 Q& ^, K8 ~* u/ q2 t2 o
  17. })
    " N4 B6 A7 d4 [, D" @
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
( X- P7 W1 e- i7 L3 O8 w9 ]; f8 u
  1. <div id="app">( j4 _% Y6 q% I6 ?
  2.   <select v-model="selected" name="fruit">0 r2 ~: W; W$ T, @3 x5 z: m: W. w
  3.     <option value="">选择一个网站</option>  s3 ?4 J! t" O: F# u
  4.     <option value="www.runoob.com">Runoob</option>
    0 n* K) \  l% E- t/ ?' e6 V- T+ p
  5.     <option value="www.google.com">Google</option>
    0 h& j" n. Y8 q9 Q* M2 ~+ A% Z! e
  6.   </select>, W! K$ {5 w  x6 z
  7. # [1 X3 r7 ~* G- V9 {8 D* u
  8.   <div id="output">9 b, i; d9 v% [( ]
  9.       选择的网站是: {{selected}}
    7 B# o8 Z* B# e% g3 d% y5 l
  10.   </div>
    1 v8 |! C; i3 G/ a0 \- [
  11. </div>
    % U5 b; g! `2 H0 z

  12. 4 G1 V' u3 d3 J, J! g
  13. <script>7 E; i5 o& \0 A! j" L6 M1 ^
  14. new Vue({
    , a+ e/ v+ Y  ?. Z
  15.   el: '#app',  q5 ^* N0 K6 B# x+ V# J: S5 [- [6 Z
  16.   data: {
    ) b. D$ M4 s/ w* y
  17.     selected: ''
    5 r: p/ g- m' s
  18.   }
    , ~7 G: d( N8 \' R
  19. })9 M0 E& m9 h3 |1 s" |3 e
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->6 l0 D9 i* j; T$ a" x! V2 @
  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({5 q0 ], b# ~+ \
  2.     el: '#app',
    . d1 ?1 z$ X, a7 H
  3.     data: {
      @5 b) R, B. F, i$ N+ D1 c
  4.         checked: false,
    0 \" `/ s: N4 _6 O$ B. W4 z) Y/ j
  5.         checkedNames: [],5 \) Y* h  ^. q/ p' @+ M) Z
  6.         checkedArr: ["Runoob", "Taobao", "Google"]
    4 d7 h. E  _' i
  7.     },
    2 l0 J5 M' ~' t' S: o
  8.     methods: {6 L/ ^# m6 a; g6 _& E) d( E6 m& g
  9.         changeAllChecked: function() {7 {% F$ j+ c$ ?/ A- g% ~" ^
  10.             if (this.checked) {
    2 ^9 F+ T: L! h& i9 v4 b. U' f
  11.                 this.checkedNames = this.checkedArr
    ; N3 }! h7 r1 v
  12.             } else {: N( s* O+ E, v
  13.                 this.checkedNames = []
    " g7 |- {3 @( N. _
  14.             }
    . O# v! U; H" L9 M0 Y8 L9 G) p- N
  15.         }6 d( P) H4 q! M8 ~8 h. Z/ P4 Y
  16.     },
    6 b! {3 j* }4 a. S( C
  17.     watch: {
    # r- Z2 i5 i! c. F" Y) A
  18.         "checkedNames": function() {. o3 U! [0 _) V# j) o' R
  19.             if (this.checkedNames.length == this.checkedArr.length) {; P. `+ S* k( ~: E$ m0 d
  20.                 this.checked = true
    $ J' ?0 O% t# S2 T7 Q& V  {4 q0 I
  21.             } else {% F1 F7 a. C9 d7 N$ Z+ D
  22.                 this.checked = false
    3 ?. F( D- r# \, j: D( n+ Q6 P
  23.             }
    1 J; a. M& U* Y$ x+ M
  24.         }
    7 Y1 m2 M# H5 c8 |3 F
  25.     }# m+ k5 Z& }  }# V; m& v( X# I% S
  26. })
复制代码

7 n: y# J! C/ u9 ~) Z
1 L) y# P3 O/ c9 y
2 h9 x( e" z; c! i- a. H; |/ s- N( s+ o- ~! N4 U" G) A/ S
8 F6 h/ [. s  T4 I

6 k- c8 Q2 M! E) s0 Q2 W( v1 \+ [6 P) j5 e

8 z+ F/ J% f% j$ [  e  S9 r' i. h( y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 02:59 , Processed in 0.055870 second(s), 23 queries .

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