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">
' k7 r+ a4 B; @" G. j0 d6 H% N - <p>{{ message }}</p>& U6 U: [+ p6 H2 n8 q1 n+ k# }
- </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">" v$ d/ E9 `, Z9 g5 n; Y
- <div v-html="message"></div>
+ g* Z( B! K: m - </div>+ H1 D. u$ l# e
-
( f/ @" L3 N& a$ ]8 Y( n' N8 ~ - <script>
5 }5 h( S1 G" G" o- I - new Vue({# N" R0 }& p) p) C4 y( T
- el: '#app',3 ~, S, P0 `& K( h% R
- data: {
7 a" q" ^& i4 B - message: '<h1>菜鸟教程</h1>'/ K2 t# g+ _! [, H' p
- }
8 B! ^; f& D' {% x - })+ g8 c) |8 \/ h9 u' o2 u2 V
- </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">
+ Y. e) Z9 A6 ^ T% e3 ]$ k - <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
" d- n2 j3 i' I( D* f8 }2 Q) O - <br><br>) ]! |+ `$ ]# `% a
- <div v-bind:class="{'class1': class1}">4 F" T/ q* B/ y9 D+ b8 h
- directiva v-bind:class
: v7 u# l6 g: o& K - </div>' l6 N, c0 D d/ `% T; K
- </div>
. a* |+ O2 v' a, U! b. F -
1 ^; q4 W" c a) r - <script>
; B" S# @) X9 v R, D - new Vue({4 n3 [$ Q: C$ m
- el: '#app',
& d9 i& a! F% |8 Z - data:{% `% T4 C S% b$ h% ], Q' f
- class1: false
+ s5 m Z3 i: u% z. i$ Z# b - }
" j9 D7 y; u/ ^* Z, Y+ G% \+ { - });- K& W& p/ m {. f1 m, { r
- </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">6 c2 T% M. ~$ j* {* O# Y2 H* j
- {{5+5}}<br>/ t) x/ L$ K( \5 I
- {{ ok ? 'YES' : 'NO' }}<br>- X6 ~. e6 g. U# C. c
- {{ message.split('').reverse().join('') }} U% q- w) J. S4 \( `$ N/ J
- <div v-bind:id="'list-' + id">菜鸟教程</div>
( f" v$ p# ^# |6 V - </div>
0 T. R& C# c! A3 ^( ]) \ - * W: ]0 L& l, o% |# d
- <script>
0 \" m; m; v4 A+ O( Y - new Vue({
6 N8 K" E8 C+ Z9 M0 \$ K1 w - el: '#app',
' G. O8 Q7 B8 J$ r$ `9 } - data: {
; Q7 ~8 h% G1 H# H* o, d - ok: true,
% v$ } \/ t/ E, Y! v5 e - message: 'RUNOOB',
2 o% r0 }. N! U; M8 E7 g7 f - id : 1* x, d( @* J) T" C
- }0 A3 }( q! |8 v9 z% T
- })
$ |& Z- w4 S1 i2 d - </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">
9 N J( r& }1 o! d) y, q/ x - <p v-if="seen">现在你看到我了</p>' x5 Y9 Y! O; i v
- </div>) \. w3 K( b5 d
- ; |$ c' Y* q0 _% Z0 Q! C3 u
- <script>* O; j- e4 L* n0 r8 L/ w
- new Vue({4 I! Q% h6 S$ h; ~4 j1 e
- el: '#app',
5 D' |- _( x1 R i$ q% h - data: {
$ m/ F7 ?: _4 m: H9 m1 B+ n - seen: true
/ a9 _) |" z! b" l - }7 w( k$ Y4 b3 P2 x D- T# v
- })
9 r$ l1 H5 F$ c2 Y: ? - </script>
复制代码
7 G# W- j0 P1 ?" l1 ^7 l这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">
9 ]9 }1 L2 ]: `" F - <pre><a v-bind:href="url">菜鸟教程</a></pre>" X. S! E ^; n# \
- </div>: |# A! F' L0 W/ r% m9 q$ j
-
0 F- v+ g( m n5 `& W" h9 v - <script>
5 S" d, i, T( \ - new Vue({4 ]. ^4 G8 w+ ?* p6 K9 N( d
- el: '#app',; H4 G. H- d1 `+ C
- data: {( p! E8 O, V) I2 z
- url: 'http://www.runoob.com'0 V' }* n* ^( N; o2 U+ p" S
- }
) t7 j6 C/ i! R' `% [6 o - })
+ @, m/ @. W; T5 F- x0 b - </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码! T/ w- a/ ~* ?$ P) J
- <div id="app">5 `( x8 ^4 Z" k; f
- <pre><a v-bind:href="url">Vue参数</a></pre>
4 t. I: D; H2 Q8 p" ^4 U - 0 q, [. D% s8 E9 g
- </div>( C: \3 x5 v1 V. W5 I
2 r5 h5 \/ K k& ?, O3 W- <div id="app2">
1 e: B' |$ {# o/ s1 D1 j - <p v-for="val in arr">
! |8 B; J! R% m1 u! ~, u2 H - {{val.a}}, Q" }9 r# N. N3 K
- </p># I4 @& W; N$ |5 c8 |' e" R
- <a v-on:click="tap">点我</a>: g9 x5 k4 v2 l" F" J
- </div>
3 K1 t6 N d- r9 H7 r) k - / M7 f; J' X& `2 {/ W
- 1 g& y% a1 Z% M6 f$ p
- <script>
9 q5 t2 ?- ?+ ~ - new Vue({
8 ]4 T, x; W% ~: {0 C& t- O6 G - el: '#app',& r+ u, n% B8 B3 j7 t: [2 F
- data: {& n' D0 S6 H; B9 T9 k2 @/ i
- url: 'http://www.cncml.com'8 O& z- M: h+ I1 W
- }
$ H& L3 \$ ^% x* ^9 T - })
+ `8 e7 r2 y+ A, Y& s) H - new Vue({
2 y$ m. X. T$ [) P, A - el: '#app2',: t1 g ~8 D. N% j
- data: {7 }4 Y; k6 e! A
- arr:[! y u3 _- F' h
- {a:'bb'},8 T4 I) s5 i8 i7 W
- {a:'cc'}& f% D1 ~9 b- G5 r9 W- N: M( ^9 q
- ], A- F( h) r: e6 _2 `
- },
; B, X2 [" M. }) T4 b - methods:{( |; q1 [" A; Z: n+ w2 l
- tap : function(){
3 v: h; \% _4 \7 j - this.arr.unshift({a:'new'}); v' j# c! x% a# S7 R1 Z; \7 T
- }0 v) W9 f! M& N9 G, A
- }
* K' {, k2 P1 A) L+ t9 p# _ - }), s( I2 I8 c% c# T
- </script>
复制代码
* t3 {- T3 }8 Z- J# D, n
0 ?4 Q% |) t1 T
在这里参数是监听的事件名。
* j$ Q, p9 _ Q, h
修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码
0 `! }) Q3 w' B( L j+ x; N用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">; A) X. G% y0 C. e6 L" e7 ~
- <p>{{ message }}</p>1 @( i8 x* f2 J; x6 ?
- <input v-model="message">
: N: ?4 S/ W1 O5 o Q2 q - </div>
! @) F( F# g8 z' r3 m' t4 m* Z" } - , U1 Y& D4 M! f# n3 b' a7 r; l; x
- <script>3 w$ X. q/ M' V) C& f7 s0 n
- new Vue({
2 K' r: }" b% E& ` - el: '#app',- g( V ]1 O; l/ p/ e
- data: {6 G, i. N: M: j" A+ A
- message: 'Runoob!'
* C& q) K" {3 F) Y) l4 T1 h - }
1 m7 |, J8 M2 ]' l) M+ d - }); o3 F/ F) t, S* p
- </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">
}: d/ } F% | - <p>{{ message }}</p>% p) z# q6 @: w
- <button v-on:click="reverseMessage">反转字符串</button>3 r+ [: F: X- w4 e+ i' T$ }0 i
- </div>
# d# E7 J$ \3 h5 P0 X7 x2 `. \9 U - 9 x6 Y" T7 \0 d- e
- <script>! _8 _- }9 a v9 ~
- new Vue({' r y8 N* x0 d; R2 _
- el: '#app',* h, G1 Q* C% \# ] E7 i
- data: {
# m3 Q$ \, b p& I - message: 'Runoob!'9 { ]8 g: d, N9 f$ J( K
- },
( o' X: T8 Y; ?/ f4 z2 s. b - methods: {
/ R2 e7 F3 T9 V) n7 g% | - reverseMessage: function () {
. R+ o ~: C3 m' T# Z - this.message = this.message.split('').reverse().join('')
& i2 V5 _: ~7 T5 G - }
( G1 C6 {& ?2 l# h - }
/ X) {- y- {. p - })- ?# W- z3 P; O# w9 f
- </script>
复制代码
9 O: V) y; D: T过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->
& k; d0 |; q' b4 | - {{ message | capitalize }}8 U$ f) [; Y* Z2 z# X9 U
! R8 Q) {1 E; `3 a- U& V- <!-- 在 v-bind 指令中 -->
2 |6 t& q9 p" N2 u$ D/ l* e - <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">) |( L0 ]) {1 ~
- {{ message | capitalize }}* {1 v- w) t3 t" V5 V
- </div>) Y/ @9 G7 S# Q5 [6 V" A) w
-
4 H' m3 k: \+ U3 ^" m E! [; q* H - <script>
4 w. |& [ `% y1 a- p1 _' V) T - new Vue({1 F5 h7 k$ K3 w8 {: H
- el: '#app',
9 w7 n; B$ G' T* D' ]( W" L% F - data: {
9 ?5 u3 X m) [: p5 M - message: 'runoob'
$ d/ e/ S( t0 b+ L2 l7 A - },9 y- c& D& C; w" |8 G
- filters: {0 e: o% B5 F! H. H y
- capitalize: function (value) {
T8 K/ \& k: a9 K5 q! C# F9 b - if (!value) return ''( B1 k( ] K+ Z: D+ ]- U6 \
- value = value.toString()& w1 n" Y2 g. P. R
- return value.charAt(0).toUpperCase() + value.slice(1)
; x, A) z4 ^$ X: ] - }
. f, l! E+ R- v. z$ ]) @ - }4 O! d% M/ m+ Y
- })1 L7 n, e+ T) Z' K+ a7 | R/ v
- </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
; s# \( N0 N: q
$ J- T- c k7 P! ~- E/ q# w) T缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->
J" O( k. e; F( s% K$ J - <a v-bind:href="url"></a>' b5 d9 m6 V: T1 }8 `. {
- <!-- 缩写 -->5 F2 z' q0 D2 f, E
- <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->5 \8 X7 I' j1 u8 ^1 ]( l2 Y) ]
- <a v-on:click="doSomething"></a>+ F; O9 d. Q5 ^& _3 L7 z, M
- <!-- 缩写 -->
$ m; s( e5 Q% O' ~9 ]/ `/ E8 o - <a @click="doSomething"></a>
复制代码 笔记+ g5 I1 K0 l# J" i. \# t* h6 q$ Y1 l
给元素绑定href时可以也绑一个target,新窗口打开页面。5 a) p! T: s, s1 y2 K# g
- new Vue({
- `) d. K8 u3 o% S+ U! f/ U/ r - el: '#app',* H# b8 ^- l( n3 E7 V" ]) Q% u
- data: {# R& o _$ A9 v* c1 c. ]
- url: 'http://www.runoob.com',7 B, Q+ X C: r" o8 O4 }. z
- target:'_blank'
( p' |9 y7 N6 \7 @5 h2 ~+ O+ R; e - }
7 ]+ |- y: f$ }* e) I - })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
/ S7 B8 u: O' y7 X5 L4 A& @
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
8 v8 E3 {# B- o6 e5 s
/ T! { e3 R, `5 F( k9 j& F
7 w" E# U. w% ^
. q1 G/ v r8 V6 m# n3 N3 @! U t. l7 o4 A& D3 |/ a, Y E5 g/ ^
" u* n0 S: E M0 _ G& @; r7 J1 W& @4 z% m
8 R! V- j" i' n* o5 [7 u2 t9 j4 y! N& w5 S
2 S# V3 o- A3 _* X- g5 A
欢迎光临 cncml手绘网 (http://cncml.com/) |
Powered by Discuz! X3.2 |