cncml手绘网
标题: Vue.js 模板语法 [打印本页]
作者: admin 时间: 2018-7-1 23:16
标题: Vue.js 模板语法
Vue.js 模板语法Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
插值文本数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值:
- <div id="app">
8 l T$ s f" Q* e/ O, W4 _9 t - <p>{{ message }}</p>
5 k- x9 c' T) p' s - </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">
7 H; U5 ^6 n5 O2 T$ Q - <div v-html="message"></div>. ]8 u8 Z: `' Z) a# Y. e2 \ a
- </div>
1 c& Y' \2 I0 w; U/ c - * K4 R: T9 ~/ `, m- j
- <script>8 h) W( X& ?& X3 s+ ~* |. W
- new Vue({/ h$ u; a H C4 q2 ]% S
- el: '#app',
* X( d+ I8 r6 L h - data: {
2 P; q3 `8 W' p* n. {# l8 r3 P - message: '<h1>菜鸟教程</h1>'
5 S9 X( Z0 u' A1 @) b) H - }$ [8 V) }6 A2 @7 R; h: y; M3 U; k
- })7 p6 m' T- e' H6 s
- </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">4 `( A0 ~8 Z1 l6 v3 d# B
- <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
. h; A: o3 G- L. k2 j - <br><br>
& z N5 v/ R8 b5 C6 X& T0 X# Z - <div v-bind:class="{'class1': class1}">
, b# w2 A% p, M% y+ l1 c - directiva v-bind:class
- o! \' B2 L6 H& }4 N e$ c2 A - </div>( f, J; f7 _. t- x9 u
- </div>( s4 ^! x$ E: V
- ! w0 z8 F! ]# u
- <script>
* C" N+ h. i: t+ c7 s - new Vue({1 n7 p: g" s1 {' M, x8 q
- el: '#app',
5 x U7 m$ Z. O5 f q9 b - data:{
3 {* R& l6 `# b$ m- W - class1: false$ R$ O* L6 \6 G: B' R
- }
1 D" @( Y0 }3 Y$ l - });4 U3 z6 I! H7 x! \
- </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">
0 D; [: |2 } ?( b4 p- V - {{5+5}}<br>
% J4 j6 ~+ b1 R7 c3 f/ w6 t' w - {{ ok ? 'YES' : 'NO' }}<br>
% h4 L5 R: c( Q6 m% ^, Y% v - {{ message.split('').reverse().join('') }}
, x$ ^+ Z# T1 V5 {$ M - <div v-bind:id="'list-' + id">菜鸟教程</div>
$ Y# q8 k f h! x - </div>
6 N. P6 N/ v- V3 h6 C! R8 b h -
, Y$ t* T5 W: p5 z" s- }6 @ - <script> v0 E3 f5 A7 p6 }9 n4 {1 j- T
- new Vue({
5 |1 L* x$ X' v( |& a L - el: '#app',
3 I5 L6 S7 D$ O+ A# }) H - data: {
, j) g6 ~9 {$ \/ l, z; T - ok: true,
" r; R1 R0 Q) }& { - message: 'RUNOOB',, C; J, l7 Q7 k$ T! s+ ^, M; A
- id : 1
. g6 B4 P; g. a - }7 I( |; t6 ?+ N
- })! d* T& Y- s+ }! j+ M7 b! c
- </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">: _% w: E* V" R' Q6 r
- <p v-if="seen">现在你看到我了</p>. I0 |, B' w, ^' G' V$ d& C3 ?
- </div>
s# w8 C. c0 B% O3 z -
4 M! F S( |1 C7 F* Z" a+ O/ r - <script>6 v+ J$ H9 n5 [$ m0 h# v
- new Vue({
) v* ~0 s/ o" i3 c, Q! d; C. | - el: '#app',$ K) O9 w) j7 B, P6 }. ~' @
- data: {+ q/ N1 V+ b5 t; c
- seen: true* k. J# r2 k0 T4 N% \
- }- p$ G0 h" Z5 P3 c
- })
7 o" x z% C$ O D1 m6 t0 J0 C - </script>
复制代码 1 z; A" R4 \8 O
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">8 Z1 y3 \& ?8 K! U7 w* r: ?
- <pre><a v-bind:href="url">菜鸟教程</a></pre>* ^: G: s8 ~/ Y' M
- </div>
$ f! e* z0 O+ u: W* ^& A - 0 w/ @4 T G% b: Z! d
- <script>1 C$ Q2 d; u4 d" f* ^/ Y" \# O0 ~
- new Vue({
# y1 t$ R$ M2 @ - el: '#app',
7 h9 l" h5 J ^$ p7 E, F: B+ t - data: {
4 Q) t( A: g+ }. K u - url: 'http://www.runoob.com') o* a, e5 Q Q2 E) [! k
- }
& X' |* ^2 |3 ^5 O* M6 q - })3 g* H4 s& Z, G H
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码' T/ v# g) s2 K; d) g" \
- <div id="app">" [& G9 X5 |. N- W0 P, }2 }6 `/ ^
- <pre><a v-bind:href="url">Vue参数</a></pre>
- e6 D- _8 b; C; u* D- f/ ~
) y6 \" F5 c6 L7 ~5 D4 }- </div>& {& ~8 K9 M' k0 |9 ?* S+ r
0 a W* G7 k' q S# o+ |0 ]! b- <div id="app2">
+ }/ j- w# I/ P9 s5 e! @9 w - <p v-for="val in arr">
- _, D3 q$ x4 c1 i( e - {{val.a}}7 V* u; e* C( ^+ z0 `. _) R
- </p>
' O! h) _' b4 U - <a v-on:click="tap">点我</a>; X$ J3 a: k, _- P1 w/ Z2 R/ V
- </div>
; _& r, Y3 c% N* m; v - 1 Q& Y7 c* z, \* K9 d( q
0 ?) ?7 [+ Q0 z. y- <script>- e+ v& U5 Q) Y& f9 D8 y7 A( q* m
- new Vue({" e7 c4 ]: U2 J3 C
- el: '#app',$ d1 o+ y# s0 o
- data: {
8 T# i% r9 r$ \; D, [ - url: 'http://www.cncml.com'
/ L0 u6 U5 H. l: D7 | - }
7 K' E3 `" Q0 K b2 p3 f, I - })
& B t+ b3 u, R3 S1 ?: W% v - new Vue({" @) E# x7 ?5 G
- el: '#app2',
! Q! q3 h! x( P: m& [ - data: {( X5 i7 |$ J% y3 {( J
- arr:[' }8 ~' P& _# O
- {a:'bb'}, D2 l/ l% [: V8 @/ }( O
- {a:'cc'}0 F A4 a6 _# n: c8 S
- ]; j% M r- i$ i% X- ?2 E2 T! p
- },! X' y" ?3 p, C# s9 Z% x
- methods:{
4 \! F9 R# y& S( D. o - tap : function(){
( p. `8 J1 D' ^; _1 J" N - this.arr.unshift({a:'new'})
9 U- B/ {* ?" Q# V) W& [4 j- V/ b) X - }; R3 b+ s. e; Y% y5 M1 f: |7 e
- }
7 z o2 u/ o6 |: `/ v; M% ]0 U - })
6 e# F# P K/ i# T' d4 I: p - </script>
复制代码
. j& t; A! T& B2 n1 q$ g( w
% ~5 M; ]( N- Z5 ?4 a
在这里参数是监听的事件名。
% ~% E, g2 y6 O$ f. a0 s! X修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码 * c* H) C. {4 J# z5 b2 h
用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">' r( I" @. S1 k- p6 D
- <p>{{ message }}</p>: K% R" ]+ B: W' }, L% F
- <input v-model="message">9 ?3 j$ Z5 e! G) q5 |# O( d
- </div>
2 R3 b$ S" J) s: |) k - - \+ i- s) |1 d, h" e
- <script>( i, X. _5 z2 P6 u2 X5 r- C
- new Vue({9 x6 m! D( K, J& F% n
- el: '#app',
+ N$ O/ x/ e3 K( { - data: {; a' E! a& p5 q3 J, \9 e! Q
- message: 'Runoob!'
$ L7 c) f( i* [: |% j- Y; i5 ?: j& _ - }
) \& Y' I3 J# s - })5 G' f/ R3 F; ?; R$ @. ?
- </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">/ `1 _+ D6 O! K E
- <p>{{ message }}</p>
1 A: V+ Z0 S i( g - <button v-on:click="reverseMessage">反转字符串</button>
$ R0 ~& P2 |6 m, P7 k" k& ` - </div>8 w: ~- n6 F) R% O
- & l+ G, R A$ ?' F* ]( g2 ?& R
- <script>* g) g, n! Q9 M- L; W( g
- new Vue({# e; m1 P5 ^ }) [- L6 g$ G* L
- el: '#app',
; g1 x3 {) {8 m! i* h" u- m - data: {! D! |. \% f3 a- O3 h0 I9 P
- message: 'Runoob!'$ F3 H+ @+ _( E" Y% J
- },% x' |: k: I& g7 Y1 K) r4 @( o
- methods: {
7 C! O: s, t7 o P" K# b- M - reverseMessage: function () { y; |7 z0 w @# ^" q5 Q- @" z
- this.message = this.message.split('').reverse().join('')
) O4 K3 P4 Z: z9 d' h5 \! g - }% d! C2 B$ _# ^* U1 |4 Q5 | c
- }. a0 J0 T3 b/ B& a/ F% ^& f
- })
r$ C7 P* i# w8 u" A! y7 x - </script>
复制代码 ; y3 A; q5 A3 h% Q1 E! x: o( f7 T
过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->9 r' O2 E# p8 H, ]+ O9 w& J
- {{ message | capitalize }}
1 v1 F, n2 h5 _ v: m8 R
, H! M; i+ K: a! n m1 S- <!-- 在 v-bind 指令中 -->
; H0 P0 a/ D' R) r. x( k - <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">
! N4 X& _; a0 w1 U - {{ message | capitalize }}2 \# C$ a/ u" r4 n9 H6 R0 X
- </div>; H9 h( T: l5 E8 \
-
- X [* L) n8 U+ \6 T3 F# K - <script>7 K T& p8 T5 g) Q0 h% Q
- new Vue({$ k2 T v+ X$ m+ ^0 f, z2 p
- el: '#app',
# Q6 H/ _, O, { - data: {
, L) K9 f; p4 e% q1 w& k3 I - message: 'runoob'
$ W% _4 B2 q/ f: a - },
; c2 t2 j" d- p! W* M! w$ l - filters: {+ W- r+ H7 G% d$ q' @9 z# [ i `; Z8 ~
- capitalize: function (value) {
) U" o j& A9 D6 g - if (!value) return ''
h( p: v9 G @ I. W - value = value.toString()
- @9 N, t8 H6 ~: u. A - return value.charAt(0).toUpperCase() + value.slice(1). B j4 E3 ], q
- }
0 ]5 z0 F( a6 l) c3 T - }
h4 E" R) l2 z - })
6 w ^/ P3 E' ` - </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
# q4 ?$ R! t/ c* L( q# Y$ `" q4 F+ F% s# D$ G, y) I, J
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->- c. K. m% Y4 E& ^0 ]6 U7 O
- <a v-bind:href="url"></a>
& ^" b, D; C2 u. v- J - <!-- 缩写 -->
- G2 Y$ m; h2 ^8 J - <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 --># l* e7 h g7 H6 m' q L+ J9 f: L1 C4 \
- <a v-on:click="doSomething"></a>; ?3 H3 ^& [. ?, I
- <!-- 缩写 -->1 V8 @5 G3 e* J7 {& j, g
- <a @click="doSomething"></a>
复制代码 笔记
, S% i2 x7 e0 K& Q9 \给元素绑定href时可以也绑一个target,新窗口打开页面。* }+ [. O6 C4 t- i3 b- [
- new Vue({
+ q* Z" r; ]3 v6 K - el: '#app',% T1 F9 ~. ` f( f/ o l7 |
- data: {
3 _4 H( q( z& I( c' n - url: 'http://www.runoob.com',
; e( p8 [; h* y: R7 i: S - target:'_blank'6 O% [3 S: d- f0 {. e
- }
- I3 z# T/ [ B7 z# \ - })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
* A( E% L6 K! l/ \ y这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
2 h3 S0 N9 d6 y a1 F0 y6 t
! U. X% e6 p1 l* C7 k; W" N3 i8 J) a6 u, s5 S- `, P1 p: J- O- Q! u
) e* k$ X, j! C* b5 p9 U) x! a7 i% f2 O; d5 c! V/ K% |
, |7 N5 C& w" J0 k4 U
8 P) M+ t- `. M, L! ~: C: [! S3 k3 n2 K5 } Z- V( _! m
6 U8 D' S* w# g" n( [$ h
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |