|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定:
4 e O3 X" X' H0 d& I$ l# z- <div id="app">- ~/ s( q( C/ {8 h/ h
- <p>input 元素:</p>+ J$ [; J4 j" x. D2 d0 @; i- }$ w
- <input v-model="message" placeholder="编辑我……">
/ u8 Z9 }9 ]" b5 G" f2 ^7 { - <p>消息是: {{ message }}</p># d2 g# p6 V! ?% V# r& M* m/ }
- " v3 L: V4 P- L+ a
- <p>textarea 元素:</p>
! K% \( Y. a/ v5 Z* R$ Q4 h. B - <p style="white-space: pre">{{ message2 }}</p>
8 l" M' ? H+ w: M* E' ?( F7 n - <textarea v-model="message2" placeholder="多行文本输入……"></textarea>' c* u1 b* t3 S4 j0 ?/ q, `/ S
- </div>9 K M. r7 a b! H6 c
- 4 }8 }% p, ?- Y0 {* C
- <script>9 m! ~5 ]7 `% ~4 s
- new Vue({
( @8 |# S+ ?' g; B" g - el: '#app',7 _7 q3 @& q) x, W4 N( C- m
- data: {
3 |9 b( f7 T, c- @6 ]- H5 e - message: 'Runoob',+ ]/ R# X) P7 J$ _8 q; [, b
- message2: '菜鸟教程\r\nhttp://www.runoob.com'
2 x0 D a% K& G ~. j0 T" B8 x" K - }: D; F3 R; e; L- p. e2 N: o
- })
8 f& l# _ X2 J - </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定: 2 |& V. p7 T5 }! ^# _& H& b
- <div id="app">
# u& |; W9 r. R/ n8 e - <p>单个复选框:</p>
6 D- i- j1 x3 g2 O% S* U, N - <input type="checkbox" id="checkbox" v-model="checked"># D+ z! B8 u) ?" M4 I- G
- <label for="checkbox">{{ checked }}</label>' i& U \( {; N1 \$ _
- 0 H+ u) T4 Q. P3 F2 ]
- <p>多个复选框:</p>
) P1 \, T8 |4 V6 I* b2 e3 y( z& M9 g, I9 N - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">+ \ T+ M7 V$ M2 ?
- <label for="runoob">Runoob</label>
' ^/ s8 x% k# F; K( D- x. K - <input type="checkbox" id="google" value="Google" v-model="checkedNames">
. x8 O+ b8 r# f3 M a9 p6 t; K - <label for="google">Google</label>
6 E$ G* W$ h6 S - <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">9 k4 v9 t" k7 K
- <label for="taobao">taobao</label>
4 q/ w) y- @# R# b4 r - <br>" r; x# z) R; u9 c
- <span>选择的值为: {{ checkedNames }}</span>& F' r4 F+ ~' Q& X) P+ W1 o
- </div>" f6 _/ @0 K; _; h
- & E, q5 b" e1 H# M4 Q+ G$ o
- <script>
" }: B# k0 _ J4 F - new Vue({
% ^' J+ f1 D. Y6 h- @ - el: '#app',
* f3 R# T& j9 L, w; J - data: {1 U' u' R! e* p9 I
- checked : false,3 l: ^# N1 k9 B3 F$ @, B1 p
- checkedNames: []
5 R. l( t4 {) ?& |9 m - }' a8 j; G- r `7 X6 F* i
- })
* ?! d @+ ]$ S - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮3 r0 J; f2 b9 ^& p6 G$ ]
- <div id="app">* G: r$ v6 t3 w2 X$ D
- <input type="radio" id="runoob" value="Runoob" v-model="picked">8 ^; a _* l9 ~* ]0 P
- <label for="runoob">Runoob</label>; k" @" ~. y4 w/ \9 y
- <br>+ X4 T) d. b5 M1 b* V- n q* X
- <input type="radio" id="google" value="Google" v-model="picked">
`( s! J( Q+ u, c" K3 q! R- k - <label for="google">Google</label>
$ F0 B" D V8 N4 U - <br>9 k' F4 s, ?; E5 g9 @8 A1 C
- <span>选中值为: {{ picked }}</span>
6 t5 v: }4 r( g: `, f$ h - </div> @1 m: d% O7 g1 m& y
- 1 i' B( C( e6 m. M M' u
- <script> }$ O9 u% J* V: ]
- new Vue({3 _+ F' w% t' ?, _ T8 j( _8 h; s# Z
- el: '#app',
* t; L/ w& @9 J } - data: {
3 k3 a# L/ E1 R6 `: E1 L2 D% l - picked : 'Runoob'
8 R! A! b! d0 n9 [7 U8 O - }7 N R! ^" j% d( Y0 C
- })+ M2 l p7 d5 D4 r) ?# a0 {* E
- </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select3 _7 `, U; b. [* F4 |3 ?$ r
- <div id="app">
. y7 B/ Z5 H3 U% N2 B - <select v-model="selected" name="fruit">
+ R/ W& o" f6 _: F; g, s5 c h - <option value="">选择一个网站</option>( ^* u a+ o$ h' x8 r0 J) x3 R
- <option value="www.runoob.com">Runoob</option>1 y6 I: @! E a
- <option value="www.google.com">Google</option>
9 L; e* Y, P% ]4 K3 C9 y# c - </select>) _0 V/ G8 P9 M& ^
- 0 y9 n& X- s u2 n
- <div id="output">9 t$ h6 j. q2 a$ ]$ t
- 选择的网站是: {{selected}}
6 b( X9 \, g5 {; R! }! O" l* J - </div>
- ?% d2 i8 e+ B( { - </div>. u4 ?& A& F/ J9 R: j- w8 b; h4 |
- $ f7 T) @% A3 W0 N
- <script>
* H2 b5 B3 {/ X% e1 i, _ - new Vue({0 `. b r6 H4 n% X7 ?3 M1 b( p/ {$ Q
- el: '#app',
' L* Z% u9 n$ a. {3 S+ `% ]1 G) @ - data: {( m) j5 l1 ` E; ?
- selected: ''
, J! j" o7 i% a2 v7 T - }" r: }% p* H" t+ K# D+ h
- })( g2 ]- S- f; Q0 W# e2 b
- </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->3 Y% Q6 I+ d: {& I, A7 D D
- <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({3 |) u/ ~5 p3 |/ U; [( I
- el: '#app',% P5 O# ^" J5 L c) C7 W$ |
- data: {, Q1 a+ O& f7 b' {
- checked: false,- n. z+ T N. {
- checkedNames: [],; W1 o. G6 i5 \
- checkedArr: ["Runoob", "Taobao", "Google"]; Q6 @9 s, f/ h* r: a/ c# b( h) i
- },; s4 b, p$ D. T7 F% D
- methods: {
9 S' u) T, Q9 E$ o' N - changeAllChecked: function() {
* Y! X* Z/ f, u7 U - if (this.checked) {5 ^% J3 v3 g/ p, Z. d9 c
- this.checkedNames = this.checkedArr) J4 y- t) A3 \6 I& Z. k0 Y' v+ @
- } else {
% d+ _( t k* B, S, q - this.checkedNames = []
& z/ Z J! P w! F: A+ s1 M. B - }) _% R3 j0 ^, T5 N4 u$ H4 u% W0 v
- }
* O, \ j3 p, E$ w! e - },7 s% A5 Z N7 { T' k! r
- watch: {, C2 l$ Y$ X+ E2 u
- "checkedNames": function() {- J0 g! d" Y8 L z
- if (this.checkedNames.length == this.checkedArr.length) {
5 K8 L2 z# Y6 p7 D* L3 W/ ^& E - this.checked = true* B$ N6 u7 }- D6 j+ |6 _
- } else {
# t; u0 U! i t9 a" l8 T& ?. c1 g0 v" r - this.checked = false* G- m* W" n$ b$ d
- }
) C& [! X% y& E1 w - }& l$ ~9 ]$ L: ^; ?/ U0 ?% F/ S6 H
- }
3 N4 \' a% W! K/ R, g+ ? - })
复制代码
: `8 r3 W2 z9 u$ |; W- V s' R3 P" W1 k( C6 I
; ]5 _) {" T' @1 F5 [7 ^6 t& w3 Q# p0 Y# a7 U' ?, g9 c+ F
3 H! Z$ a$ H0 y0 |8 k/ f8 w
4 Q1 v, B6 y6 C2 e3 }
5 ?- l" N- u. L6 C) `! R4 n
e7 ] h5 s( e! z( L+ n# r$ _. m |