cncml手绘网

标题: Vue.js 表单 [打印本页]

作者: admin    时间: 2018-7-4 11:22
标题: Vue.js 表单
这节我们为大家介绍 Vue.js 表单上的应用。
你可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
输入框
实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:

: e% f. I3 O0 t; x( I" O
  1. <div id="app">2 O0 y, A6 O1 o6 r( x5 G( v- Y
  2.   <p>input 元素:</p>
    * T1 t+ I. _& h5 F$ a+ w
  3.   <input v-model="message" placeholder="编辑我……">! s- s9 }3 U% G4 Q/ ?
  4.   <p>消息是: {{ message }}</p>
    . A- I1 g6 _( j7 k: M4 y
  5.     ) E" c6 r( r: U# x2 ?
  6.   <p>textarea 元素:</p>
    / m! Q; a& ^# T/ C% N5 e( I
  7.   <p style="white-space: pre">{{ message2 }}</p>/ S& g) g4 x$ Q3 A, B, V- H
  8.   <textarea v-model="message2" placeholder="多行文本输入……"></textarea>) [- T  ^! t; R5 ?6 D
  9. </div>
    / z; V" j: o  f6 V, g

  10. $ r3 `* b/ A8 u; }' t" g5 I+ f% R
  11. <script>
    3 h7 {7 z* G8 f2 I' s' |
  12. new Vue({- B) h9 w" t3 W6 F, g
  13.   el: '#app',) r8 D0 a  \1 z/ P& f
  14.   data: {
    5 u8 U. h8 m% j4 g% o9 B# }% v
  15.     message: 'Runoob',
    5 Q) h* x0 A6 E! W( T
  16.     message2: '菜鸟教程\r\nhttp://www.runoob.com'2 U# l: o7 E9 d
  17.   }  m5 F& w& a( ^+ T$ O; O
  18. })& M5 U' [( T3 C& X! b1 [& q
  19. </script>
复制代码
复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:
复选框
以下实例中演示了复选框的双向数据绑定:

' Q* d' g" @1 Y* o/ ]+ H+ B
  1. <div id="app">9 B& U5 P: `6 z5 P3 \3 |' d" p+ n$ X0 ?
  2.   <p>单个复选框:</p>$ p: ?" u4 e: r' O: y6 ^8 i3 D
  3.   <input type="checkbox" id="checkbox" v-model="checked">
    + ^' U2 J( v" o5 p' k( n( G/ h1 ]
  4.   <label for="checkbox">{{ checked }}</label>
    5 t4 H9 i, Y3 Z; o* X) l
  5.     ' H! g. [! m* q! U
  6.   <p>多个复选框:</p>
    3 U- P& T/ t2 j% k$ T4 j, H+ \; ?
  7.   <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
    ( p% |* _% @6 j9 B; g  j7 f
  8.   <label for="runoob">Runoob</label>4 U* F$ l: Z6 c9 ?: b6 ]9 x& X
  9.   <input type="checkbox" id="google" value="Google" v-model="checkedNames">
    # h  h; x: E* s% S; s
  10.   <label for="google">Google</label>
    & M$ i) D% r. j+ G! T
  11.   <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
    + B8 \. P2 X( b; g8 D$ y
  12.   <label for="taobao">taobao</label>
    . s: v+ Z& q* ^' {& _& N
  13.   <br>* P2 ], s! Z8 H
  14.   <span>选择的值为: {{ checkedNames }}</span>
    6 j- f2 s. H! ^, J
  15. </div>6 D" F9 e3 B' t! G8 T
  16. $ a6 m' G& Q  ?# w& t, q$ s1 @
  17. <script>
    6 E' W- Y  `8 G) T) K
  18. new Vue({; F" s( v0 G1 E7 Z  A' z) ?; Z  R  i/ V
  19.   el: '#app',' b) N- }% |( e% g. L, e8 e
  20.   data: {
    9 F, j; b7 O/ }8 w7 j8 y0 z
  21.     checked : false,
    9 l: l2 m' Z4 D
  22.     checkedNames: []' \% @8 r0 u; y4 A( W' _
  23.   }3 ~- j# |0 n! t9 e& P8 u
  24. })
    8 y$ g: P5 q4 v3 o' k. I  T
  25. </script>
复制代码
实例中勾选复选框效果如下所示:
单选按钮
以下实例中演示了单选按钮的双向数据绑定:
单选按钮) \( g# U5 F, c  I
  1. <div id="app">
    4 T) z4 Y/ p) V# f/ R* f. w6 T
  2.   <input type="radio" id="runoob" value="Runoob" v-model="picked">
    # E+ `4 S7 Z0 i+ B) H- d3 F" G4 T; Y
  3.   <label for="runoob">Runoob</label># g/ ]: U0 u8 W
  4.   <br>
    # S/ x& _; ]0 ~3 g
  5.   <input type="radio" id="google" value="Google" v-model="picked">( Y) K: Q# B# b  G2 t
  6.   <label for="google">Google</label>3 F) b* Z/ r& X9 w
  7.   <br>& r0 p$ l/ H. R- n! h8 c0 h
  8.   <span>选中值为: {{ picked }}</span>
      h) k) d; ?- y* N% _
  9. </div>2 {3 D. i1 R! c1 y

  10. ! _4 S! I1 i5 g* N/ b
  11. <script>& x: \  Q: l+ p/ ^% C9 H. N
  12. new Vue({
    0 J2 ^: t- l* j) N; S1 N
  13.   el: '#app',* N' G9 @* R( Q1 G0 p- s+ ]: ?+ A4 _
  14.   data: {, Y5 C' p) ?2 n4 |) e: R8 L* a/ L
  15.     picked : 'Runoob'
    ) N! L1 r; @1 ], {4 I$ i
  16.   }
    / B6 q; p- O- A; E1 n
  17. })
    8 {$ M* m: }) D) A5 i0 }
  18. </script>
