|
这节我们为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: * V5 a. ?7 A# M* T# U; {. y
- <div id="app">
9 _+ z$ Y5 h9 {3 Y - <p>input 元素:</p>
# h+ g E' ?+ x4 y - <input v-model="message" placeholder="编辑我……"> c5 U) G' {/ ~. f% }* [
- <p>消息是: {{ message }}</p>
S5 M7 @ |( P/ S$ L# q, c3 x -
; m( u* z3 G, y - <p>textarea 元素:</p>& C" R) G4 w3 y
- <p style="white-space: pre">{{ message2 }}</p>/ u) k; r/ E2 U) a4 M, T4 k1 z# G/ {) a
- <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
( n) O% `1 }4 ?9 p0 [# C9 f' D9 t - </div>6 u7 _5 d- i$ c+ }, L
- Z: ^. Y3 D: y6 L( q
- <script>
. D+ C. ^% A! i5 C - new Vue({
" G3 ?/ J% f9 k$ p1 n5 }; i( E - el: '#app',* P' K2 ]4 O Z0 u+ B5 o+ P
- data: {5 A( t- z% Z! ]8 g" w& v
- message: 'Runoob',
" m. x0 W! d/ B8 u" [0 T8 I2 q% [ - message2: '菜鸟教程\r\nhttp://www.runoob.com'
- H! [7 ]. }/ i! z! E6 [ - }
# R: o% H4 K" I7 k - }): q9 T2 Q! Y, W3 Y8 s! W- f4 ]1 f
- </script>
复制代码 复选框复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 复选框以下实例中演示了复选框的双向数据绑定:
, P$ {) S- [( f; S* z) o- <div id="app">& Q$ `: {1 `) p v0 R: m+ I
- <p>单个复选框:</p>
- i( |/ B1 Z4 D# m/ H - <input type="checkbox" id="checkbox" v-model="checked">: J( @. @# }" ? Q* ]; h& Z4 l& g
- <label for="checkbox">{{ checked }}</label>+ C; v% p# M' ]/ w$ r% W
- ( u$ u' ]+ D. J
- <p>多个复选框:</p>
! r3 n* S) q, n" e. e - <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">$ l7 A- b& V' v$ s0 Y2 r. ~" B3 u6 s
- <label for="runoob">Runoob</label>! u6 m6 {( R+ d5 t% I
- <input type="checkbox" id="google" value="Google" v-model="checkedNames">
) G# E" W5 v+ m" D - <label for="google">Google</label>8 y( a- {3 k" T0 P- k) H9 _2 w
- <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames"># q: B2 z% W" g8 I
- <label for="taobao">taobao</label>9 y: }3 ~3 k# ]- P/ ^) H% p
- <br>) O( z2 ?4 L, l. t- x
- <span>选择的值为: {{ checkedNames }}</span>, V, N9 X3 V W% V
- </div>. U+ n8 U% ~" |6 t% e# a& l/ x& ?- R
- . ?, Z) j- q9 M8 _2 I" ]) v
- <script>
, T' s+ }$ D2 S! ?: S* N: M - new Vue({) A4 l8 ~" ?0 H* W; q* V. E4 ^0 B4 C& j
- el: '#app',
' I* t; F8 a; }( a - data: {
' K5 a4 f$ ]5 g - checked : false,
% C. h, ^( E6 F7 V+ @ - checkedNames: []
$ G3 j; |# m9 [# J) ~ - }4 D$ Y/ d$ I9 \) U! y$ g
- })
) B7 N6 p, L0 s2 y7 [ - </script>
复制代码实例中勾选复选框效果如下所示: 单选按钮以下实例中演示了单选按钮的双向数据绑定: 单选按钮6 o5 X/ F8 {2 c, [ r( M, E' \
- <div id="app">$ _" @8 F' \$ j% q- m( X. e
- <input type="radio" id="runoob" value="Runoob" v-model="picked">
- z+ z) o- `5 ^! R3 c - <label for="runoob">Runoob</label>
b! H# P& U2 C! h! ?% Y8 u - <br>
% T7 L. X7 @% b# c - <input type="radio" id="google" value="Google" v-model="picked">
# Z" R+ k3 ?$ V+ k! Z - <label for="google">Google</label>
7 V! F' ]" l9 B: |7 K! g# H4 f - <br>5 ~9 N( ^7 S5 s) W6 @
- <span>选中值为: {{ picked }}</span>" Q* M Z& S" R/ a- e3 {
- </div>- _2 I/ H" v) P" |
-
3 F, h( t; v0 x1 B# q, P: | - <script>$ J) ]1 D/ Y' h% B+ e' L
- new Vue({
* l& l( t; L: E5 u5 t - el: '#app',
R( L( ]: E% `2 ]. K3 y - data: {
! N4 J' {" P1 g# b' @7 a - picked : 'Runoob'
* H& \3 H6 |1 \" S - }
; b4 X) `! Y7 F - })
( z+ [3 {! k/ ]1 u2 ` - </script>
复制代码选中后,效果如下图所示: select 列表以下实例中演示了下拉列表的双向数据绑定: select2 l9 R0 L4 F; X$ \4 P
- <div id="app">& O0 L8 L# e! g5 [( e4 ?9 h0 D
- <select v-model="selected" name="fruit">* @0 D1 T& J- H3 I8 `7 g% O* {: S) j
- <option value="">选择一个网站</option> N; S* V$ q6 M! W: F# j
- <option value="www.runoob.com">Runoob</option>4 |* h2 [1 X; _3 r
- <option value="www.google.com">Google</option>4 K2 n7 B& z h
- </select>
. B5 w! L7 |! P+ p - - f* r+ f: X6 h, ~9 C
- <div id="output">
3 M$ ]5 G5 q6 ]. a2 z5 C" c - 选择的网站是: {{selected}}- @ |% r; h5 Q" \; u
- </div>
/ a1 Y" t4 S9 n. q+ F - </div>
2 y P: w3 g: N- ~' z - . |+ e7 d, C7 F4 M7 P; p. E
- <script>
8 A/ d4 E8 ^) V - new Vue({9 W7 t: @# D5 v% `* F
- el: '#app',6 t2 O1 {2 R/ d
- data: {
7 L9 V. Y' V% X+ A - selected: ''
6 p/ Q g8 n, g3 e1 Q/ A' I: y, ~0 X* d( g - }
. e* n) \1 C% E( A" b. c1 s - })
; W) F) i7 r+ D& s* N: O2 H! D - </script>
复制代码选取 cncml,输出效果如下所示: 修饰符.lazy在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步: - <!-- 在 "change" 而不是 "input" 事件中更新 -->2 n t9 R6 f u% N2 O( B
- <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({
8 P+ K+ R+ j# s$ W% g5 u - el: '#app', ^- `& S/ @ k
- data: {$ ?6 e2 d& q$ t& } U3 C
- checked: false,; y- C; h/ O9 X3 C2 K, D
- checkedNames: [],* f* f" S+ j" W! T
- checkedArr: ["Runoob", "Taobao", "Google"]
0 T( l3 d* [" w) @' q - },* B+ p! `0 E. v1 d9 Y4 b5 F4 S6 R+ r
- methods: {
: {: I! n s, | - changeAllChecked: function() {
?/ X& h' I5 Z8 I1 D s - if (this.checked) {
: |* a3 H' \* J) ^2 u# ?6 d V - this.checkedNames = this.checkedArr: t0 p t9 L$ {+ J
- } else {( u& F* W* t9 C* l8 m* _" y
- this.checkedNames = []
$ p; J7 h# a: c% E% ~6 d - }
3 r" t |; m; D- n) O5 b& B/ G$ j! O - }
A8 T" o% Z+ M0 d6 |) V - },
4 M, a4 ?4 J7 g' `3 k9 d - watch: {
1 F r: Q1 K) c) d( Y& {, v6 a; K - "checkedNames": function() {
# ?5 r6 j: N# M: ], ?/ r - if (this.checkedNames.length == this.checkedArr.length) {1 x% |: F8 w+ _0 z
- this.checked = true
4 ?# }" U% |: l) T - } else {
+ H3 c4 t# T- i( ]& X- n" k. S8 R. \ - this.checked = false/ P. G/ q6 G$ m" B C- x" G3 Z) N
- }
* @! w- }5 _$ o6 u - }
& W. }0 p' g( X5 Z& M& b( H - }) r$ E" m: X! i, @) T
- })
复制代码 + ~8 |2 c0 ~8 B+ N5 a5 `4 T
4 w) p% n9 a% V+ F, t( r2 j% \5 Y9 L. V( F3 z% D
# H9 o- E) S: [' |5 A% m" [( D O$ X0 h7 s
/ O: {' u t# n( U f7 E. @6 D- L& W
. i5 a$ N& C7 q1 J1 a; c
$ W k& ]# P0 p9 y; e) u |