这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
* ?' ?4 b( s% M1 K& w- <div id="app">! ]0 E3 `( M7 o
- <p>input 元素:</p>& N0 [' }$ w1 z
- <input v-model="message" placeholder="编辑我……">
5 ]1 w( ?5 Z' ] - <p>消息是: {{ message }}</p>
; `* B: g5 }! [ `& S+ t - ) r, |, C9 T a) ?
- <p>textarea 元素:</p>
- \% D. \2 O5 C+ ^ - <p style="white-space: pre">{{ message2 }}</p>0 ~5 l2 c/ }, Y! G' S' e
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>- K+ {( G# f' {) U! [' t: J
- </div>
2 |+ R$ X1 d* m' w {' T% B L - 8 q" ]- C+ x/ U {% v
- <script>
; X+ B1 D2 X) ]) a; Q$ c - new Vue({
, |& R5 d2 a2 X9 o4 P" E4 W - el: '#app',
4 n4 H7 g8 d2 I B - data: {
4 a' R/ t$ F$ B, r% T - message: 'Runoob',: j; z2 e+ D: y1 t5 S# @! d
- message2: '菜鸟教程\r\nhttp://www.runoob.com'
/ [- D2 C' Q F( X( I) w - }9 m3 J3 U) v. v& X$ d9 l- W
- })
# Z. k! f& ?% C4 p - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
" Q. N7 i/ w& G- <div id="app">; |! n6 x9 y$ m
- <p>单个复选框:</p>% T! ]3 m" Q; Z' G- Y. w9 J
- <input type="checkbox" id="checkbox" v-model="checked"># F; m5 s- B) t8 L" n% [
- <label for="checkbox">{{ checked }}</label>
( b/ t& k: ?2 n) A -
9 E4 p! E# I7 e6 v - <p>多个复选框:</p>* ?: D x* L8 K" c& \+ l
- <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
. c- r/ g$ @* G# V6 X8 m9 }8 n - <label for="runoob">Runoob</label>$ X) p0 L/ l4 q2 z2 s
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">
: Q2 t1 @7 J/ ?& ?' F6 I5 t - <label for="google">Google</label>/ K9 d1 z t9 o4 q9 x1 T! b
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
. O1 R4 G/ [ ?- R: V - <label for="taobao">taobao</label>
L3 W4 {- i; A6 i6 a/ `$ S - <br>
- A6 r0 h9 p9 O! a) j# D - <span>选择的值为: {{ checkedNames }}</span>7 y1 t$ r: N- U
- </div># m) k; L: e/ m0 E L* i. Y# k
-
. b& V7 }, M* [' F. ]1 ? - <script>9 a" N0 n! l- B# N
- new Vue({8 ~$ K1 |. C2 ~; h+ Z
- el: '#app',
7 ]& a% _5 E9 C P, q* Q3 L5 d - data: {
( d' U5 j D5 A1 t) j - checked : false,+ u/ O+ G" d! y# D/ f0 d( o
- checkedNames: []
, k* G5 {4 ^' ?% j. h3 j1 H8 F" _ - }
- }0 [) p3 ]" D - })$ v( D+ Q) p- t/ @# }
- </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮9 g/ Y b. }. C" y* v
- <div id="app">. E7 [7 f0 ~* y9 F) S* X: e- v3 Q3 W
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
9 O6 J' ]" f$ W- H C - <label for="runoob">Runoob</label>( S, n5 V {" N
- <br>/ M7 T9 z* O$ C8 u; H6 p
- <input type="radio" id="google" value="Google" v-model="picked">
8 C& w$ [ @0 _" P) B - <label for="google">Google</label>
5 l- J( [: v% D8 A - <br> x4 d! M, y+ r3 W* k% O
- <span>选中值为: {{ picked }}</span>
4 _& b3 T0 N) @9 d - </div>$ E3 h. j l# T) ~
- ' Y6 y- O, F& ]/ K: |# U0 I2 V
- <script>
" N& u( S8 ]8 Q; W - new Vue({
& t. w f7 ?% V9 e - el: '#app',
' G. x f k# u/ {$ b9 a# t, ?; Z - data: {& Y i$ X$ |" _3 ?% N8 G `
- picked : 'Runoob'3 C) J6 X. J2 x% ` U
- }
& q' }* h6 h# W - }); z+ C* Y* c7 a8 C5 A$ t
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select0 C. @, e/ q! H& C
- <div id="app">* l8 G7 s/ j1 W: z3 b/ g: @
- <select v-model="selected" name="fruit">
: m- X% M, e a$ L$ I2 ~+ u- t - <option value="">选择一个网站</option>
8 |. U( T; I) P - <option value="www.runoob.com">Runoob</option>7 Q8 y; f% I* |; T0 o; o) d
- <option value="www.google.com">Google</option># _! e y6 X2 v. j0 y
- </select>
$ k% H3 |; C4 c% _% o -
7 q7 P" d, y. ~9 ~6 n8 U - <div id="output"> g0 ]: M* v- y# l5 f6 y
- 选择的网站是: {{selected}}) Y# n2 Z( B6 r; Y3 ]
- </div>
, s, S$ d4 [6 c3 Z - </div>9 o, O% C9 ?1 C! Q# E% v% V# k
- 0 }; V1 \! `! g8 d& j. ]% Y( F3 m
- <script>% F# e9 ~; u) I2 }- W. X" j
- new Vue({: D J+ g4 Z& ?. ~5 A
- el: '#app',4 n: x: H( E7 B4 A5 k/ Z8 X
- data: {
! W' C4 k4 Y& n: } - selected: '' 6 E! }1 f" D; V& n$ G; U7 _1 o
- }+ [/ }3 Y5 X% V8 @9 D
- })0 o; \( [1 c! {
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->1 `. C! l v" W3 n& N; j
- <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({0 s1 v2 ^4 R: Y" H7 X& t
- el: '#app',9 Z2 `+ W. @( x& w. f# p
- data: {
1 R6 A% M) ^& u _% M, J j - checked: false,
% k; K+ O6 U8 U1 q+ r - checkedNames: [],7 F& p( C& ~5 Q! y
- checkedArr: ["Runoob", "Taobao", "Google"]6 S. {4 m O% X. p& G7 z
- },, d2 a3 a9 Y: v- F4 t8 b
- methods: {
3 c' l) G: Z% O+ K/ N& j - changeAllChecked: function() {: A/ {3 g; ^/ s9 t) w3 |. B
- if (this.checked) {" M* f! J6 k0 w+ W# ?2 ~6 ^" H& \
- this.checkedNames = this.checkedArr
& r. r2 {! r- N! i - } else {+ w& V5 s" w" T
- this.checkedNames = []; U2 q; A- J9 G) z
- }
% D1 W; E' D: N f - }1 `3 L7 i: w) z- p
- },2 D! _, f7 E0 ^
- watch: {
0 @* S! K) \- d' B - "checkedNames": function() {! g# M$ f" S5 K5 x A1 y
- if (this.checkedNames.length == this.checkedArr.length) {
4 o+ E" P2 M3 E- d - this.checked = true' k: U3 @& {3 i" E
- } else {7 J3 c$ p" V; ~) E1 W- h
- this.checked = false
, y$ F/ u0 D6 V- ^. ]6 w' b - }
* b; Y* ^+ T$ n# p9 g - }* b5 B. I7 \& o# k1 q2 `
- }; }0 E3 ]9 r% c5 O' ?; I: j
- })
复制代码 , g5 C) O5 I. v1 { J3 Y' t( [
: A! j; M3 b; H2 @1 ~
: j- }0 _9 m; F: L
1 |$ n8 }2 X& d+ y1 T- D
- @8 q. n6 _2 B0 m# C) v2 V& {1 m% p- u& N2 g' p
. b* H8 D- h: R, ^
9 r: ?. [" P& C- |0 J |