|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
* S; q3 x( F! j- <div id="app">6 u& ^: M: k' s) r0 n6 l4 k
- <p>input 元素:</p>
' I6 y' [) z: g) H - <input v-model="message" placeholder="编辑我……">
+ U3 Z* i% e. U) F5 P' g - <p>消息是: {{ message }}</p>; q4 h9 v# C7 }# ^
-
, I% B0 C1 I7 L3 ?; _ - <p>textarea 元素:</p>
2 c0 {$ g4 x7 | - <p style="white-space: pre">{{ message2 }}</p>; j( ]3 F3 u% X$ U) T: }$ _, K
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>( U+ M1 v7 F1 l
- </div>
/ O+ b; G" U. M; K+ a6 i( \ -
# Z# W" o7 V( X& c% v3 P! A - <script>
( P/ H& J0 f) `1 y) l7 s# W$ ~ - new Vue({
" Y2 c$ n' ~- d - el: '#app',
1 B# i3 M: i# B2 e - data: {
7 z. \; {' n* J3 E' U' s0 G+ h - message: 'Runoob',
% D' S6 u2 j y6 e u, _ - message2: '菜鸟教程\r\nhttp://www.runoob.com'6 z( n4 R( H' ]( x \) `1 C
- }
0 `& n. ?$ j) h7 `/ D - }), m; A' r t! e8 W: @1 y
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
6 S% x4 c; e/ k* O: H u% A6 n- <div id="app">
( N9 D0 |- u2 o2 i - <p>单个复选框:</p>
, j5 J2 K( a+ ^ - <input type="checkbox" id="checkbox" v-model="checked">- l8 Q M0 C% a0 f. U# h
- <label for="checkbox">{{ checked }}</label>+ a$ [- k# L8 [" S
- 3 C; i- g3 O' A( `; _) {
- <p>多个复选框:</p>/ G3 f: N- M" s0 S$ h0 D# q7 f
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
4 T. ~2 ?4 H; v3 m- A! l0 B - <label for="runoob">Runoob</label>8 x. v, W$ J# J: @0 h
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">* b% T5 g' W/ |5 Q- @
- <label for="google">Google</label>5 S' G! [% ]/ _' K w$ P: K% d
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">5 K9 Q* {& \ ?( I8 J2 L
- <label for="taobao">taobao</label>. L! ^3 r/ ~, T$ }- ~% l5 P6 }
- <br>4 L H* g: Z# E( p
- <span>选择的值为: {{ checkedNames }}</span>
/ N% K) x$ K9 Y. J8 P8 A - </div>/ m+ G# i& |* j4 K+ l% K
-
: c0 i5 D" Q, Q: n B - <script>- V. U3 g- ]) ^" x
- new Vue({
( O( H* _# W1 M# b - el: '#app',& U* e1 N4 L+ g. f6 \) v6 d
- data: {
5 g' u: R, l! g$ u0 V - checked : false, [7 y# S( a4 W% P- x6 u
- checkedNames: []* K1 q8 Y1 p' c. Y. p
- }
! ?( i/ I9 F1 _7 a - })0 z( H- e% A' j3 b% {+ C8 V
- </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮
2 U7 z; p* H- c. F9 M2 k) X- <div id="app">
& k, V! y' f+ t& f - <input type="radio" id="runoob" value="Runoob" v-model="picked">5 w% [. [% ^' ^ w+ O. j5 |1 |; `
- <label for="runoob">Runoob</label>1 y1 S9 m! J" H$ y N
- <br>+ I! E% P) L( V( G( R( Q+ D
- <input type="radio" id="google" value="Google" v-model="picked">
7 w& X1 T& W2 g. L7 A - <label for="google">Google</label>7 e5 J2 ?; r& ^0 o; h& {2 C2 u3 O
- <br>) _3 J2 }5 J, [% ?' f
- <span>选中值为: {{ picked }}</span>( m9 k$ P3 L2 [, c
- </div>$ [4 z4 n+ Z M
-
# c; i+ q0 c; z9 E - <script>
2 ]* c2 h- L2 ~7 J8 x8 }7 C - new Vue({* l+ A( x: U& B$ u
- el: '#app',
, [5 k- K$ l: {) g - data: {) M* S2 g0 N3 c$ R. ^& [2 u
- picked : 'Runoob'6 s! V+ n; p/ M$ R! L
- }
& t0 B, G9 x& m, [3 U - })
5 v q+ o7 A7 T3 u" t8 r1 I. Q9 g - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
V9 b6 s2 D/ i4 }5 Y- <div id="app">4 h, g* B8 ~" N" n4 K7 U) ]
- <select v-model="selected" name="fruit">
: I9 ]7 a3 A( l1 H - <option value="">选择一个网站</option>
* G+ Z7 a# E8 G1 h$ C- Z1 K5 T - <option value="www.runoob.com">Runoob</option>4 f9 A8 ?1 L8 H( \
- <option value="www.google.com">Google</option>5 U5 l* ]* }* p4 g/ l$ q% h
- </select>7 w8 m5 ?, I+ `3 J: X1 _0 r: y
- 2 N/ N# J1 a4 J; Q5 }9 v# m3 [
- <div id="output">8 z4 Q0 t! e3 h8 ?
- 选择的网站是: {{selected}}! p% I5 x6 p, F/ U' K8 M
- </div>- }$ v( c6 c6 X2 M! V
- </div>
; L& T7 w1 r; t; F/ T$ U4 ~5 ~ -
0 N2 G ~# c, f0 o6 Y - <script>
% c1 {1 B6 d8 [3 S3 F: E2 C - new Vue({& D1 v( D4 r1 ? c
- el: '#app',
/ I% ^, S+ _" b4 L/ H0 Y: d! _ - data: {
1 }1 y9 `, ~$ V - selected: '' . b# @/ i r, l5 m
- }
7 @/ d% l# J8 n5 b w% f - })
0 i; _0 V, Z1 H# ^ P5 ` - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->
) l# i Z( V9 r$ a - <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({
# `% S. b8 }$ V" t - el: '#app',& P5 B0 ]6 S- |" `
- data: {
! X) m% S1 c% i* B9 w& P% C - checked: false,
" {$ i9 a+ [) g l9 r- W/ j - checkedNames: [],
/ O" U T) @7 H; I4 b; W - checkedArr: ["Runoob", "Taobao", "Google"]+ M: y6 L- T, |3 I2 H2 F. G! e
- },# ]2 A6 G Q0 D( A6 P. j1 X) M+ e
- methods: {1 I1 s9 `; K. H1 i: O% V& w& Z
- changeAllChecked: function() {
; [ x J/ x- a' @3 t - if (this.checked) {& F' Q9 s+ O9 o1 F/ `6 o
- this.checkedNames = this.checkedArr s8 F: }2 o" o
- } else {
) V: G, A9 C( t. h( Q7 m5 p L - this.checkedNames = []7 b' q7 b$ f! e5 }9 T7 B; o
- }! W: O) E# @; ]1 A
- }
5 `, Z; l: W" c. Y( f% o - },
4 }1 P- ?1 ~! {- g* y0 ]+ n - watch: {- ~3 M, V3 @/ \9 ^0 B o5 c9 w% i! v
- "checkedNames": function() {
7 ?% K' C8 l7 E - if (this.checkedNames.length == this.checkedArr.length) {: b! K" B! \& l
- this.checked = true, @! O' {6 l; @. N5 C
- } else {
! j; J# [3 J/ A* }7 ]4 J1 v! Z - this.checked = false
F* m. m9 m9 k, J! o - }/ _9 i3 z9 O0 g4 r* d3 I
- }
5 h. \/ o) K1 I3 }" `$ l - }( w5 _% O# c0 v
- })
复制代码 8 k/ H% z) c& J
0 [' F8 {+ l5 P/ F
& ^9 U v- j' G2 F8 T" y: {! w
/ N' q' ^9 Q9 U: v& a, w
8 f6 @4 ?' n# z6 g) D
$ M3 T4 x% `0 j5 A4 s1 W( x ]2 P) Y! k' w# i
& P- l+ w( Y5 o |