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">. T/ s1 b: M4 g% l( [0 s" ]
- <p>{{ message }}</p>1 y9 O) z2 x2 |# B7 H4 I l0 h5 z8 M t
- </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">, j) Q, x! T( \2 h9 h% M* z
- <div v-html="message"></div>
2 {0 N6 z% I4 |7 Y - </div>* u8 U' I6 x" L* B! O
- - `0 |: e& \9 q+ ^1 v; P1 }- U* v
- <script>' A& \, r; j' F0 S: m7 ~* @
- new Vue({+ v: U3 n/ T- l4 d( Z S
- el: '#app',9 m& M4 Z9 U2 I1 G9 `) h
- data: { F) K* s9 E4 _& k9 ]2 r3 Y$ }
- message: '<h1>菜鸟教程</h1>'
" z8 J# j" R' o5 ^) C" ] - }0 _, U' R# N7 L$ ~+ K
- })
1 k# A: r b4 u7 V' b9 O" j8 M# D - </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">
: o" O! {& b) A. i9 v - <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
" ^$ f, K" |3 x8 b" c& Q3 P - <br><br>! p3 J1 A. X0 \9 n* f
- <div v-bind:class="{'class1': class1}">
6 |- B& R) q( X! H% @' N - directiva v-bind:class+ M4 K& J. X) x6 Z5 {
- </div>
, r4 b9 t4 W' U" y - </div>4 N3 R J$ a7 O% x+ D3 X
- 4 \# Z8 e6 S6 v$ s
- <script>
4 t% s( t2 j4 `! Q/ [ - new Vue({
/ u0 t# f R- i& }: ]0 X; z7 r' [5 |4 f - el: '#app',
+ a5 R: G& _* }/ M" b1 o - data:{) J/ i* _0 i0 I4 [1 x
- class1: false6 J4 Q+ B5 u! Q' y+ y
- }
9 z. u8 m: z% X; D7 a - });
8 D8 e+ Y& A; e, {$ j" ~/ P! N - </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">
2 o" }9 T' \0 T& a8 {! N& E: R - {{5+5}}<br>
/ f" G. C" M4 k) a - {{ ok ? 'YES' : 'NO' }}<br>" V s* s6 R) x6 q+ v/ Q. D* [
- {{ message.split('').reverse().join('') }}
' V S7 l& G* R5 e* a - <div v-bind:id="'list-' + id">菜鸟教程</div># K2 N8 m8 W7 P, i$ ?
- </div>" ?( H; I g! L+ L$ V. @6 R
- " _( k& C" g6 |7 h R6 B* d% l
- <script>
3 }# a' y" x) g - new Vue({$ ?4 d1 \! R& t- x* X- b
- el: '#app',
/ k1 z9 I3 c2 z3 g( Q - data: {* A2 }& f( J2 p9 N, _- K
- ok: true,
0 {" u5 O2 X/ u$ A. P; J; z8 X - message: 'RUNOOB',% @1 a. {1 t+ v7 z8 l
- id : 1
' G' B+ I3 U0 L; k7 [ - }! O- N( O( P/ g1 v$ ?; u# H. O
- })/ M0 ^( b7 f$ X9 m3 T
- </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">
l8 n; z, F7 n4 @5 C - <p v-if="seen">现在你看到我了</p>/ C" H' l% M. M+ q4 V9 }( i% t
- </div>; g, S' p: j1 E! d. E6 R
- ; @4 z/ o. f5 [& X5 m
- <script>
$ `9 E% l8 q0 G9 ]% W2 h j - new Vue({5 H( d- t6 T$ m8 r8 Z* j) ~/ W
- el: '#app',( ~& R6 i$ [( w1 v2 A: |/ b+ n2 c
- data: {
3 Z9 u( n! @% v - seen: true& J3 F: D8 {7 l( `* }9 }
- }
1 Y; x4 O" p. } - })4 x+ H) Q3 w8 Y9 U: o" e! l
- </script>
复制代码 " y0 b( @9 ]/ q
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">
) E, o; t3 W7 m3 r$ B - <pre><a v-bind:href="url">菜鸟教程</a></pre>
2 m/ k4 I0 F% C( r+ G) h - </div>! u4 E6 w4 E, C! p' x, a
- ' i+ D! r. W% D* C* N8 ]" ?" c7 ~
- <script>6 S& ^2 \( Z* i: [/ v
- new Vue({/ {" D& M' X$ i0 z3 T. ?
- el: '#app',
- q n/ n* M* P- ?9 V - data: {4 ?% z i1 C* @( G! b9 \
- url: 'http://www.runoob.com'
) Z% A5 Q0 d3 }4 P1 f - }* r, K1 s$ F6 i/ Z, u0 O }/ H
- })5 q! {8 q }4 ?
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码
9 N# k: D! `! }5 [
- <div id="app"># y- I" a" Z) C# s: N0 l
- <pre><a v-bind:href="url">Vue参数</a></pre>
% W; N2 p* I7 E0 ~
# ?: U+ S, b( E! W- </div>
( S ?) x8 w9 a# } - g' m: h( n6 w& h9 R$ W2 I# j6 N
- <div id="app2">" T6 S4 _* f. I
- <p v-for="val in arr">
% a0 }" s' Y9 ~# Z" H0 U! ?; f9 r, ^ - {{val.a}}
8 h1 J* j7 x$ f4 k `$ Y% a) P7 q; ~ - </p>
2 d9 e5 L& [8 Y$ }; k - <a v-on:click="tap">点我</a>" s- T4 k0 ?9 ^7 w
- </div>& d4 E# B. r. B1 O' k' s
& y% i$ d [! m9 o' @" d- 6 }& s0 s* ^2 Y: {
- <script>
6 r$ [8 j6 c3 B2 b8 U; f j( G. Y - new Vue({6 N6 a0 L6 p$ C5 R4 S. r
- el: '#app',5 q+ M( b4 @2 p5 |9 }) h: v9 Y9 @
- data: {- r8 m1 z1 z3 E- {) x: a8 c
- url: 'http://www.cncml.com'% [* |% E. D" `6 c
- }( b( g0 [. H3 ]# }# {
- })+ v* H7 K, L1 l2 c' ` u0 v+ u
- new Vue({! x( a; ` n, c$ m# y
- el: '#app2',
4 N5 [, p0 \2 o. U - data: {' W0 v! V; O h5 @6 V
- arr:[
$ c) w; P; w" v U, J8 b9 o - {a:'bb'},2 J; u; c: L) f2 {9 k! n
- {a:'cc'}
2 `& w2 L7 ?9 s1 X - ]
6 K0 H6 W% A6 ? - },5 |) u& l3 F6 r9 `5 o" t
- methods:{. ?. b/ p( z+ ^. p
- tap : function(){
% e/ F+ M' G$ ~* f) } - this.arr.unshift({a:'new'}), C: O3 W4 o' F, \" ^8 r& J
- }
! T) r* n; N5 u5 f: w! a# @ - }
+ w& Q+ U' _4 u3 @6 s - }); c5 `2 [9 \/ y# N+ Q" T7 K o
- </script>
复制代码
8 H: S; g- d3 [7 P: h7 R. ?+ V+ v' K, u% k% n
在这里参数是监听的事件名。
8 z& o$ g; ?1 W; c( \5 s7 O/ k1 z修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码 2 I/ Z8 ?0 r( G. r) S. z! g/ y5 s
用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">6 h C& N% S) w V
- <p>{{ message }}</p>
* }3 N. Y' k9 i' c$ K6 b - <input v-model="message"> B0 @! N3 c7 J* O" g
- </div>. P) S! g. b$ T
- , G3 K9 \, i3 ~9 f
- <script>2 a6 z5 M2 `4 r& L i
- new Vue({
* C: n- M/ p v - el: '#app',
2 f3 p$ W6 B* V. t+ L - data: {
& V- g- v1 \; s6 G - message: 'Runoob!'; ^ J! D" L$ P; D
- }
. d* o3 Y, I/ Q! g E; a$ l. B9 O - })" F7 Q$ c( i! [+ H N3 j- \ [
- </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">/ ]& [# R( Z2 Z% B. F7 Y" O: m
- <p>{{ message }}</p>0 t8 B1 ^: y9 K7 Q# R
- <button v-on:click="reverseMessage">反转字符串</button>
3 G; D* ]" A. v; @! p$ z7 y' ?8 W - </div>! f2 e, O6 {6 r3 [: t
- " S( u+ ?2 ^- G- X/ ^
- <script>& H4 O T+ T% n2 L( K; `
- new Vue({
+ s1 ?" a2 z) H+ i - el: '#app',7 R9 d5 h+ n- g. j( U+ e1 r
- data: {5 O5 V" k/ L* F8 a8 q- H. \5 D
- message: 'Runoob!'9 T9 M J% L4 H; i
- },0 t4 U, v& R8 G: b' L. r5 U
- methods: {
; v# ~5 Y9 r: A# d; v! T1 h - reverseMessage: function () {
. j) i+ O+ h$ f - this.message = this.message.split('').reverse().join('')
/ m7 l, ?. S e+ _ - }
) `) W" ?4 Z1 V4 B' ?% c - }8 G! y# R+ t! t; ?, M3 q: C: U7 _
- })
* r. ?4 @% U7 q9 X& H - </script>
复制代码 0 H$ r3 T/ X: h# g# g4 M' C
过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->- Y6 T! y" N0 d% a/ H8 V
- {{ message | capitalize }}
( [- E/ c3 I( E& e - 3 ?5 `3 A! y& m2 F. p& @
- <!-- 在 v-bind 指令中 --># t. n6 S9 R4 ?+ L, S. D* V
- <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app"> X ]" K6 C* N' Q: O- i# ]
- {{ message | capitalize }}
- W% y$ f8 d1 H6 w9 P2 N$ P- v - </div>
+ }# h! ], N6 q- h. m - . j+ @; R6 R6 x1 d" z
- <script>: H, h8 j9 o3 v. t
- new Vue({
0 k3 h3 o+ ?' a. V3 u2 d - el: '#app'," s Y1 d7 p3 @3 {; l9 w( w; N
- data: {
5 b+ w9 f! L& l( O - message: 'runoob'. l) g* p$ b5 ^9 N8 q" {
- },
" m5 y+ F& f. E - filters: {/ w$ d/ E1 {8 A7 t
- capitalize: function (value) {
( I7 O0 C1 @" w9 K2 { - if (!value) return ''4 e5 R7 t* I5 v# h( N3 R4 K$ a
- value = value.toString()8 ]) u5 J% ^* ^% y! }( H$ G
- return value.charAt(0).toUpperCase() + value.slice(1)2 ~1 b0 w5 n" @8 E
- }
( {" `. |) C0 T* f) s - }& S4 S. {$ e5 |+ ^+ k
- })) j6 b2 C) ^" I1 Z4 F; p
- </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
3 x0 d5 R/ e K# u6 }. M1 L3 [$ e. H( m
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->+ X4 ~) y- r* Y: V
- <a v-bind:href="url"></a>
2 e. a) t8 }0 j( O" w# ?. i1 v - <!-- 缩写 -->, L* I! Z% X o' T0 j' A% D
- <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->
: j* |8 Q% T& W: S - <a v-on:click="doSomething"></a>- c4 S: o2 C& K, k8 d4 w) z# k
- <!-- 缩写 -->
, H# x7 e. _( j* x/ H5 a - <a @click="doSomething"></a>
复制代码 笔记
& R q9 [$ _ W给元素绑定href时可以也绑一个target,新窗口打开页面。
+ J% s# V0 ?& t3 T8 u7 I- new Vue({
# Q: k" y6 p* z3 Y; G! G3 u V - el: '#app',
2 W0 E+ t# _5 c5 X9 B0 A y+ z" w3 V - data: {
2 v# D: c! r1 ~' C - url: 'http://www.runoob.com',% `1 k& c. M6 j. E# c
- target:'_blank'
$ S) N& }. I% ^6 T - }/ R5 R3 Z" h! b7 I
- })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
) R+ W: M4 p1 E- R$ S; z2 Q这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
' B# F5 l2 n0 ?0 j5 R! y7 s
9 u9 n6 b& M4 G3 d$ H/ o7 W, @: C3 F& ]6 J7 \$ w
3 d1 _9 b# G' _* m6 k9 U m- I! Q- n8 n
% A! @% X) T/ b7 I0 I; ~
8 Q; m( ?& V: ~' s
l; y! _# m, i+ r& C
6 T Z% Z8 F& `
欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |