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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
! l3 t5 ]2 _+ |( A" p
  1. <div id="app">
    + E$ U" c, s7 N, j
  2.   <p>input 元素:</p>
    ! u  a" _% j" q+ }
  3.   <input v-model="message" placeholder="编辑我……">! B+ h" f# T( ?# l' |, U: a* o
  4.   <p>消息是: {{ message }}</p>7 c0 v- ^! z/ A4 ~/ ]) x7 Q
  5.     ' C- c5 S& j0 g! D. Y1 Q
  6.   <p>textarea 元素:</p>1 T0 m4 e& H9 G, x) \$ d" |( w
  7.   <p style="white-space: pre">{{ message2 }}</p>
    * s4 s9 n2 @6 m* I$ X/ M( j
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>6 l$ W, }( o7 G
  9. </div>
    ( Q/ X! b& M4 u5 J# i3 ?) b

  10. # F( Z- D! l. j, N4 H
  11. <script>: n" V4 U; Z" R& Y/ q
  12. new Vue({
    ( E9 }, O9 S/ t# h4 S6 o
  13.   el: '#app',
    * T1 k; E& Y# l6 h& N2 p
  14.   data: {
    + n2 a4 D+ d- q) B
  15.     message: 'Runoob',. H9 C; b& C" I8 o
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'
    1 }2 z: [! g2 G) H. ]6 U3 o
  17.   }
    8 R8 d$ \& X4 W% V9 \! \
  18. })
    * `7 V% j: }2 B5 M" M
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:
' q2 D& C2 X$ \7 w* }5 [
  1. <div id="app">/ x& F  }) y5 I9 S4 |: c
  2.   <p>单个复选框:</p>
    # `' e- m+ i+ E" \& f! B) ]
  3.   <input type="checkbox" id="checkbox" v-model="checked">& ~% ]; v2 G, P7 y7 j; o% _
  4.   <label for="checkbox">{{ checked }}</label>: N7 g' m. d* ?
  5.     & y' P& ?, ^+ k# m! Y- d( [) j
  6.   <p>多个复选框:</p>
    ! u( C9 p3 {& G% u# @! C. ]2 P
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">) B( P8 n  ?2 a& {
  8.   <label for="runoob">Runoob</label>
    ; u; B  P5 u+ l0 h6 i7 a) `5 t+ O
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    - E; o; o$ z2 }. i3 ?3 o4 }
  10.   <label for="google">Google</label>
    0 \& B8 j( M; U# n5 G3 @0 ^
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">5 l6 u8 I! t, W$ e
  12.   <label for="taobao">taobao</label>
    % ?5 X2 o8 t$ [
  13.   <br>
    1 `# }9 k" d5 }' J4 _
  14.   <span>选择的值为: {{ checkedNames }}</span>
    / l8 g# \4 Z- a0 |/ w5 M% y
  15. </div>4 n2 u( ?5 e- d; y
  16. + t. P  R6 S$ {8 Z. ]' G4 t
  17. <script>; b* V0 c. z% u, y& B% v- A& {- q" H
  18. new Vue({: G% Y- T9 s% U8 G' U4 U+ m
  19.   el: '#app',( [" v* y7 e& @5 f  x# d
  20.   data: {8 W2 x: t, E) @- I9 K0 _
  21.     checked : false,7 F. u4 P. {4 s& W# C+ K5 D
  22.     checkedNames: []
    $ G: ]- b' z. c- g4 A
  23.   }
    8 X# b' b1 e  s/ a8 O' T
  24. })6 |7 G2 f# d9 p4 Z& C1 ^+ v) s  J; ?
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮3 }4 }. n$ D$ o4 W  l, t) L
  1. <div id="app">
    $ t) C- Q" E2 s5 W# v
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">( E' ^' L  T" u* ]0 P+ m" G
  3.   <label for="runoob">Runoob</label>/ q; f$ w' X! @% a
  4.   <br>$ _- `8 N/ g* O; ~  z1 y" l* k
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    9 i' d* H" M& K- _; U! l# Q9 a
  6.   <label for="google">Google</label>, l" n1 l" P" T* a; w) M% L
  7.   <br>1 x  Y" i( m  q# }  Q
  8.   <span>选中值为: {{ picked }}</span>$ U( l  e6 m- \
  9. </div>
    6 F+ b( ]7 I& _

  10. 3 R, t1 _: Z' L
  11. <script>; e/ P6 R# t  l: W: X+ S" n! w' {/ b% a
  12. new Vue({9 W. T; h  ~) U7 F$ z. j
  13.   el: '#app',- r* \$ p* a' c/ F; l7 g
  14.   data: {1 A; U6 A# A" ]" L+ g7 b
  15.     picked : 'Runoob'" P6 c+ [4 W2 w  w5 n% u
  16.   }& j/ U/ B3 }- n2 M1 [
  17. }). |% _' ~6 a9 G6 L  a6 X2 K
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
$ X- W" s6 C8 z: n4 N
  1. <div id="app">1 t3 x) @6 `3 a6 n
  2.   <select v-model="selected" name="fruit">) s( k& i( ~% \+ V$ k- H) Y
  3.     <option value="">选择一个网站</option>
    - ^! H# m& \# N+ d! J
  4.     <option value="www.runoob.com">Runoob</option>5 G( ^# v- U2 ?- k1 B6 ?
  5.     <option value="www.google.com">Google</option>' m" d+ k7 i- r. ^! S4 t
  6.   </select>$ {. J) `) N5 a  V! K+ h3 L

  7. , M' v/ {; v8 v+ J9 L! u+ \
  8.   <div id="output">. \4 k2 }- j( @" t8 f& G
  9.       选择的网站是: {{selected}}' Z0 e6 @; j4 t* O) K
  10.   </div>4 k9 q4 a) H3 v9 x  L4 K, {* j$ R$ z
  11. </div>
    / [" C7 ?4 x% y/ O- }
  12. ' m$ `  ]& }6 y
  13. <script>% j/ `* ?6 R& v1 L3 E3 R! Q( Z: x
  14. new Vue({: D7 Z2 K& P0 j$ e
  15.   el: '#app',& t! G( y9 a* C. S
  16.   data: {
    1 ]5 f6 M# G0 H/ X
  17.     selected: ''
    & ~3 [4 x5 Y5 l# f: a" _: E, h
  18.   }" Y! G- }# x* `! D% [/ {: W' T
  19. })2 z: N$ R5 `; e
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    6 ^/ Z% ^% i5 `1 J- X: k
  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({
    3 y* @$ z% d; d% ?: {2 w
  2.     el: '#app',$ R+ m  s; f3 _1 N
  3.     data: {& L+ j) l, K0 Z2 Z
  4.         checked: false,
    2 D% a4 r% K/ W  M2 m4 J6 ^( G
  5.         checkedNames: [],
    * o( q" I$ A+ q& L; `- e1 @3 d
  6.         checkedArr: ["Runoob", "Taobao", "Google"]4 R4 N8 e% e, F
  7.     },
    / ]; L, |5 c9 Z6 r9 `
  8.     methods: {
    $ }, }* _) c# ^# X1 _- m
  9.         changeAllChecked: function() {
    9 S) {5 [/ @+ C8 S9 j, K9 d
  10.             if (this.checked) {
    3 V; J9 a2 I' n5 L: Y
  11.                 this.checkedNames = this.checkedArr, K2 Y) h* V  J+ |  z! ^1 i
  12.             } else {2 y+ l# m9 M) c7 y' R8 V
  13.                 this.checkedNames = []
    5 o7 ?: x* @, V* X0 S* p% m
  14.             }" x, @8 L, x0 N, s6 R
  15.         }& e8 S; g8 r6 y" G3 _/ Y
  16.     },( j, k: |/ K& b. G
  17.     watch: {
    2 }: _, `  s; N0 _& i
  18.         "checkedNames": function() {
    " y4 X! F! _" ~3 j
  19.             if (this.checkedNames.length == this.checkedArr.length) {; L) h: E: w% H
  20.                 this.checked = true
    $ t, `- ]9 M3 P. v; @
  21.             } else {. l5 P) Z, ~) M
  22.                 this.checked = false
    ' y4 K% ~* ~8 X; |7 h/ W0 L. O. O+ d
  23.             }. e7 g$ v5 M$ I& O
  24.         }7 E% t, I' I8 J8 v) t5 ^2 Y
  25.     }
    2 O8 z9 C- v3 }& |- l7 }
  26. })
复制代码

3 x9 x) t2 P4 Q- `8 F1 b6 I: n3 e' v& w8 |3 n9 e% W

; N  j. g9 l# k3 [% `2 U. o5 O* v1 {+ Y0 V1 }- a8 Q# w1 u

& r" T5 Y) T/ p/ Z! V* l
' e1 C; m4 A9 s. H. f0 P9 F5 |6 F( a, ^$ F! d3 ?7 p3 N" }

2 R2 n5 [3 @+ T) f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:39 , Processed in 0.057786 second(s), 23 queries .

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