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">* |) Q3 J+ ^( f( b
- <p>{{ message }}</p>
( g2 }. n: k1 n' u" r1 u- u - </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">. k8 Y: l% {7 h$ ?+ p1 ?# e; m, o+ \
- <div v-html="message"></div> _' y" X/ L; }
- </div>
6 Y) z/ q ~0 z/ {, K- E -
c- z( R/ n6 _% { - <script>+ V/ e% T" e; y! _8 z/ N1 A1 h
- new Vue({
# O; Z6 W# A1 r3 A) K - el: '#app',
( y4 [9 {; V y, c - data: {
6 Z+ E; @. \" H, ?. h; q7 w - message: '<h1>菜鸟教程</h1>'
' S$ p: I0 `2 n" t d3 ]4 V - }
; l) }9 G( s1 k# w( |: k7 U - })4 h2 A1 b/ t6 P- s2 ~% j! J
- </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">
" B w# ?1 ?' a' g - <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">6 _% n3 D, G$ \' S$ t* Y
- <br><br>+ c+ A7 t: U! q5 R0 i2 t q
- <div v-bind:class="{'class1': class1}">
$ r# K) q* O3 @" W: A: s) m T- |' i - directiva v-bind:class
$ h$ T, s0 s+ d8 Y9 Y/ z/ j - </div>
; w. `5 g! J: l# z3 G Z% G7 y - </div>$ @0 t- r& I, o
-
4 `$ _' f7 z) |/ m3 t2 Y - <script>
4 ] F, h' k7 m; V - new Vue({
) Q! ^8 i6 ~9 E# _9 [9 O, Z - el: '#app',
4 N( m& Z- u$ r. C+ e. Y - data:{. ~4 e1 A3 c; o1 t7 x1 H2 I" D
- class1: false8 T* S# Q7 u' A
- }
$ {! I! a w1 P. X- y8 l - });& S$ F' E% N! R" ?: I+ G
- </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">
; H6 |+ j! s. P( W& @& J - {{5+5}}<br>
4 o( {( `: b$ U+ w' f% R - {{ ok ? 'YES' : 'NO' }}<br>
0 n% B1 h* q) ?% X) t8 V" B8 v - {{ message.split('').reverse().join('') }}
8 m+ i h: D# t4 a - <div v-bind:id="'list-' + id">菜鸟教程</div>2 ~& X4 Z; E- o4 @# o
- </div>
O5 ~8 \' H- f( w -
- x( B9 x/ [; o- z6 {& k - <script>
) |1 f0 [9 V7 F1 n2 p. T, X3 f! C - new Vue({3 @" k( r+ G. J" f, Y
- el: '#app',0 f, a! \9 @. n0 g. m
- data: {4 M. H' J. s" i9 j' ?' _
- ok: true,
; [2 T4 e" I, _* N% z9 x - message: 'RUNOOB',5 A4 B- M: c7 _6 }
- id : 1( M8 E2 `; a$ X2 H* s
- }! w+ S: z' _, U8 b' w
- })0 F: r! W, S8 b% |
- </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">2 z4 Y2 o3 L" [, }
- <p v-if="seen">现在你看到我了</p>
& i$ U* g @2 m4 D: D# { - </div>
, F/ S2 W) E- Q6 S - 8 f5 G8 _9 U0 f
- <script>
/ _; w' J# P7 k, R G: X - new Vue({) k/ U# j: S- X; j
- el: '#app',
( n( \4 Y: T1 o( ] - data: {1 u/ q3 ?) n4 n
- seen: true; d+ ]* Q' P: C' e6 p
- }0 r3 c2 x$ ^5 k2 T0 W+ k
- })
, a9 k* h$ q9 T6 ?) E) | - </script>
复制代码
) Z7 D' V) U. G这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">& G7 B3 N( t. u5 x$ H& s
- <pre><a v-bind:href="url">菜鸟教程</a></pre>* `0 y* t3 D" q4 f2 I
- </div>$ w# M( @# ?- g
-
. M$ s1 V3 {; J9 u - <script>' s& c. x2 O o, J8 Z
- new Vue({% P+ o, X. m$ @ B
- el: '#app',
, q/ o- D! N+ R( s - data: {
0 ?3 K/ U( u3 D; c1 n - url: 'http://www.runoob.com'1 W7 h& B" E% W/ x
- }
( w% e7 ` M; ~% x" A1 a" A- J - })- F Y% {8 C+ N* d* L
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码3 `! I& g- U/ U) v& V
- <div id="app">& B8 \* k+ r9 e( T) S N$ O
- <pre><a v-bind:href="url">Vue参数</a></pre>4 C5 P2 x) x# f9 \( G; w- X
- : P' d- R K; X/ O& m
- </div>1 |% ?0 Q* p* o
; D/ i! a I3 v9 B- <div id="app2">
( E% [$ [$ ]! Z8 o* H Y - <p v-for="val in arr">
- ~3 f c; u, [% g5 c3 k+ u% } - {{val.a}}
( t# t' W- y2 D& C3 S) S - </p>
+ Q [# `# Y9 c" ~9 [ - <a v-on:click="tap">点我</a>2 c7 C0 P+ L2 ]1 t
- </div>0 L+ G$ Y2 V _4 i
- : d7 b7 y4 Z- |5 }# \# K0 G
- ! l/ u% i2 o( ~! \% V
- <script>$ ~: d8 C2 U. G, r& g/ ?; j& G: H
- new Vue({ ~0 a0 w' w5 w! G$ }# D9 L2 K9 J! B
- el: '#app',% W5 S q. l* D* h8 E* M
- data: {
8 U: k. u. A" O) }4 x0 D) _ - url: 'http://www.cncml.com'! ] K, ]3 O h/ |# K
- }2 B3 Z. L- {8 ]5 R H; K- @
- })
% Z! ?8 {2 K! e8 d3 d m; K: `' \ - new Vue({
) X1 V# Z- k1 T0 l. V* _& L. e$ w - el: '#app2',* b7 `- G! h- j# e
- data: {
0 a0 q# B, `$ ~+ F+ j( J - arr:[
, Q0 T H, F4 J9 I, j. m - {a:'bb'},* @* _8 _) ]8 L9 q2 L( _6 e
- {a:'cc'}9 w" W2 N( @" N! e
- ]2 F# J& L3 @% N4 u. `* ^
- },
3 u8 X. ?% M' {& Z) V, K - methods:{6 X" V' f$ k. }, \: C7 N
- tap : function(){
$ B! o0 h& o& Y$ h8 h& m - this.arr.unshift({a:'new'})" D" }( U# Q" G( U# {2 M7 d2 G
- }. B! m( Q) o k+ z' I
- }4 x: L. R6 F# ]" M' r
- })
2 i7 s# j8 @1 z* @8 W& q - </script>
复制代码
7 L- Y8 Q7 Z3 r
) o5 d7 R0 f. l" ?' B
在这里参数是监听的事件名。
2 l8 T( T+ B( I' m, P修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码
0 E7 ~+ X0 j5 K5 I1 j2 b. H用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">9 Z4 M! v. ?# [. X' u* x
- <p>{{ message }}</p>
7 B j5 h; @9 O. M; ^+ j" Y0 A - <input v-model="message">
4 s3 f# \, `" {1 [ - </div>
/ h5 t) x' `7 \3 u3 f# E1 p! B -
5 E% N( G9 @1 W( u0 `, V - <script>
4 z, m2 |8 [1 D2 Z( k( w+ |2 q - new Vue({3 R( Q& ]% _1 l8 O5 u% F* H8 c
- el: '#app',6 d. ^& b$ Y2 j/ w3 `
- data: {1 R3 R) M. @- N, ^5 U9 F) p
- message: 'Runoob!'
; s6 E1 \( B& {1 ~ - }( I5 O, H+ j* ]3 [* p% o4 L+ H% Y
- })
8 @; j% Y. [" Q {; i% Z - </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">
1 V# a( g8 x0 r: g - <p>{{ message }}</p>
$ v% s# r" n4 {( ~. T - <button v-on:click="reverseMessage">反转字符串</button> Y. t* J7 T& n! ]7 x5 j8 h
- </div> a8 C2 F& Z! E$ d1 M
-
; {' ^+ g+ v" B( ^! ^ - <script>
9 P# s, _7 s! u' U9 L - new Vue({
) _8 l4 q8 y6 C0 W7 E. w3 z y - el: '#app',+ I2 R& H0 ?! k5 k! R
- data: {3 h1 W3 q1 N: |5 T; ^. k/ [" [
- message: 'Runoob!'
" I, b {1 ?6 L; Z. E! J - },7 w+ G; v! z k0 Q
- methods: {3 _ L! _( ]! }2 q+ B+ h
- reverseMessage: function () {. Y% W9 a6 _' u# U* k p& t
- this.message = this.message.split('').reverse().join('')( c7 }( ?" [ Q9 Z, B Q5 _2 H3 n
- }+ q' P# L e7 g$ e
- }& k7 U2 _" L* x7 [' {' B
- })
9 D+ N+ D' \7 v4 s- ?/ } - </script>
复制代码
. C4 g, X ]% J; \/ j过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->
5 [; ^6 _ G$ Z k8 n. u5 u: y - {{ message | capitalize }}$ b! h, j) b6 Q7 g, z! r! d
- . l' q, o5 M1 G- i) g
- <!-- 在 v-bind 指令中 -->
* F/ |( s0 D. U5 s0 Q! p, [ - <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">) H' {" l [3 {8 \1 N9 c* S( H
- {{ message | capitalize }}, ]* d2 w, p8 G b" m9 O( B$ ], x4 V
- </div>$ i/ B/ _; _1 l# _ M
- - A" u+ R* j8 N: Y- p, O
- <script>
: r+ _0 T% x% X4 ^7 y; k - new Vue({
% Z: r5 j0 A( b7 o1 z - el: '#app',
" L4 j2 T+ i( O+ P- y9 ~8 i1 b, p# m- q - data: {0 O; a( s! H' U: `
- message: 'runoob'+ J0 ~8 _ ^! D
- },4 g0 n) i, G; H. M& Z) L. w
- filters: {3 [; [/ k/ {8 } v) I: Q) v6 B3 C
- capitalize: function (value) {
! b0 B2 J) C) r7 O6 G/ ~; c: L - if (!value) return ''9 F/ g9 j6 r" a$ y, l- p
- value = value.toString()" S9 r- l% ?+ @* D
- return value.charAt(0).toUpperCase() + value.slice(1)! ]& P5 v1 Z: {5 ~& l" ?6 t
- }/ Y* H$ E7 T% g2 h5 [
- }
+ } [! y0 ^& ~2 {4 A/ C2 j - })
9 m8 B$ [6 q& Z - </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
3 i* C2 ~9 t3 q+ o7 O1 N( G4 ^# I% N0 j% o Z4 ~; E: T
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->4 M7 `- j6 ]; R7 d2 c
- <a v-bind:href="url"></a>" V1 I1 d, M( o' X& \
- <!-- 缩写 -->) E4 g: U/ n; S5 h2 e$ V4 d
- <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->
0 y0 a$ A d3 J - <a v-on:click="doSomething"></a>
2 O2 t! d6 | t# P - <!-- 缩写 -->
3 F0 O7 {* B$ x. S - <a @click="doSomething"></a>
复制代码 笔记4 w8 L: ` G, P6 ~; m; i. _) |# k' d; j
给元素绑定href时可以也绑一个target,新窗口打开页面。
# F0 C0 r1 W: w# Q3 B; D/ O- new Vue({0 s" V1 Z ~; X0 P# |
- el: '#app',
, S3 d, e; W5 q( [! e - data: {" d" E: [' Q0 k5 S
- url: 'http://www.runoob.com',
, L& v. S% F2 _# u. O6 | - target:'_blank'
7 c1 G. O8 x- i - }
, k( o7 n3 s; n - })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
* i: G9 U: T; n+ Z: X* T这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
C' n9 y/ Q9 N, v/ ?# H
; q, [+ x5 Y5 f& h+ @
# P" C: k" _5 y. P8 q
6 j6 M+ \+ A% O4 s7 ~0 E% [
3 ^6 p' Q: O# r$ F5 D
: y$ Z2 ?$ g$ H, A8 D
6 c; ?$ q9 l7 \% { d
; }: l2 d4 F" n" |2 S
! X) `8 t5 x0 O* h1 [: U3 R
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |