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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
) e" W1 a: y3 F$ N
  1. <div id="app">
    & W9 h4 J; R: p  c9 a
  2.   <p>input 元素:</p>7 M% u4 {& [: y4 P* a# |: Q
  3.   <input v-model="message" placeholder="编辑我……">
    , U; E/ l& y9 ^* F/ X4 V
  4.   <p>消息是: {{ message }}</p>9 g2 ~2 v9 E2 N' v
  5.    
    & k! W3 ~, O' ~0 s8 T/ b) G
  6.   <p>textarea 元素:</p>' k) q6 X# }4 H7 y3 ^2 |% y( n% w
  7.   <p style="white-space: pre">{{ message2 }}</p>0 _: Y8 a$ j  K. W
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>) c4 I. q7 J  L4 u, A' y" D
  9. </div>7 R/ _3 @% `" n  l( c: c* N$ k
  10. 8 u4 Q# V* j" h* x  I9 z4 H& g
  11. <script>, t& g8 w3 C8 B* V% p- X$ O5 y
  12. new Vue({6 H7 I8 C2 u2 e1 H/ S& q* Z" J
  13.   el: '#app',, a* S+ h5 U; s- L$ `7 x
  14.   data: {6 O+ j7 {3 ~1 u# _$ C: j
  15.     message: 'Runoob',& p2 K' V$ B. S9 x+ Y5 O
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'8 h- W' a2 L  Y8 `2 w/ y( |
  17.   }1 C( {0 M* a, ?/ @2 D
  18. })- _" A2 B5 G/ u( l7 x3 k
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

$ a) ~! g8 |* O9 Z
  1. <div id="app">
    ! V0 o- j: ~6 x: [
  2.   <p>单个复选框:</p>
    $ F. B$ V, ]6 ^
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    6 L# y' t5 F; U1 h
  4.   <label for="checkbox">{{ checked }}</label>. h3 ?. R1 L' f" c8 ?2 p) B! R
  5.     $ v5 y/ P1 o0 _# o' C7 b4 ]
  6.   <p>多个复选框:</p>
    ; I$ f" b. o9 ]9 _1 _
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">7 A# ]. p6 l/ Q  K( V+ I3 \
  8.   <label for="runoob">Runoob</label>
    / R4 A2 l* f- ]8 l, L
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">, }# ^/ V) F4 B  m
  10.   <label for="google">Google</label>
    7 Q0 E# Z& Z* J5 `# q5 A& d
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">2 B; `0 Z4 u( T3 p) ^
  12.   <label for="taobao">taobao</label>
    7 F1 [- e$ q- a5 o7 @
  13.   <br>
    : L& A+ A" X' i
  14.   <span>选择的值为: {{ checkedNames }}</span>
    . _$ t* ~$ H* I6 G
  15. </div>
    & y8 o4 ?; S8 c- q. @

  16. 3 O( I( U' b2 ]0 U1 z% q
  17. <script>; G: ^, S6 D- k+ u1 t; V! k
  18. new Vue({8 }3 E* _/ @+ a; u8 t- S; c
  19.   el: '#app',. f+ @& X( P' N  G) {/ t. @
  20.   data: {
    , t9 t& K- r3 ?& q" Q
  21.     checked : false,
    ' f& @$ n. x% ]4 s% V, l
  22.     checkedNames: []
    & G! V; j0 a2 U$ G, l0 E6 p; f
  23.   }
    & [' W1 d; j( ~3 F) e4 Q) j" I
  24. })
    1 V( e( ]8 s/ n* z* r- k7 G
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
6 E2 s  Z1 R' @& p8 p4 S
  1. <div id="app">/ E7 I* @. B1 f! v/ m% h% y
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    7 q6 T4 `3 X. ~5 b2 n. d
  3.   <label for="runoob">Runoob</label>2 f+ t& n! F5 W$ C' W( O
  4.   <br>
    & z6 X% d7 S$ N8 R. s
  5.   <input type="radio" id="google" value="Google" v-model="picked">8 D. l5 G$ N, _) e- i
  6.   <label for="google">Google</label>$ s3 |' p! y5 m' y
  7.   <br>) O+ R$ Q- e: H% @; j) G
  8.   <span>选中值为: {{ picked }}</span>" K5 o1 c2 d4 c0 x
  9. </div>
    , P- {/ r; e" I: [
  10. 5 ~; Q/ [& b& u; p
  11. <script>4 n- o, T: m  b" ^8 r
  12. new Vue({
    7 A3 o( k5 T' b8 z, w# N
  13.   el: '#app',
    + q; u4 Z; ~9 _7 B5 H1 L% d
  14.   data: {
    ' P0 e  i3 n8 y, R2 y. N
  15.     picked : 'Runoob'9 I4 g8 K* Y* {( h0 F! k4 ?
  16.   }/ ^4 t+ y/ m9 f$ J& b
  17. })
    4 e. h# v0 ?( I- F0 m9 N& q
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select" b+ Z9 u; b# x1 A* _
  1. <div id="app">; u( e+ y' U: h1 a0 @/ _
  2.   <select v-model="selected" name="fruit"># I+ o+ A# x% }  @% j& J: Q1 L# o
  3.     <option value="">选择一个网站</option>" v' E: J9 ^! ]9 b) d" P$ J
  4.     <option value="www.runoob.com">Runoob</option>
    : y- v( p- X; ?, `' {4 f% j: f
  5.     <option value="www.google.com">Google</option>
    ' W7 r7 Z- p8 W1 ^
  6.   </select>0 C# T( p& r# f6 {: r$ c+ G

  7. 2 h" q) M3 n  ?
  8.   <div id="output">4 G' m+ ^  d$ ?! v7 V+ \
  9.       选择的网站是: {{selected}}* ]8 O  g, L) K7 t$ j, ~
  10.   </div>
    * h$ d' z- [1 _7 _5 n6 A1 c5 \
  11. </div>
    ) v, G. Z) I- L7 H! s
  12. 2 I9 J+ I4 a8 f6 q
  13. <script>
    7 p" T' l. d8 O6 B
  14. new Vue({5 o8 [: r: o- t+ D) l# B* r8 z+ i
  15.   el: '#app',% N9 C) A% N& H% u6 N) j
  16.   data: {
    - x# I& n5 n: {6 S! D1 M# W" C
  17.     selected: ''
    * |# v3 K+ t3 P) y5 G! S
  18.   }: }5 X1 w" o  W
  19. })- V# j9 K7 P* |1 G5 L1 ?; q- a
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    2 _) s! s9 E' [3 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({$ O2 B" U+ K. ]( H3 p6 }
  2.     el: '#app',2 ~+ S1 C: O! |9 |$ o. {- S
  3.     data: {
    ' b( d# F: N6 o
  4.         checked: false,, t0 v) V* q1 V. C: M
  5.         checkedNames: [],1 p/ O7 X3 G) Q8 l+ q. I
  6.         checkedArr: ["Runoob", "Taobao", "Google"]; i6 b0 G) w0 C9 B8 B
  7.     },
    5 C$ y2 M: k0 h9 ~6 o+ g, m2 s
  8.     methods: {) b( B5 ^& ^9 [7 }9 U
  9.         changeAllChecked: function() {: y( q7 `, p6 g" n
  10.             if (this.checked) {2 M6 \' }5 V4 N5 A$ T
  11.                 this.checkedNames = this.checkedArr
    ' C  _+ E: l6 N+ Z# I$ ]8 M
  12.             } else {
    " X/ x# ~9 `9 B# x6 p
  13.                 this.checkedNames = []
    $ M0 d$ I# }% @( r) {7 y% r
  14.             }
    6 x% h% v2 q" s9 E; y' W
  15.         }- p4 u. {) u$ S
  16.     },
    9 b. j4 _( e5 s7 E( ?, U
  17.     watch: {$ @# D- W8 j" I; I
  18.         "checkedNames": function() {/ D3 _( k2 @8 X4 n
  19.             if (this.checkedNames.length == this.checkedArr.length) {  P4 P- n! c2 ?$ f( V
  20.                 this.checked = true
      G9 F& j! x  A8 a* l. l
  21.             } else {# u2 C( D& y# p2 H$ h& P& M
  22.                 this.checked = false( Q0 R/ K; A" T% V1 n
  23.             }! f! H" D" {- ?6 _
  24.         }* T3 u0 B- t% D' L1 V
  25.     }! I9 H3 r. x+ |( q- l! ]. E
  26. })
复制代码
, I0 n0 v( v- x4 m, n3 L! {  m

. w8 f6 P) d. t0 M
/ M  }% ]: W! c  A) _$ u% A, E" n) v" x& g+ l4 k
9 y" V* A5 d2 f$ f7 U

  x/ R/ X( m( x$ q3 c% Q# u: U& _+ D* C
+ o; |( G+ R' ?8 P( T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-1 09:31 , Processed in 0.176673 second(s), 25 queries .

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