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">
9 a m% o4 C7 Q. N - <p>{{ message }}</p># F2 m" E' k' |
- </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">
3 W& c$ _7 ?! f; U& [ H1 I - <div v-html="message"></div>& _/ n" I, q" }0 A- n
- </div>: T" a% @* f/ r3 {+ t) A
- 6 t7 f4 ?* y% A
- <script>
( ?- T+ Y2 E* R" W& ~6 C9 L - new Vue({
( R; X& L) w( N3 b" m - el: '#app',
6 c1 `- Y* {/ W. j3 M - data: {6 Z9 T! W' ^* w, m5 Y
- message: '<h1>菜鸟教程</h1>') f) X/ H0 F D( Y% |) H: X
- } E1 L; ^0 C. L& c; }) n' _6 }
- })
+ n& |5 e# P) `1 V' t9 w* | - </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">: ~; O- ]# ?" j0 P6 z
- <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
6 n# U: B! d& O6 F - <br><br>7 k( M; m4 p6 ^6 ^) U- K, ~
- <div v-bind:class="{'class1': class1}">
1 {/ Y y6 a" u7 |' U - directiva v-bind:class7 {2 x/ H5 y( S1 t, f* F* X/ C
- </div>
, V. l8 l Z3 W7 F. Q% p$ J2 F, W' [ - </div>7 l' Y" ]0 n _8 i+ w
- - p( x# w9 b( C G& [0 ~) Z
- <script>
6 j! e+ k5 n" q' S7 O M - new Vue({5 V3 r; \8 @2 A% u
- el: '#app',
8 I) c% \9 |6 x) N. U& E$ M. Z - data:{
% E2 w. V5 a* K& x4 @ - class1: false
) f7 S) }3 `6 Q4 B3 Q- B$ P1 Z) K - }
: D- T% X7 {. p l+ Q - });1 c4 d, F9 v8 U
- </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">9 N, V; h; c1 \6 f8 [+ I. n% z y
- {{5+5}}<br>4 v# o6 x1 Q/ W7 v
- {{ ok ? 'YES' : 'NO' }}<br>
- ^. S3 d; p, w3 L- L( L - {{ message.split('').reverse().join('') }}. }; \/ U9 w' k9 i
- <div v-bind:id="'list-' + id">菜鸟教程</div>
; @# o1 o0 ?1 C9 Q# m/ ] - </div>4 q* x" J/ E! K: p& `
- 2 B# k3 Y6 p9 {9 a* B) [" y+ G- F
- <script>9 `( z v: S+ w/ k7 g; Q% V. G Q
- new Vue({) `1 r+ J! N J
- el: '#app'," P0 [; K. M4 _% b- V
- data: {
& ]& l/ W/ S" g o7 U9 X- F* N - ok: true,9 [# d( n* w7 W. ], Y& R% \
- message: 'RUNOOB',
1 ]: e Q& ~2 \) f - id : 19 Z$ o6 j; Z8 u# N) e
- }! N9 _) Y6 [6 `4 m j3 N. b F/ H2 i- x
- })
- O" `4 T, ^& Y5 |) W. l R - </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">
8 Q3 P% a; v+ } - <p v-if="seen">现在你看到我了</p>
) Z6 d& U& _' \1 m, g - </div>
( ]' H! Q. h( `6 [; G% i -
& } Z& A7 ~ o, e$ U - <script>
" ?1 l6 X1 X0 Q% i - new Vue({
$ }. w% G/ G' x - el: '#app',
1 @ H7 F- X9 b9 I% _8 M - data: {- V9 j$ O% [5 e6 `: p; g
- seen: true
4 T: t, e% O2 \% H: S - }
/ f- \( |5 O% h - })7 Q1 i( R+ k: J. T
- </script>
复制代码 $ {6 m5 s% J0 t8 {! `
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">
1 [6 H7 x# P: w' L& x - <pre><a v-bind:href="url">菜鸟教程</a></pre>! c: C, B) w6 n% b& t
- </div>
2 ]2 X4 H# C* f# q% X -
( }& m2 x4 |, U( b3 ~ - <script>2 h, b- Q8 M4 D1 P0 N j
- new Vue({
1 _9 ~; u3 \2 P9 J5 P3 C - el: '#app',
9 Q$ z5 n i5 Y- v - data: {
' h, g4 q" F$ o6 a- w; m0 ` - url: 'http://www.runoob.com'! Z$ m3 T7 V; y- y: y4 r
- }
9 w: u7 p. U! \9 U! _ - }), a k7 x, |4 I S1 }1 V
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码7 Q* F0 V4 W. |+ K1 `
- <div id="app">1 I. z+ Q0 ?9 ]3 V. W7 A/ X
- <pre><a v-bind:href="url">Vue参数</a></pre>5 E' z* ]' c1 S* k: e
9 `9 G# s. H P, C) ~" u- </div># t8 Z8 J& k" ~& A" G: n' R% ?
; y- \* B( c3 T" |, a9 j# U- <div id="app2">
3 |. |0 I4 N7 z& H4 ]3 \) _ - <p v-for="val in arr">( _ ]) [+ p( | S. C( e6 J) r+ h
- {{val.a}}' ?. H0 X, Z2 L' @/ C7 U
- </p>3 _% e; @; P g' D
- <a v-on:click="tap">点我</a>
6 l9 O% L3 e9 G0 U4 _9 G - </div>6 {/ \1 n. K" Z: A
! d9 e7 |% `1 q# X, Y- 4 g& F9 \2 } C) m
- <script>
( E9 I7 r1 W; Z+ A1 m$ X6 ] - new Vue({
+ B1 b( ~6 u0 h6 J: V% n4 o" } - el: '#app',$ K/ z# l2 i' {
- data: {
, h$ Z/ u, g1 a - url: 'http://www.cncml.com'
( @4 T6 O! ~ [* t5 o5 _ - }( X; A8 I' r8 h+ I" d4 Q
- })" m) Z) d; k( C; i6 I; U' n
- new Vue({
0 s- E& O' c8 A' S5 C& G, f - el: '#app2',
( x) ]0 c. \" S! n - data: {
7 _9 `3 N+ {: A$ k8 V0 ], ]( { - arr:[
$ W6 e. K. J( H$ E - {a:'bb'},9 w, Q2 y5 ^( h! |5 J
- {a:'cc'}. r* G2 I! ^' E& p8 E
- ]- ]9 ]0 H+ H6 a; F4 t \6 ~7 C
- },( d6 Q9 ?) k/ w
- methods:{
1 i* A* X: `) ?% V' w - tap : function(){
/ ?- w# m/ g# O+ m6 p - this.arr.unshift({a:'new'})! C, ?8 P' z8 u
- }
( i' X6 R4 m+ F - }
5 n6 i: b6 H4 y9 \1 e7 ^ - })
. T v# X& o6 W - </script>
复制代码
; w% B8 `3 z5 |3 I/ a% q; C% f% G. ~( o: A9 I) d) |- S
在这里参数是监听的事件名。
* F+ {# n; x: B
修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码 ' I7 V& }$ f7 a
用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">
8 z9 S3 H* B. J& | - <p>{{ message }}</p>% K/ P# J# V) V; a) g
- <input v-model="message">
) J9 A9 J$ `( A" K+ L/ p* n - </div>
6 I. q! f) D1 R/ T' j7 E) N -
; U" p6 T2 f. \ - <script>
( @- F W; f. Q! t' q - new Vue({
% H6 e' n/ C* Q( A, p - el: '#app',5 g8 Q) u4 N6 T7 J
- data: {1 ~4 P) E$ b2 C1 S2 e: C
- message: 'Runoob!'& }1 Z) w l( I$ |! o9 P$ o
- }7 J0 B8 g6 {2 Z9 z% Y% {! d9 c1 q
- })6 ~3 e+ o& _. O6 N% L
- </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">- B/ W/ w0 D& W; ~( B/ [* N6 E
- <p>{{ message }}</p>- O# n) b" E% _
- <button v-on:click="reverseMessage">反转字符串</button>
' O1 t* }# k& U) S* K6 e) n - </div>
7 x1 ^0 l- q( R. q( [! }$ f - 3 V0 x( h4 `+ Z X
- <script>/ R( Z* A& f8 M% H" Z
- new Vue({9 [$ v9 n! z' E' I7 ?" {
- el: '#app',+ c. ^8 r6 ^* |
- data: {9 H- \# e. Y: F2 k2 s, S# e, |+ x1 V
- message: 'Runoob!'
# \2 m8 }0 B: L- z2 u - },
. u: |3 `5 L- K - methods: {6 \% M1 B; e0 r7 K B4 y8 n
- reverseMessage: function () {
: D% E# L' A% c# k" M7 |/ g - this.message = this.message.split('').reverse().join('')% A* i1 k9 ^, g2 r9 X
- }
; S3 N) \+ }- u" i" `. v; ?2 h/ X - }, ?% i1 P/ S; n- l a
- })# T% C0 o* h( }5 G) G1 C
- </script>
复制代码 1 Y `2 F0 B( T& z% e5 Z
过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->& W* i' X" q# s4 C* x6 W
- {{ message | capitalize }}
% B0 T% \( }( j+ I6 R7 L( l
0 f9 N" |! U6 m0 l% t- <!-- 在 v-bind 指令中 -->
3 T3 L, }+ `, c, X3 `. a* u$ y/ i7 d - <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">) i2 v2 `4 \9 W" b
- {{ message | capitalize }}
' g6 V5 w5 y/ u% V A - </div>
8 d& I1 Q( ?$ S) |% x' t) ^3 s1 y -
5 R+ R; G6 [+ c8 M9 c+ l) { - <script>: \) y+ z4 i$ ]5 h& d5 q( M0 z
- new Vue({
2 T" K- Q7 p( k; n( J1 V - el: '#app',- J; _: q1 N; m" i$ k$ ]
- data: {
; v- e9 x) V: t) e% _$ y - message: 'runoob'- u2 v! X/ c5 |1 [) U
- },
. X" C+ W5 z! j - filters: {
5 B4 w7 T ~8 _# V9 k+ ^) q1 e - capitalize: function (value) {7 v7 q0 W5 o1 v5 I# Y4 ^9 l
- if (!value) return ''
0 t4 v* f' ~# P, k4 |/ r" \% H, L9 L - value = value.toString()
7 E8 s3 S% d( W- F* \3 E- W - return value.charAt(0).toUpperCase() + value.slice(1)
$ a" g8 K6 a G3 ]: q( G. g - }
" V G3 ^$ ], N* X# O - }
, c) u0 U! @% u( D1 W9 R - })) `# P9 q( j$ X! V5 ^
- </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
6 x" n+ R; H2 y& I3 ?8 P5 c. M) _8 o' E+ h
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->
0 c+ E/ S* ?/ y( E: F0 M2 c - <a v-bind:href="url"></a>
2 V6 q9 b k1 r3 `* X, R3 R H$ _ - <!-- 缩写 -->
) o1 h: I0 D" N+ ~0 W7 t; e - <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->
9 c8 ?, K/ Q# e& l - <a v-on:click="doSomething"></a>
# u. T: {- @" M8 I6 i k - <!-- 缩写 -->
% R* h, K+ }4 s& ^; ?/ u- n" ~+ A - <a @click="doSomething"></a>
复制代码 笔记
8 @# ?7 [+ s j给元素绑定href时可以也绑一个target,新窗口打开页面。( Y7 i M9 P, @. B. B4 l) n
- new Vue({0 ?6 S) o4 z1 f+ k) ~. }! z" c
- el: '#app',( Q: j" A2 x# x6 V6 P& ~
- data: {9 b2 X ~1 J( E1 a* |2 s0 T( s* x ?
- url: 'http://www.runoob.com',
( h/ E9 _1 N7 I: j4 q4 O6 B - target:'_blank'+ j$ f/ M& M) U7 y- z2 a& m
- }( s; T0 B9 j; W5 h+ `2 K
- })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
3 c3 f6 h- L: p5 F |! u7 h! z3 `这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
. Y/ W; k. b6 n/ G9 o+ K
6 }) Q- k* f7 }4 q! T3 o1 C( L
0 \/ w7 {- J7 Q+ a# h d! N" m
! W2 X8 C8 _+ r' [
# p- v5 q5 [+ E/ h3 R3 H9 a4 {" X9 H4 Q3 c# w9 m& X" \
; K9 I) b1 z8 {5 f) X) |$ B
8 J& c. z5 I8 b+ h# T& T
! A3 P" y( K9 c3 s/ a5 P
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |