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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

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

- ^+ ]% I( l* _: `/ A/ |
  1. <div id="app">, l' q: o. z; j. @4 p  r2 O
  2.   <p>input 元素:</p>
    : s' Y3 {: H4 q9 ]  k) e
  3.   <input v-model="message" placeholder="编辑我……">2 q3 k: @7 ~1 N/ }+ D3 r
  4.   <p>消息是: {{ message }}</p>
    1 e6 S4 H* d$ }* g% J# R
  5.     3 d6 o; R7 i; R9 D' W& b
  6.   <p>textarea 元素:</p>
    / T3 l% r2 k+ W+ E. ?! `( Q% {
  7.   <p style="white-space: pre">{{ message2 }}</p>( C# O/ T0 Y' s
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
    " B8 @3 r7 b# U
  9. </div>
    8 ~( ?4 \# ?) \
  10. , `5 y2 G. i4 P5 k) }, N1 u+ `# V
  11. <script>
    5 U7 C- E) a& |6 K
  12. new Vue({
    . `# Z2 }$ y, r$ A
  13.   el: '#app',
    : u7 b* L# v/ S" F0 a- J
  14.   data: {
    ! K9 B# F/ {. Y/ G2 ^
  15.     message: 'Runoob',
    8 P5 q# N& \+ Q- E
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    5 \! K! T+ p; a: K! U
  17.   }
    5 {  ?; U& W) ]: a
  18. })
    % l3 t5 r4 U2 g& q4 {
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

" i. D- y- Q: D$ W
  1. <div id="app">
    . u; q6 T( A0 z& A, H
  2.   <p>单个复选框:</p>
    " A/ X, A0 @% T9 ^* m5 i! s
  3.   <input type="checkbox" id="checkbox" v-model="checked">7 B9 h9 S4 \8 _5 |( p  U9 p9 h5 Q7 B
  4.   <label for="checkbox">{{ checked }}</label>
    8 K$ c* k' ^) |- W4 g, g* X) i+ B' O3 Q
  5.     7 N  F5 I% a0 q1 A
  6.   <p>多个复选框:</p>
    6 L( W" I" Y. S
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    / }' ~3 x! W6 V+ J
  8.   <label for="runoob">Runoob</label>3 r5 J$ B( c$ J) i: t0 ?. F; O
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    0 U9 [4 t/ |5 V# W) B
  10.   <label for="google">Google</label>
    ( A+ r' ^/ H* C" U+ T4 X3 y
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    4 F7 ^- @  u9 o. Z# u
  12.   <label for="taobao">taobao</label>8 m! h! m! X  J2 w% A0 S
  13.   <br>( m* K) c* X6 U( p3 n
  14.   <span>选择的值为: {{ checkedNames }}</span>
    + \+ O/ p$ O* r# \9 t
  15. </div>0 j5 U8 N% S, Q8 [/ B

  16. 7 o! ~. t- W  D' ?
  17. <script>0 V" h- r( P' K/ Y# G
  18. new Vue({) \4 s1 u1 q5 P2 @+ Q; p6 h; b6 o
  19.   el: '#app',5 t- G$ S- y& y7 d' i7 m
  20.   data: {3 w- l' y5 _+ R- X
  21.     checked : false,
    + z6 a1 _* u* o" E7 L: _: `
  22.     checkedNames: []
    1 c! B2 j! V' ~( I1 V1 K, o; W' P) ~
  23.   }3 ~: ^# q* @( }) ~8 b, `
  24. })
    . j/ |1 X3 W+ _! _" g3 S
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮! g/ b+ [4 Z* P4 m+ R3 V+ d# @
  1. <div id="app">
    9 [4 M2 C" N6 d9 b5 d
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    ) x, I/ f7 \: f' N& u# `
  3.   <label for="runoob">Runoob</label>( {3 `% F5 ]; z3 H) ^
  4.   <br>7 W( N( Q6 Q' ]8 S- w+ e- m
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    # G! y" R% X; G5 H
  6.   <label for="google">Google</label>
    / i- e; i/ ~/ D8 m
  7.   <br>7 \8 T6 _9 q) W& q/ ?  O4 N, \
  8.   <span>选中值为: {{ picked }}</span>
    4 r9 E) p& k* \3 i- F9 r$ a! L
  9. </div>+ d% Z2 y" [5 G
  10. 6 H4 Q6 K1 C2 n' @8 B( u9 _
  11. <script>) _# q& C# V' j4 w5 q3 J
  12. new Vue({. |; @: w6 t1 V- O# A3 B; b* J
  13.   el: '#app',
    $ X7 G6 J% F3 P& b
  14.   data: {' e5 m7 S6 `" M$ ^  d/ c0 b
  15.     picked : 'Runoob'
    & k) }7 Z1 a) I
  16.   }
    - m3 K- W1 ?1 q* g2 z
  17. })
    " o& x* |5 @2 M% a- R/ h6 y; H
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select& K: e3 w- P3 Z+ m& u* ?( B
  1. <div id="app">- U' c! i: g0 {  Y
  2.   <select v-model="selected" name="fruit">. [5 `, f: d' N, p
  3.     <option value="">选择一个网站</option>
    0 \; Y0 f, ]( v
  4.     <option value="www.runoob.com">Runoob</option>5 _9 ?% z8 ]$ {: ?5 K
  5.     <option value="www.google.com">Google</option>6 P9 G5 z3 W6 _9 S7 X, }8 |2 {
  6.   </select>
    1 l+ i+ p) ]. N' Y" l# t  ^

  7. 1 \+ [. t' b3 P, l' }
  8.   <div id="output">" [% a* h7 r- b9 d9 M$ D
  9.       选择的网站是: {{selected}}
    1 I* B" D2 y1 L+ [9 _
  10.   </div>
    . x+ y2 F: t* k, ~  k+ `
  11. </div>& B5 M; K: B* x- d

  12. # E0 k) K" E+ [' a
  13. <script>( `2 N( w7 U3 K- A% H
  14. new Vue({
    # K7 @, C9 n" M" ?5 T; I( K$ L
  15.   el: '#app',
    & T& @* Y7 q7 o7 a
  16.   data: {2 S( H5 N  R- e, x
  17.     selected: '' 2 V9 q! ~1 J. X- a
  18.   }
    # M3 g. s% o% }" a- F
  19. })  r. t  w7 t; k7 r6 g, v/ X
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->/ D/ s3 F9 E3 L7 I2 _- |& w. n
  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({
    : P" ]8 V* h6 z- `
  2.     el: '#app',- U) U, Y  a# C4 D
  3.     data: {3 T/ q/ Y% b; D$ M
  4.         checked: false,$ K  g5 ~( r9 \2 }4 f' @1 n
  5.         checkedNames: [],
    * P7 |, q+ J- E7 p# X
  6.         checkedArr: ["Runoob", "Taobao", "Google"]1 M; Q7 H2 w/ p4 _9 b
  7.     },
    # T' I  E, ~! y: U- }: q6 Y- s# J1 g
  8.     methods: {& @$ [" D2 n2 R
  9.         changeAllChecked: function() {
    : z& R2 R4 H' `( d
  10.             if (this.checked) {! u( G: J, s' G9 B$ C. d' i! [& n
  11.                 this.checkedNames = this.checkedArr" p/ ^( R- n9 T! V: `4 M# G
  12.             } else {
    6 a# c5 G2 c; s2 C  @: M
  13.                 this.checkedNames = []
    % ~( J$ q5 m6 P( _8 l  F
  14.             }
    ) g3 v9 P% ~* e( E
  15.         }
    ) H5 G3 M0 k- G# C% w6 f) f6 k, q
  16.     },
    8 U7 i# T2 i3 z' y
  17.     watch: {
    7 u" w6 _- Z, Y& N0 ]
  18.         "checkedNames": function() {
    5 i8 F8 j# I6 g& n1 X7 O+ z# ]) |
  19.             if (this.checkedNames.length == this.checkedArr.length) {5 q- O# U' ^% J, ?1 u+ V
  20.                 this.checked = true# U  {$ _' r* X- I5 j; q% n4 T: \
  21.             } else {
    ) P  S! O! p9 z8 i$ d- _
  22.                 this.checked = false) T7 ~8 k8 D+ B4 N6 s) a' k
  23.             }
    " z% }% ]" L# M" _' [, r7 q
  24.         }  u0 h8 |- V# U3 K- C/ k$ p2 t
  25.     }8 g& a7 h. ~$ g; W& j3 k7 }
  26. })
复制代码

4 N. w) {1 M  L5 H( y/ w
3 a* o3 @) t0 m+ d6 t
2 G, X7 e' B7 L4 i: |* n4 D- c; h
6 K, i. `8 i* S5 l( Z( n* B$ i' y8 V/ V6 s# A
3 W  e8 Y5 O$ l4 b" o
# E/ g- q  Y6 Q( X
9 H9 U* j% I8 j( a* q( `& t/ X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:23 , Processed in 0.063724 second(s), 22 queries .

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