|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: * h7 y( n, h9 L; B
- <div id="app">
1 x/ w4 a; E8 r3 X: `1 @ - <p>input 元素:</p>
, k8 {5 ]! T! e4 P' |; P% e - <input v-model="message" placeholder="编辑我……"> i9 U L- s N6 p! U) a5 X
- <p>消息是: {{ message }}</p>
, r2 Y4 g) l2 O% ]/ i+ v' F - 6 A$ f$ ~$ L/ }# M
- <p>textarea 元素:</p>, N+ ~. j4 ^( A5 P! f
- <p style="white-space: pre">{{ message2 }}</p>- g, p1 a U3 o% q/ t8 s
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>! i! S& q2 }8 W `7 C/ ~
- </div>
/ L; T; x2 e$ H2 \ - 2 I% A, m. R! F/ D5 Z2 ?9 ~ h
- <script>
" U" h+ `% S( n! u e - new Vue({
# ^* M0 n8 I' x9 I5 C5 A0 c - el: '#app',- U! Y, a$ u$ C: C
- data: {
3 Y8 ]; P, G, h: X: X: G' t4 @ - message: 'Runoob',
. o# `/ p2 @9 Y( \. V) I& J - message2: '菜鸟教程\r\nhttp://www.runoob.com'
x/ b! G8 }/ P' V& e - }- Z/ ^7 t$ M8 d; _' z; f& O- d; Q
- })
+ Z& \, l& H/ U% ] - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
% [ s; b5 N( e7 I( `- <div id="app">
0 ?" a: c/ ^5 s6 B" i - <p>单个复选框:</p>( e1 @, \3 M: V
- <input type="checkbox" id="checkbox" v-model="checked">
0 A- j9 ?# x2 @5 `$ _( I; t" d - <label for="checkbox">{{ checked }}</label>' M. j: c2 S0 V
- 8 P6 ?( q( ~5 L/ J8 i
- <p>多个复选框:</p>
8 K, C& U) c/ |" K& r! u# h& w - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">$ c7 T& p, X4 D$ o, p
- <label for="runoob">Runoob</label>
3 M) Q. h+ p+ p+ {/ [# l; s - <input type="checkbox" id="google" value="Google" v-model="checkedNames">9 S, z: O% B) j% }' _. }5 `7 Y3 R
- <label for="google">Google</label>
( h6 n6 `8 E. n: i& {, O5 A1 O - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
5 n( P' @. r- j% v, [: r - <label for="taobao">taobao</label>8 ^% M9 B5 T, Z1 ?! s( Q( V
- <br>
1 P% a4 ~6 C# q- q - <span>选择的值为: {{ checkedNames }}</span>5 p! T+ ^4 V0 o6 l! `" V
- </div>0 P5 s! v- Z5 ]4 }! A9 T; r$ I
- / W7 A" J, o; a! _8 X, |8 ]
- <script>
; m7 `1 u$ L9 }* z - new Vue({, _) i2 n" v. ]$ ~ D3 W
- el: '#app',& [0 y' X+ k" n7 i5 \- C' f
- data: {
' b; h3 y3 _( z, e+ F - checked : false,
0 v# S2 R8 j; v7 ^ - checkedNames: []
9 Y) W: X- N# W' i3 z$ o. Z/ b7 ] - }0 J+ N; m. g. A0 \5 k, Z3 n6 H# p
- })
9 Q* R3 w' v/ W8 l3 G - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮4 @2 q5 `1 t: B" z
- <div id="app">
$ O# n2 q, f/ G, z( f% O% x/ @8 ^ - <input type="radio" id="runoob" value="Runoob" v-model="picked">5 l/ |& q! y& W: D- ]
- <label for="runoob">Runoob</label>
J7 v, N5 {+ K - <br>
( r! K' c' A+ n' F" | u$ g - <input type="radio" id="google" value="Google" v-model="picked">
) G% U. |8 j0 p9 e7 N - <label for="google">Google</label>
; y. f9 n7 e' u - <br>
3 j7 E4 ] N: \% \ - <span>选中值为: {{ picked }}</span>( t6 T2 x1 x( I* k: ?
- </div>4 s- S# y; x6 e. Z( u! T6 D _
-
/ B8 Y5 z' r! A g: V, i9 [ - <script>
; C. r, j2 Z1 S - new Vue({* R- N. j! c% R3 e
- el: '#app',
( u; F$ w9 z0 S3 h1 V+ Z - data: {8 s0 L' ?7 R7 ]/ U( g
- picked : 'Runoob'# s, p; }9 O( t" D! m' R$ x9 d, x
- }: ?" X4 H* \) z5 P; h! A$ `& ?
- })
5 p0 N) c9 H5 Z( V - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select
1 f; `; {9 U( J7 b3 J0 r/ R- <div id="app">
. {5 V6 D. F5 ?: M1 x( r3 h: P- G5 y - <select v-model="selected" name="fruit">
, l0 E, i. v% C' W+ @& f - <option value="">选择一个网站</option>
% B8 D( [% W6 U6 m. W - <option value="www.runoob.com">Runoob</option>
. j+ b" ~: o, [# E5 h# G - <option value="www.google.com">Google</option>
" ]6 x" s' O' n8 H* ]. F - </select>
2 n. L6 }- Q2 G+ z8 v" x, }1 C -
0 V$ R9 b8 C6 J; x. ~6 l- c. v - <div id="output">
( ^9 d& _5 D0 g' ?) r+ R9 B9 n - 选择的网站是: {{selected}}
( }/ Y o' \: i$ L - </div>
4 i9 c4 n: }0 b2 l# I- ]& E - </div> ?/ |3 f# P* L/ a( A: g/ i9 E+ y# |
- & D5 L1 w" V4 R0 w
- <script>
2 T2 T+ s9 ^4 t9 S- |9 Y. p - new Vue({
& c% b% ]3 Q T: e - el: '#app',
$ a! G% W+ n4 N5 q6 p5 y: k- L' E3 K - data: {
" e8 j/ t' f* ~' s6 o& X- X - selected: '' 1 e' u% X1 r! h4 C
- }
; p2 [7 @- [; S0 ~ - }) h* e! A+ C$ T
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->7 L2 D! q7 P3 y: u1 Y1 D$ R% S* [
- <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, n. |5 e, [$ b4 W/ o5 l1 `
- el: '#app',7 }9 d# z1 w1 m+ k# J
- data: {2 a- t1 s. |, }" O9 `5 s
- checked: false,
5 @. X7 L6 I, v' J5 \ - checkedNames: [],
% }7 ]: i) B7 M7 k - checkedArr: ["Runoob", "Taobao", "Google"]3 j7 D! Q& o8 B* ~* M1 \9 f4 J4 f
- },& P: s( b& p. ~% F
- methods: {7 f+ R9 w+ R! r. b
- changeAllChecked: function() {* u& h. q* J% I$ ^4 P
- if (this.checked) {( \ T* S+ I M0 Z! t4 f
- this.checkedNames = this.checkedArr
7 Q7 m' [1 d- g - } else {9 }$ K) v0 x" \; G8 p
- this.checkedNames = []' b' `/ I; N0 j, e6 t5 o
- }* ?, w& @: r8 Y: B2 K
- }
% W. o. S+ ]) ~0 Z8 e$ ^! [, {+ @8 Z - },, p( a- O$ m. b1 p; p$ L
- watch: {
" D4 W& s2 S0 L; Y0 ]0 ^ - "checkedNames": function() {
0 q9 t( ?. r5 |4 j' C - if (this.checkedNames.length == this.checkedArr.length) {( ]$ x4 b1 L( Y) |! ~4 Q
- this.checked = true4 B! v" n+ u4 r/ q8 s8 @6 u: A: G2 H: p
- } else {6 o" I( S- G1 Y8 Y1 l3 x
- this.checked = false! v( s, U6 P& {2 {4 J2 }3 a' ~
- }, m( h( h: `4 w6 T$ p4 n: h5 z
- }
- q0 V- M7 b1 Y' r& c* l - }
) ]: Z0 M: \. D - })
复制代码 4 H% o8 W8 e3 @! }* z
^ C6 \/ }9 h( s2 f$ k
2 ~6 j. n. ^4 H6 ?$ r' ]
) \$ w) w% h$ _7 h1 Z" f) l2 }; }2 q7 j/ ]3 D& F5 z
3 k7 S, d7 ]3 w( F# p2 N
& I0 |- V4 b9 l$ h6 ]4 z8 U6 \) q) H$ }4 {* `6 ]; \
|