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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Vue.js] Vue.js 表单

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
0 g, X" r- V3 [  l9 p4 R5 C, h8 G
  1. <div id="app">& `+ O# F0 W5 Z9 r9 t3 a
  2.   <p>input 元素:</p>
    5 z' d$ j/ p4 t  z" u
  3.   <input v-model="message" placeholder="编辑我……">( v/ C8 D4 m9 N
  4.   <p>消息是: {{ message }}</p>* f; `& E+ s; c5 c; U* t* R
  5.     3 y( \5 ?; K8 g9 b0 e
  6.   <p>textarea 元素:</p>, v( {7 y# k+ F" {/ x; s
  7.   <p style="white-space: pre">{{ message2 }}</p>* _1 S% w! t4 `5 ?4 m7 k
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>! n' l4 f" Z1 |: D* b0 K6 j2 B7 m& k
  9. </div>- u1 ~  z: r9 I* r& b! f) u/ E0 Y
  10. 1 z  f' L) ~! e6 [1 \" T" @
  11. <script>
    : [  Y$ H$ ]% f: e0 {
  12. new Vue({0 l; ^3 X7 O; j* p& J
  13.   el: '#app',6 A. p! B: n: W& X9 L
  14.   data: {& e1 N) M3 `, i
  15.     message: 'Runoob',# c* f; \! |6 `
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'5 X  h9 j/ Z9 o7 z3 d0 E4 a5 U  K
  17.   }5 r! U8 ?4 J) x( t* ]
  18. }): Q+ \, D$ L2 s" y
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

