|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
- ^+ ]% I( l* _: `/ A/ |- <div id="app">, l' q: o. z; j. @4 p r2 O
- <p>input 元素:</p>
: s' Y3 {: H4 q9 ] k) e - <input v-model="message" placeholder="编辑我……">2 q3 k: @7 ~1 N/ }+ D3 r
- <p>消息是: {{ message }}</p>
1 e6 S4 H* d$ }* g% J# R - 3 d6 o; R7 i; R9 D' W& b
- <p>textarea 元素:</p>
/ T3 l% r2 k+ W+ E. ?! `( Q% { - <p style="white-space: pre">{{ message2 }}</p>( C# O/ T0 Y' s
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
" B8 @3 r7 b# U - </div>
8 ~( ?4 \# ?) \ - , `5 y2 G. i4 P5 k) }, N1 u+ `# V
- <script>
5 U7 C- E) a& |6 K - new Vue({
. `# Z2 }$ y, r$ A - el: '#app',
: u7 b* L# v/ S" F0 a- J - data: {
! K9 B# F/ {. Y/ G2 ^ - message: 'Runoob',
8 P5 q# N& \+ Q- E - message2: '菜鸟教程\r\nhttp://www.runoob.com'
5 \! K! T+ p; a: K! U - }
5 { ?; U& W) ]: a - })
% l3 t5 r4 U2 g& q4 { - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
" i. D- y- Q: D$ W- <div id="app">
. u; q6 T( A0 z& A, H - <p>单个复选框:</p>
" A/ X, A0 @% T9 ^* m5 i! s - <input type="checkbox" id="checkbox" v-model="checked">7 B9 h9 S4 \8 _5 |( p U9 p9 h5 Q7 B
- <label for="checkbox">{{ checked }}</label>
8 K$ c* k' ^) |- W4 g, g* X) i+ B' O3 Q - 7 N F5 I% a0 q1 A
- <p>多个复选框:</p>
6 L( W" I" Y. S - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
/ }' ~3 x! W6 V+ J - <label for="runoob">Runoob</label>3 r5 J$ B( c$ J) i: t0 ?. F; O
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">
0 U9 [4 t/ |5 V# W) B - <label for="google">Google</label>
( A+ r' ^/ H* C" U+ T4 X3 y - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
4 F7 ^- @ u9 o. Z# u - <label for="taobao">taobao</label>8 m! h! m! X J2 w% A0 S
- <br>( m* K) c* X6 U( p3 n
- <span>选择的值为: {{ checkedNames }}</span>
+ \+ O/ p$ O* r# \9 t - </div>0 j5 U8 N% S, Q8 [/ B
-
7 o! ~. t- W D' ? - <script>0 V" h- r( P' K/ Y# G
- new Vue({) \4 s1 u1 q5 P2 @+ Q; p6 h; b6 o
- el: '#app',5 t- G$ S- y& y7 d' i7 m
- data: {3 w- l' y5 _+ R- X
- checked : false,
+ z6 a1 _* u* o" E7 L: _: ` - checkedNames: []
1 c! B2 j! V' ~( I1 V1 K, o; W' P) ~ - }3 ~: ^# q* @( }) ~8 b, `
- })
. j/ |1 X3 W+ _! _" g3 S - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮! g/ b+ [4 Z* P4 m+ R3 V+ d# @
- <div id="app">
9 [4 M2 C" N6 d9 b5 d - <input type="radio" id="runoob" value="Runoob" v-model="picked">
) x, I/ f7 \: f' N& u# ` - <label for="runoob">Runoob</label>( {3 `% F5 ]; z3 H) ^
- <br>7 W( N( Q6 Q' ]8 S- w+ e- m
- <input type="radio" id="google" value="Google" v-model="picked">
# G! y" R% X; G5 H - <label for="google">Google</label>
/ i- e; i/ ~/ D8 m - <br>7 \8 T6 _9 q) W& q/ ? O4 N, \
- <span>选中值为: {{ picked }}</span>
4 r9 E) p& k* \3 i- F9 r$ a! L - </div>+ d% Z2 y" [5 G
- 6 H4 Q6 K1 C2 n' @8 B( u9 _
- <script>) _# q& C# V' j4 w5 q3 J
- new Vue({. |; @: w6 t1 V- O# A3 B; b* J
- el: '#app',
$ X7 G6 J% F3 P& b - data: {' e5 m7 S6 `" M$ ^ d/ c0 b
- picked : 'Runoob'
& k) }7 Z1 a) I - }
- m3 K- W1 ?1 q* g2 z - })
" o& x* |5 @2 M% a- R/ h6 y; H - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select& K: e3 w- P3 Z+ m& u* ?( B
- <div id="app">- U' c! i: g0 { Y
- <select v-model="selected" name="fruit">. [5 `, f: d' N, p
- <option value="">选择一个网站</option>
0 \; Y0 f, ]( v - <option value="www.runoob.com">Runoob</option>5 _9 ?% z8 ]$ {: ?5 K
- <option value="www.google.com">Google</option>6 P9 G5 z3 W6 _9 S7 X, }8 |2 {
- </select>
1 l+ i+ p) ]. N' Y" l# t ^ -
1 \+ [. t' b3 P, l' } - <div id="output">" [% a* h7 r- b9 d9 M$ D
- 选择的网站是: {{selected}}
1 I* B" D2 y1 L+ [9 _ - </div>
. x+ y2 F: t* k, ~ k+ ` - </div>& B5 M; K: B* x- d
-
# E0 k) K" E+ [' a - <script>( `2 N( w7 U3 K- A% H
- new Vue({
# K7 @, C9 n" M" ?5 T; I( K$ L - el: '#app',
& T& @* Y7 q7 o7 a - data: {2 S( H5 N R- e, x
- selected: '' 2 V9 q! ~1 J. X- a
- }
# M3 g. s% o% }" a- F - }) r. t w7 t; k7 r6 g, v/ X
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->/ D/ s3 F9 E3 L7 I2 _- |& w. n
- <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({
: P" ]8 V* h6 z- ` - el: '#app',- U) U, Y a# C4 D
- data: {3 T/ q/ Y% b; D$ M
- checked: false,$ K g5 ~( r9 \2 }4 f' @1 n
- checkedNames: [],
* P7 |, q+ J- E7 p# X - checkedArr: ["Runoob", "Taobao", "Google"]1 M; Q7 H2 w/ p4 _9 b
- },
# T' I E, ~! y: U- }: q6 Y- s# J1 g - methods: {& @$ [" D2 n2 R
- changeAllChecked: function() {
: z& R2 R4 H' `( d - if (this.checked) {! u( G: J, s' G9 B$ C. d' i! [& n
- this.checkedNames = this.checkedArr" p/ ^( R- n9 T! V: `4 M# G
- } else {
6 a# c5 G2 c; s2 C @: M - this.checkedNames = []
% ~( J$ q5 m6 P( _8 l F - }
) g3 v9 P% ~* e( E - }
) H5 G3 M0 k- G# C% w6 f) f6 k, q - },
8 U7 i# T2 i3 z' y - watch: {
7 u" w6 _- Z, Y& N0 ] - "checkedNames": function() {
5 i8 F8 j# I6 g& n1 X7 O+ z# ]) | - if (this.checkedNames.length == this.checkedArr.length) {5 q- O# U' ^% J, ?1 u+ V
- this.checked = true# U {$ _' r* X- I5 j; q% n4 T: \
- } else {
) P S! O! p9 z8 i$ d- _ - this.checked = false) T7 ~8 k8 D+ B4 N6 s) a' k
- }
" z% }% ]" L# M" _' [, r7 q - } u0 h8 |- V# U3 K- C/ k$ p2 t
- }8 g& a7 h. ~$ g; W& j3 k7 }
- })
复制代码
4 N. w) {1 M L5 H( y/ w
3 a* o3 @) t0 m+ d6 t
2 G, X7 e' B7 L4 i: |* n4 D- c; h
6 K, i. `8 i* S5 l( Z( n* B$ i' y8 V/ V6 s# A
3 W e8 Y5 O$ l4 b" o
# E/ g- q Y6 Q( X
9 H9 U* j% I8 j( a* q( `& t/ X
|