|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: 0 g, X" r- V3 [ l9 p4 R5 C, h8 G
- <div id="app">& `+ O# F0 W5 Z9 r9 t3 a
- <p>input 元素:</p>
5 z' d$ j/ p4 t z" u - <input v-model="message" placeholder="编辑我……">( v/ C8 D4 m9 N
- <p>消息是: {{ message }}</p>* f; `& E+ s; c5 c; U* t* R
- 3 y( \5 ?; K8 g9 b0 e
- <p>textarea 元素:</p>, v( {7 y# k+ F" {/ x; s
- <p style="white-space: pre">{{ message2 }}</p>* _1 S% w! t4 `5 ?4 m7 k
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>! n' l4 f" Z1 |: D* b0 K6 j2 B7 m& k
- </div>- u1 ~ z: r9 I* r& b! f) u/ E0 Y
- 1 z f' L) ~! e6 [1 \" T" @
- <script>
: [ Y$ H$ ]% f: e0 { - new Vue({0 l; ^3 X7 O; j* p& J
- el: '#app',6 A. p! B: n: W& X9 L
- data: {& e1 N) M3 `, i
- message: 'Runoob',# c* f; \! |6 `
- message2: '菜鸟教程\r\nhttp://www.runoob.com'5 X h9 j/ Z9 o7 z3 d0 E4 a5 U K
- }5 r! U8 ?4 J) x( t* ]
- }): Q+ \, D$ L2 s" y
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
" g/ Y/ V( s6 G& l- <div id="app">
p0 v8 \- S, n4 c' d$ P - <p>单个复选框:</p>
( a2 K. G8 X {' U+ U0 W+ b - <input type="checkbox" id="checkbox" v-model="checked">8 f8 O- Y0 ?: p1 w
- <label for="checkbox">{{ checked }}</label>; G- O5 k8 c% |
- + S9 L& q: V# r! A$ I8 N4 S
- <p>多个复选框:</p>( w5 n# U* H* T2 u& g) N
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
! G7 z) z2 Q; O1 A# ^( ?* |: i - <label for="runoob">Runoob</label>
6 t: w% Z8 @" d5 R+ ^ - <input type="checkbox" id="google" value="Google" v-model="checkedNames">
9 D* V2 d; t- p3 {# ] - <label for="google">Google</label>
3 q3 A2 e& T; F& Y/ M. W& Q - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">% ^$ T1 }2 T2 a- ~4 ?, v& F
- <label for="taobao">taobao</label>' V4 z2 M& @# b+ D
- <br>1 I: w9 n" F1 z/ L' p& z; v) Y. o
- <span>选择的值为: {{ checkedNames }}</span>* f4 f0 a) X4 Y0 b# U
- </div>) v9 [5 c7 o& x/ ?
- ( e) k* r" H$ Q2 ]$ w! J9 E. n
- <script>9 r* V* X& ^+ W$ r
- new Vue({
, B9 i5 [2 h# _3 | }" L - el: '#app',
! s% y) K. F- r3 z! p1 [ - data: {, f. X/ ?: v& Z: N
- checked : false,
7 ~; y! R# h7 p V v: c8 q7 u- D - checkedNames: []$ m4 n& {) V# K" Y- k' W0 ^
- }3 ?: V; h9 q& B0 }
- })
' m' f P$ O9 K& { - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
! B- l) x- Q9 V3 z. f% z- z1 ]4 W- <div id="app">
+ r0 Z5 F% m8 a4 d& G# T" o - <input type="radio" id="runoob" value="Runoob" v-model="picked">
$ K$ s2 a; e+ s( S9 f: Y - <label for="runoob">Runoob</label> d( k5 i7 i/ i9 _4 {
- <br>0 R4 k$ M- G* M9 |
- <input type="radio" id="google" value="Google" v-model="picked">
# p* y6 Z/ ]" ^: z7 x( W" `6 ` - <label for="google">Google</label>/ A0 X" P4 \6 t* t7 H
- <br>
+ J3 N9 N! [; h) C+ i - <span>选中值为: {{ picked }}</span>
9 _. Q! I# [( X {1 O- L - </div>
9 e, @" k( r$ V5 H -
3 d q2 M/ i8 F( s. \$ s$ | - <script>! [4 {# Y# y0 Q; d0 F
- new Vue({
/ F/ v. V, v2 `8 ~9 E - el: '#app',
& \. I& J3 a7 B - data: {/ Q; }" g& M/ I9 ~9 {& c' E
- picked : 'Runoob'5 ]9 _! v4 a$ C( ?9 L" T
- }4 g9 U& R% ^ ?! l' Z/ G
- })
7 b7 h; e s4 T - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select0 T: ~8 J8 x7 Y5 G, L$ u
- <div id="app">
8 M+ y" D1 b: ~' ^ - <select v-model="selected" name="fruit">( g! @* A) I" i3 m
- <option value="">选择一个网站</option>( D o( g# n5 ]
- <option value="www.runoob.com">Runoob</option>: q9 R, r/ \' K* F F0 `
- <option value="www.google.com">Google</option>
5 d6 x: d1 L. u( W1 J s$ \6 D7 Q - </select>. R9 Q- Q; r' q0 q
- + \, {7 T$ B2 Q# w
- <div id="output">3 N- U8 q2 ^; ^- i& b4 f) e! ^" j
- 选择的网站是: {{selected}}- f; f, v+ \5 G* c: t; M5 T
- </div>8 z {4 ^! v @& z; t- y
- </div>
: S( q/ `. o, z% c0 [3 z - . N& B5 [8 C7 m! ^, q5 G9 X+ d
- <script>
, C5 H6 ^! r0 H h, L+ G) Q) ?8 m - new Vue({6 X. o# y* A$ @. A1 F b
- el: '#app',
+ G* H( s1 P1 p- V5 |# h - data: {
( ^2 ?4 t0 r" m - selected: ''
3 e7 S( A! V7 _- H% {8 | - }7 N7 q- ~/ s9 U
- })
# k8 o: u$ ]9 w/ B9 [ - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
3 K6 F" d) B$ O - <input v-model.lazy="msg" >
复制代码 .number如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值: - <input v-model.number="age" type="number">
复制代码这通常很有用,因为在 type="number" 时 HTML 中输入的值也总是会返回字符串类型。 .trim如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入: - <input v-model.trim="msg">
复制代码全选与取消全选 - new Vue({; C$ \8 w" R. w7 |! _
- el: '#app',
4 a2 L2 K( @5 i, w; d& p - data: {
) l8 v# z% c7 i% h' T+ z( \ - checked: false,
, ~7 L* |# C/ J1 M; N7 ?# ?) ? - checkedNames: [],
6 b. v+ d" ^3 L& r0 G/ s - checkedArr: ["Runoob", "Taobao", "Google"]: U) i" k5 `1 I, Q
- },
5 L- q" E+ Z/ Q C/ l" i - methods: {0 O% y w Y# X# L3 E3 G6 P# t
- changeAllChecked: function() {3 F+ l$ D8 p# K; ~6 c- n
- if (this.checked) {
! u0 {) I( k% X( O+ ?* h' r - this.checkedNames = this.checkedArr
5 d) q" x# z' n - } else {
! v( }1 F. S! {% d - this.checkedNames = []0 {: r+ \, W9 o* O I$ t
- }
5 `- ~* b4 e, I7 O$ R - }
3 c( W7 q* i% s d* P" \ - },
: N4 U* L& {1 s3 n7 ?' ~9 m - watch: {
0 U7 ^6 Y# Z+ [* e - "checkedNames": function() {* b# ]- n7 d3 B6 m8 G& k
- if (this.checkedNames.length == this.checkedArr.length) {% ^- Q7 C4 I1 ^# E/ Q
- this.checked = true
+ }1 D( I: s/ O$ N1 _ g- q! Q* i - } else {9 P$ e T2 S! {
- this.checked = false
! g8 }8 ?: V6 U3 N, B* ] - }# y0 i. z/ g; u$ q
- }
; }9 T* R( x# p8 K/ P8 ~7 ? - }
$ Z: ]- ]/ z; a# b' f* e4 S - })
复制代码 + 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 | |