" g/ Y/ V( s6 G& l
  1. <div id="app">
      p0 v8 \- S, n4 c' d$ P
  2.   <p>单个复选框:</p>
    ( a2 K. G8 X  {' U+ U0 W+ b
  3.   <input type="checkbox" id="checkbox" v-model="checked">8 f8 O- Y0 ?: p1 w
  4.   <label for="checkbox">{{ checked }}</label>; G- O5 k8 c% |
  5.     + S9 L& q: V# r! A$ I8 N4 S
  6.   <p>多个复选框:</p>( w5 n# U* H* T2 u& g) N
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    ! G7 z) z2 Q; O1 A# ^( ?* |: i
  8.   <label for="runoob">Runoob</label>
    6 t: w% Z8 @" d5 R+ ^
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    9 D* V2 d; t- p3 {# ]
  10.   <label for="google">Google</label>
    3 q3 A2 e& T; F& Y/ M. W& Q
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">% ^$ T1 }2 T2 a- ~4 ?, v& F
  12.   <label for="taobao">taobao</label>' V4 z2 M& @# b+ D
  13.   <br>1 I: w9 n" F1 z/ L' p& z; v) Y. o
  14.   <span>选择的值为: {{ checkedNames }}</span>* f4 f0 a) X4 Y0 b# U
  15. </div>) v9 [5 c7 o& x/ ?
  16. ( e) k* r" H$ Q2 ]$ w! J9 E. n
  17. <script>9 r* V* X& ^+ W$ r
  18. new Vue({
    , B9 i5 [2 h# _3 |  }" L
  19.   el: '#app',
    ! s% y) K. F- r3 z! p1 [
  20.   data: {, f. X/ ?: v& Z: N
  21.     checked : false,
    7 ~; y! R# h7 p  V  v: c8 q7 u- D
  22.     checkedNames: []$ m4 n& {) V# K" Y- k' W0 ^
  23.   }3 ?: V; h9 q& B0 }
  24. })
    ' m' f  P$ O9 K& {
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮
! B- l) x- Q9 V3 z. f% z- z1 ]4 W
  1. <div id="app">
    + r0 Z5 F% m8 a4 d& G# T" o
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    $ K$ s2 a; e+ s( S9 f: Y
  3.   <label for="runoob">Runoob</label>  d( k5 i7 i/ i9 _4 {
  4.   <br>0 R4 k$ M- G* M9 |
  5.   <input type="radio" id="google" value="Google" v-model="picked">
    # p* y6 Z/ ]" ^: z7 x( W" `6 `
  6.   <label for="google">Google</label>/ A0 X" P4 \6 t* t7 H
  7.   <br>
    + J3 N9 N! [; h) C+ i
  8.   <span>选中值为: {{ picked }}</span>
    9 _. Q! I# [( X  {1 O- L
  9. </div>
    9 e, @" k( r$ V5 H

  10. 3 d  q2 M/ i8 F( s. \$ s$ |
  11. <script>! [4 {# Y# y0 Q; d0 F
  12. new Vue({
    / F/ v. V, v2 `8 ~9 E
  13.   el: '#app',
    & \. I& J3 a7 B
  14.   data: {/ Q; }" g& M/ I9 ~9 {& c' E
  15.     picked : 'Runoob'5 ]9 _! v4 a$ C( ?9 L" T
  16.   }4 g9 U& R% ^  ?! l' Z/ G
  17. })
    7 b7 h; e  s4 T
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select0 T: ~8 J8 x7 Y5 G, L$ u
  1. <div id="app">
    8 M+ y" D1 b: ~' ^
  2.   <select v-model="selected" name="fruit">( g! @* A) I" i3 m
  3.     <option value="">选择一个网站</option>( D  o( g# n5 ]
  4.     <option value="www.runoob.com">Runoob</option>: q9 R, r/ \' K* F  F0 `
  5.     <option value="www.google.com">Google</option>
    5 d6 x: d1 L. u( W1 J  s$ \6 D7 Q
  6.   </select>. R9 Q- Q; r' q0 q
  7. + \, {7 T$ B2 Q# w
  8.   <div id="output">3 N- U8 q2 ^; ^- i& b4 f) e! ^" j
  9.       选择的网站是: {{selected}}- f; f, v+ \5 G* c: t; M5 T
  10.   </div>8 z  {4 ^! v  @& z; t- y
  11. </div>
    : S( q/ `. o, z% c0 [3 z
  12. . N& B5 [8 C7 m! ^, q5 G9 X+ d
  13. <script>
    , C5 H6 ^! r0 H  h, L+ G) Q) ?8 m
  14. new Vue({6 X. o# y* A$ @. A1 F  b
  15.   el: '#app',
    + G* H( s1 P1 p- V5 |# h
  16.   data: {
    ( ^2 ?4 t0 r" m
  17.     selected: ''
    3 e7 S( A! V7 _- H% {8 |
  18.   }7 N7 q- ~/ s9 U
  19. })
    # k8 o: u$ ]9 w/ B9 [
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    3 K6 F" d) B$ O
  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({; C$ \8 w" R. w7 |! _
  2.     el: '#app',
    4 a2 L2 K( @5 i, w; d& p
  3.     data: {
    ) l8 v# z% c7 i% h' T+ z( \
  4.         checked: false,
    , ~7 L* |# C/ J1 M; N7 ?# ?) ?
  5.         checkedNames: [],
    6 b. v+ d" ^3 L& r0 G/ s
  6.         checkedArr: ["Runoob", "Taobao", "Google"]: U) i" k5 `1 I, Q
  7.     },
    5 L- q" E+ Z/ Q  C/ l" i
  8.     methods: {0 O% y  w  Y# X# L3 E3 G6 P# t
  9.         changeAllChecked: function() {3 F+ l$ D8 p# K; ~6 c- n
  10.             if (this.checked) {
    ! u0 {) I( k% X( O+ ?* h' r
  11.                 this.checkedNames = this.checkedArr
    5 d) q" x# z' n
  12.             } else {
    ! v( }1 F. S! {% d
  13.                 this.checkedNames = []0 {: r+ \, W9 o* O  I$ t
  14.             }
    5 `- ~* b4 e, I7 O$ R
  15.         }
    3 c( W7 q* i% s  d* P" \
  16.     },
    : N4 U* L& {1 s3 n7 ?' ~9 m
  17.     watch: {
    0 U7 ^6 Y# Z+ [* e
  18.         "checkedNames": function() {* b# ]- n7 d3 B6 m8 G& k
  19.             if (this.checkedNames.length == this.checkedArr.length) {% ^- Q7 C4 I1 ^# E/ Q
  20.                 this.checked = true
    + }1 D( I: s/ O$ N1 _  g- q! Q* i
  21.             } else {9 P$ e  T2 S! {
  22.                 this.checked = false
    ! g8 }8 ?: V6 U3 N, B* ]
  23.             }# y0 i. z/ g; u$ q
  24.         }
    ; }9 T* R( x# p8 K/ P8 ~7 ?
  25.     }
    $ Z: ]- ]/ z; a# b' f* e4 S
  26. })
复制代码
+ T/ L6 |0 O  x& I% h5 E! @

/ x% B0 ^! a) P9 B% o3 [% b9 ~: A, [5 k: H

; }7 k3 H# Z) y3 N7 S& O( ^$ b
: d) O! K1 N; F5 s; }( T- E1 \

2 n- M0 ~2 @& Y$ K  E8 a) y% D( O5 w
% [9 q" R+ Q9 L3 A: j3 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 15:55 , Processed in 0.064020 second(s), 23 queries .

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