复制代码
选中后,效果如下图所示:
select 列表
以下实例中演示了下拉列表的双向数据绑定:
select
2 q7 B- b/ I; R/ H3 I
  1. <div id="app">
    5 S' s1 h5 _* b
  2.   <select v-model="selected" name="fruit">! P* j+ S# Y5 V9 \
  3.     <option value="">选择一个网站</option>* m/ @% R2 n# W" X/ }+ z$ a3 K/ n3 X' O1 S
  4.     <option value="www.runoob.com">Runoob</option>) n: V( z( |. @
  5.     <option value="www.google.com">Google</option>
    ) ~1 ]' e* S3 q. p. T
  6.   </select>; G( E* ~4 y) I! W3 u/ s8 B4 |
  7. ) j+ n; w4 h* ]& c7 R
  8.   <div id="output">
    ) K; q0 ^  q; d8 j6 _" K( s: |
  9.       选择的网站是: {{selected}}* ~6 V/ ?% A- _; d% P5 R& m! J
  10.   </div>
    4 f1 l, a. V' o; b9 L) j" |9 M
  11. </div>
    . O: Y6 d) `; T7 q: F0 `
  12. * f0 X! D: N# x! D
  13. <script>' T$ j, g5 v* x1 Y4 @3 z1 i
  14. new Vue({) @7 l6 J/ n$ T' o  L
  15.   el: '#app',; K; a2 a  e/ c# O* }
  16.   data: {
    * ^* @/ P% e# @8 g- ?$ L% c
  17.     selected: ''
    ; x, _3 I$ W' q
  18.   }
    $ e- @0 L" k" N7 N; d
  19. })% w- j- e. a; }: j1 F
  20. </script>
复制代码
选取 cncml,输出效果如下所示:
修饰符.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
  1. <!-- 在 "change" 而不是 "input" 事件中更新 -->
    2 q( z1 b0 f3 O0 R
  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({/ f3 T% E* u) X( F
  2.     el: '#app',
    5 W+ l+ x! l0 V" ^
  3.     data: {
    * R$ [8 M4 c; Y4 Y& Z! r5 t: h
  4.         checked: false,0 n( T* V- X1 v& m4 r9 [
  5.         checkedNames: [],& w, a( o- Z' ^5 Q2 S9 p
  6.         checkedArr: ["Runoob", "Taobao", "Google"]+ U" L) l2 o/ r& l: R6 D& w
  7.     },
    ( D" ~8 q, ]5 L( m! K9 i; x) ]
  8.     methods: {* \" S  Z0 n% `
  9.         changeAllChecked: function() {
      ~0 a# n! }  j8 P. M3 r: T
  10.             if (this.checked) {2 P$ Z" d  q$ L5 W0 i
  11.                 this.checkedNames = this.checkedArr0 w; G" K7 T' N* |7 \  e8 ]
  12.             } else {9 p/ }7 t1 r6 f8 z/ n
  13.                 this.checkedNames = []
      {0 D1 {. W( L
  14.             }
    ( \& U3 v$ I' G5 _6 q+ e& b
  15.         }
    8 q- e& I# k8 S6 U
  16.     },
    9 g* M% p  u7 a9 g
  17.     watch: {
    ' ?0 |' y0 Z; H* K: o
  18.         "checkedNames": function() {
    . t% N4 T+ x8 @
  19.             if (this.checkedNames.length == this.checkedArr.length) {  D6 N' w# |8 y6 e$ a% q
  20.                 this.checked = true
    " O) p& k- D4 Q: J- E
  21.             } else {8 f6 Q  L2 [% Q: }
  22.                 this.checked = false
    2 L8 E# R" c1 b
  23.             }) y8 y' l, i" b8 Y: S. b0 a
  24.         }
    4 b7 J' [1 N& C% _, m( _
  25.     }
    " Q8 f+ N& G1 s5 E" V4 v4 y
  26. })
复制代码

( X7 k  e( e1 }" U& o, j: R9 Y( N2 s( x9 i5 S+ j: [8 [
' L1 a4 A4 |# [6 N; j3 y
& A' U2 L) \, E$ ^

% h/ m1 g6 d+ l7 t$ ]- s1 y6 m
7 i1 h4 ]  L% X7 |) J5 T
2 `" N' w# k& L, u1 o% ?  L  w
" v, A3 ?1 y3 Y" @; E- }& |




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2