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">5 j, X; s" o2 N5 w( l
- <p>{{ message }}</p>
9 B/ x4 g# P. \' v6 n - </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">
/ m- x1 p) T/ @! _0 `! o1 f - <div v-html="message"></div>
" d/ S4 k8 t, o - </div>
. t! ^9 _( X9 c5 q, q6 m - 7 t0 k' w/ {% x! t8 X* e- c
- <script>
+ n. |0 F4 R5 J( O* l/ \ - new Vue({
6 _+ O* m4 Y5 A4 u - el: '#app',0 B$ L/ \& p" v/ A0 e
- data: {
0 ^9 R- s! a+ N - message: '<h1>菜鸟教程</h1>'8 Z) L4 t* Y d9 o+ m
- }
! Q8 g3 y4 Y T - })
# O6 L+ e) |) n - </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">" f: y+ I5 r7 w; S- g4 X. g: t
- <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">( t' k! \# F. l
- <br><br>
3 {- W8 _0 }, I - <div v-bind:class="{'class1': class1}">
( H7 h+ F1 v4 _ s - directiva v-bind:class$ f x: ?3 v! L! F; u
- </div>
+ M# @1 C# H3 J1 y* N9 _8 l - </div>& j5 n, z K$ ^- |
- ( p- k/ _- y5 k* Z$ d4 g
- <script>
# L p+ D" l7 E) \5 K) p5 p - new Vue({# c# B* q5 R- g: H$ i7 Y3 V. _1 j- N
- el: '#app',' E0 Q8 m8 G1 k9 F7 D" l
- data:{- v$ B6 E( m* j
- class1: false
4 {4 V" Q: ^( r& m5 A - }
& L) }7 Q% Y. P* n( ?, ? - });
/ S* v1 `5 M9 _! I6 _/ G- P" G - </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">& d: O; E- ]. N- K( w
- {{5+5}}<br>
& w6 {4 T/ E, z! c- j# Y - {{ ok ? 'YES' : 'NO' }}<br>, U( r7 n# Q' X# I* R1 {) ]2 E/ D
- {{ message.split('').reverse().join('') }}
$ O. ]% w Z! J( q+ L, f - <div v-bind:id="'list-' + id">菜鸟教程</div>. C- x: }8 B2 p( Y1 m3 q! J
- </div>
/ [9 t( f$ d# f - / F' N$ m" O S
- <script>7 X: P* @$ ^4 p
- new Vue({
; G! F# `1 s8 A* `, j9 z, i- Z - el: '#app',* ^6 j6 E8 w. ~- i# h3 d
- data: {) {: x- n! c3 G. e
- ok: true,
' d' A' u- X" K4 i& _# O/ B - message: 'RUNOOB',! M" y5 s, E' u/ Z$ s9 i: v/ o& W
- id : 12 p$ l% L! v! H2 K
- }( \& ~6 [7 | X$ J O* l
- })
. m m) l0 J# N8 C- m. ?7 r9 T - </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">
; [2 N& L/ K7 E' l# c - <p v-if="seen">现在你看到我了</p>' N) Z/ q; z1 e- T; r! K
- </div>, M6 w% e% D7 Q( g+ t
-
( f' U! S: B5 X# C6 K3 ~ - <script>
`9 j9 I9 c: ]/ ~4 C - new Vue({
6 a0 X* o7 f5 k4 o - el: '#app',
- D% Q0 V g% v1 v - data: {9 x, |! E( _8 ?1 v- \! ? L
- seen: true. H$ d* Q+ p6 O5 }: p( f: B9 F
- }0 ~7 K8 P) y d1 t$ s
- })! r' c4 o" _- m( l/ T+ D; `, f
- </script>
复制代码 " K# |, ?6 g" k2 Z+ n7 o0 [
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">; ^* J. T# ]1 ^6 N, |; A4 o" ~! a
- <pre><a v-bind:href="url">菜鸟教程</a></pre>+ A+ {: x9 I$ x4 d p% f
- </div>% O# @0 r6 N4 H2 P' d( F& E) P2 R6 u8 [
-
- p) v2 b* H3 l' ]+ h+ y - <script>
7 u# x$ J Y* T/ u- H4 y - new Vue({, i# J+ a! ]$ R: t, a4 {
- el: '#app',
: G: v' ~# ^. z) _ ~ - data: {$ ^8 {; O5 b; j
- url: 'http://www.runoob.com'
. k; _9 H& P' W* n: u+ j& d - }
4 x6 j4 C0 x5 @& p1 m3 e - })6 |+ H0 U& m+ x7 l! f3 |9 q4 g
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码
' F% ~3 F, V( K# e$ b! T
- <div id="app">& @8 R; ^5 m$ M% z" ^0 ~ x; I9 _
- <pre><a v-bind:href="url">Vue参数</a></pre>. V8 R; O: I$ B1 g- J" m3 z! d2 N
. j ^0 Q2 R8 b5 h6 L, x4 K# v- </div>
; V0 R' I/ y k# Z
; V- M5 o- B2 [/ ^- <div id="app2">" X0 b# ^ Z/ |% ]5 h" U
- <p v-for="val in arr">
" b* I0 Y" u2 Y! M# | - {{val.a}}
; v9 o) d6 }& Y1 S4 d: {8 | - </p>) F9 N: [/ Z( C0 M& V8 N
- <a v-on:click="tap">点我</a>- [$ y/ j$ F$ J( e9 P$ r/ Q
- </div>) j) [! }& S6 ~+ u. h, p: k
- 9 s! | M3 N4 [% n4 ~' \9 J& h
- 1 s' W2 F; X) z
- <script>3 b+ w2 L/ T. u& h1 ^- c. T
- new Vue({# G2 P% c) K: M
- el: '#app',
$ l. d# m4 o. e6 E - data: {
* T* y f8 L2 v F+ y - url: 'http://www.cncml.com'
3 ~% J |6 H/ `, A6 a' `6 C - }
( m2 C$ F9 }5 K* }6 l" ] - })1 z5 ~/ P. V) g& B: p- z$ ^
- new Vue({
* I4 s* s& Q; N: S: U' e - el: '#app2',
% A* d$ k) A1 n - data: {' c2 _& b! F0 U$ {( g
- arr:[8 d1 X7 Y2 C; e- ^$ K2 I- @& b
- {a:'bb'},( L3 \" C) V; ~$ |8 ^
- {a:'cc'}$ l" Y7 G" q4 F( G
- ]
+ |+ |# G* t0 A" C$ O - },
" p) `0 _% j7 d5 u/ F0 B - methods:{9 B; S1 ?' H& @* Y
- tap : function(){! g7 L) N! W g _0 f8 N, n
- this.arr.unshift({a:'new'})
& m1 D& \8 L" V5 o" i1 H1 u - }+ S' j9 Y7 l$ \
- }7 ~5 {7 \! e& ], w0 p
- })% k& V9 T- @, `/ X6 }
- </script>
复制代码 + R& Y" m) Y5 O, d5 d" o
8 o0 h5 f7 `# ~% P: D* O: P
在这里参数是监听的事件名。
0 K% R5 v% s+ @8 w4 J' u' e ~修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码
0 [" w6 Y9 _' q, z# `* f9 [* S' W用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">
9 ]4 ?: ^9 ^% B; K8 w - <p>{{ message }}</p>
) x8 P9 R& N! ]2 h6 ]5 A- j' e, Z - <input v-model="message">, I2 m3 [' q) B: v
- </div>8 m% `! t" i- \; n
-
/ F; h7 _+ T# e5 c/ M' g. e - <script>0 r# S6 q1 T4 B, ~/ K
- new Vue({$ s/ H7 ^2 P" H2 l. U) w" U
- el: '#app',
) L& u: }% H& @ - data: {
" n% X. R* D1 O% }6 }# m - message: 'Runoob!'
% S4 n& Q" T H& q- {5 X1 f- g) I - }+ B) C) `, |0 F \# z
- }); Z7 [1 Z" M+ i% `1 Z% P
- </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">" U3 h$ c3 ~/ {* E
- <p>{{ message }}</p>! D! B; m% ~$ l7 q3 x4 e
- <button v-on:click="reverseMessage">反转字符串</button>
l5 y/ M4 G) R) i: l9 \6 f( q; @3 ?. ? - </div>
2 v/ n) e' h6 l' b -
7 `6 |! Q7 X1 W6 F, @ - <script>) F$ G& s0 Y4 D, _
- new Vue({
$ y' d F7 E- ]6 w: s u - el: '#app',4 t" v( l X, L, Z9 a! g
- data: {& L9 e9 [/ o" b' X/ s( u; G/ @
- message: 'Runoob!'6 L& J+ y1 r! Z' p0 U5 ^, Y
- },$ @( H* E8 L. `: B3 K& P& w
- methods: {
1 q! r# T* W' } - reverseMessage: function () {, y6 ~/ W d9 F6 ^$ N) y1 v
- this.message = this.message.split('').reverse().join('')
3 |! Q: H$ j# m* e2 }* J; @2 Y - }% l& f1 ]+ I; ?) T+ g* X4 h
- }; D0 N+ r+ X. J6 F: U3 |; s$ H0 `
- })
- _: s1 E" z& h: r8 ^ - </script>
复制代码
2 e5 k! Q; G" V0 `/ h过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->8 ~# u4 J7 D5 u0 S/ ~. r- Y9 |
- {{ message | capitalize }}6 w) Z$ d t' F% t8 Y) y! O
- 5 |) U. y. h; c, R" \2 [, C. v
- <!-- 在 v-bind 指令中 -->
" ]0 P. U# V5 ~+ i: l$ a* w8 x - <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">
5 m* p% U+ x/ ^0 {) p - {{ message | capitalize }}' a+ `4 W& O9 y
- </div>4 `% `$ e+ K0 j3 P. M, n1 R" R8 S
-
. a% ^8 Y, {' Q2 r& |% k T - <script>
]- C5 X: h' o6 k& H - new Vue({
: G/ ^6 ]) k/ @( E3 g - el: '#app',% f3 p& b/ \2 G1 A5 o/ O
- data: {
* g, w0 M) F3 R* L0 g9 S - message: 'runoob'
i/ S9 U$ o0 }0 W" L' ~# d6 k - },' d6 b. L* x7 @( @6 [0 u) N
- filters: {7 n- _+ b6 s: }+ e
- capitalize: function (value) {" S2 o+ r* ^- l0 @8 e
- if (!value) return '') L1 @8 A- _; ^
- value = value.toString()3 W- k9 E7 |( e2 [( o* R+ @
- return value.charAt(0).toUpperCase() + value.slice(1)4 V6 W l; f1 h
- }3 y: v( V4 Z" V$ q6 G( r
- }% G% O! k# _; t! w9 Q0 Z5 I
- })1 d* l) K. E9 E$ u
- </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
! e' h+ m; {7 e' @- B2 M$ L1 Q& ^% f1 X# p' |) O
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->4 Q0 J( i7 {; E0 v7 b! K3 L
- <a v-bind:href="url"></a>
) ]* ~" M5 J2 P - <!-- 缩写 -->
% [2 B% U {$ Y- E - <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->9 b' C2 }: r1 b: S
- <a v-on:click="doSomething"></a>
6 u# g" e+ q; {5 a% y9 z; f - <!-- 缩写 -->* \8 N3 e2 z9 W! B4 A
- <a @click="doSomething"></a>
复制代码 笔记! H1 ]4 o! ]3 H5 D. E8 f1 ~% E9 e
给元素绑定href时可以也绑一个target,新窗口打开页面。) x H8 z' a# V( y( s+ x6 @& S( O
- new Vue({2 g5 J1 u8 O& d/ W
- el: '#app',
n! d/ P% ]' r7 t" m! @8 @8 | - data: {
: ?! P' ]5 A/ G* a% h7 w& p) w4 o - url: 'http://www.runoob.com',/ }/ k B* S7 k$ `$ h
- target:'_blank', a: W ~ W4 b0 L7 G! ]
- }2 m) C. G/ A7 m$ H8 O
- })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
8 O: k' g& y9 J5 R: b这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
, Q. j$ E* o% z
9 q2 v& r/ g3 b: K" U2 R
& |! l7 s3 V4 p- Y5 n
& J" r7 ]9 R" V1 h1 S, {
& m9 L9 G" t; X# [( |: V& a7 Y \2 y7 S$ h& z
0 f! P. F) t0 j9 A4 o% Q2 o$ r- V& R7 s! y
& A' q2 `1 M) d; C
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |