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">
. S9 R+ g& y! u% ~ - <p>{{ message }}</p>
& T* z7 l, }4 D9 d# P# U - </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">
, I8 T2 E4 f" Y - <div v-html="message"></div>
& Q+ n$ R! S6 A2 y) y - </div>
+ _5 c' W3 h" K; n Q* H - 8 d, Q- f6 F! d( z/ k
- <script>* }, X O! W5 x1 K2 v+ Q
- new Vue({
7 g8 {6 j7 y; K% C# q& D - el: '#app',
. T/ l3 f; r& }0 [8 U* S) L/ E - data: {1 V- ?# H, i' y- y# U
- message: '<h1>菜鸟教程</h1>'
* q6 Y7 U1 @! @7 ^$ S - }
0 }( b; w# R q- [ - })
: g* l1 M' B" O Q8 A# t9 E. O - </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">
! u% L2 M* s: Z& f8 h - <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">- \ b2 }9 V' ? u# d; d3 e+ O
- <br><br>" X7 }2 s/ w s2 b# }4 |! u/ E
- <div v-bind:class="{'class1': class1}">& c. _; {+ U X: l+ R; i2 V" x
- directiva v-bind:class
' ]5 {5 `! S s) u' m - </div># {" K, i4 h8 S1 t2 ?, M$ D
- </div>! ?- v5 ]% n+ ~+ Q2 e
-
I6 I0 w( t/ }3 ^- F! m - <script>- v; h: _+ G% B& P' F
- new Vue({# \ D* D- C; e) K+ g+ I( N; Z: _: T
- el: '#app',1 a" X1 w |$ o7 y% S) ]$ X: d
- data:{
9 |0 @4 L- M' r, a' s, N5 H - class1: false" Y& w* ^8 ]& c# A: T
- }
0 t% o! Y3 c. T- ?2 q - });
! t A2 q: C8 H5 f r7 Y/ u0 G5 W - </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">. j, g2 c/ ~6 z# f3 l7 C) ?% p; i
- {{5+5}}<br>9 s) ?/ w( o( D! e7 O
- {{ ok ? 'YES' : 'NO' }}<br>
5 _* u6 T- E) W/ Y' o - {{ message.split('').reverse().join('') }}
. m# Z% C0 z* { - <div v-bind:id="'list-' + id">菜鸟教程</div>
U( n& Z, Y% X - </div>
( {; _) _6 o" }) j7 ?7 t8 G - 4 h) r& t& L: ^' t" r
- <script>
/ y- A6 q* @4 D$ k - new Vue({3 m% H* W$ H; g: {* t2 v0 \9 K! {
- el: '#app',4 \; m# R5 w; D( S. {& q
- data: {- x4 P* W3 H7 ^) [7 G
- ok: true,$ }' }6 U0 ^1 a8 M6 ~
- message: 'RUNOOB',
; y( T# Q0 z# z - id : 1( i) @) G. X N9 C3 W3 ~ Q' P; H
- }: d% ^5 U. x! w: E9 q
- }), l( T, U9 C/ B$ B ^7 L
- </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app"># Y. b9 Q) @# s4 v
- <p v-if="seen">现在你看到我了</p>5 V) t* l. R ]" W; B
- </div>. ^. ^; K9 K: m0 u2 W3 D
- 4 Y9 t- @. f4 P4 p
- <script>
4 ^& e2 U# R$ i; Z3 x5 m - new Vue({
1 _4 k' x! S9 z r/ ^) ?% o - el: '#app',) M1 L+ s r# j/ [9 c+ [) \- Z
- data: {
0 Z, `+ a+ C/ q! Z. J3 K- I - seen: true' M; F. }% h' o: y
- }
4 \; ] D" e! p; W( W; ?5 w+ H - })* Z8 p$ t- E4 Y. e. B7 y7 ^. R
- </script>
复制代码 / a: `1 y. n8 n8 @( J
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">6 F, G- e$ u- e3 ]' V/ d4 g
- <pre><a v-bind:href="url">菜鸟教程</a></pre>+ ^( I, G1 {2 r5 X+ O5 e/ V( I' @
- </div>) O- v8 ]4 D( _5 l
- ; c1 p# r4 g6 p! W+ a* [+ g! ^0 P
- <script>
# u( v2 y$ h" Z1 J `, \( r0 v - new Vue({
1 J7 v$ U3 X' ^' {6 \7 ] - el: '#app',1 R. }; |3 f+ a L& Z4 e }
- data: {
, S2 K) U Q3 l) e - url: 'http://www.runoob.com'
4 {3 e" Z/ Q! A' P$ e# L) D0 V - }
) ^0 z. F7 P0 c$ u - })% V/ Z: Q6 z; j. b, r# e
- </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码2 y0 b: S, I. T! q; V0 y; s
- <div id="app">
/ K }8 Z. s3 a3 w5 J: O/ b9 ]/ O - <pre><a v-bind:href="url">Vue参数</a></pre>8 n2 H6 m) g7 a% V5 I- G6 h
- : e& v7 E# j, u* [! I8 G- K1 e
- </div>- Y" f$ i+ u* }/ d" M) h0 [5 `
- * h2 J/ Z3 |9 N1 t
- <div id="app2">, a4 d; B" A4 Y7 \9 e# t; z0 U
- <p v-for="val in arr">8 ~" N4 A2 u1 s, \' F# t
- {{val.a}}
0 n- p9 R" u0 W, Q% q - </p>
6 ~! o# F6 I% \1 _" }& U9 p - <a v-on:click="tap">点我</a>
' |- G6 i3 c" g) V0 _ - </div>
) u& e0 l U$ a. }% h4 b$ U - 9 Q( X" Y% f; r0 F0 |& u( |
- 5 @8 Z/ N7 @! t# h/ e' w. S
- <script>. G, `. J( ^# ^
- new Vue({
' l0 P/ v7 @/ I - el: '#app',
4 q( R/ ?' I; P( m6 n" R* X - data: {
2 U7 u5 v2 c. \1 p - url: 'http://www.cncml.com'2 x8 N. O# e; Q+ u
- }# o C2 M2 C: O. b' f
- })
j' [* x6 b! J9 S' }% u6 ` - new Vue({
; k3 C" j9 t3 j, O1 w( S - el: '#app2',
- D$ \) K% A' P& x | - data: {
! r$ Z# h* K/ ^/ K% m - arr:[
9 W$ I, m8 p( V4 c/ w! R9 U - {a:'bb'},
/ U4 I$ _2 I6 J5 o5 U - {a:'cc'}
1 n8 s1 ]; u r" d8 a7 R4 ? - ]
& k3 O: @6 j- ?/ d6 P5 D - },
0 a6 ]! u! l% E4 A - methods:{
7 U* O# N: H) k2 t - tap : function(){# @3 T8 e6 z( d1 ?. G
- this.arr.unshift({a:'new'})
# J+ V% \6 m( c# E4 a' V- G - }) ?" Y `! q) E1 b9 n6 f5 E2 _
- }
0 w' N) c* B: Z6 G* u/ J - })' P. ]4 e8 d' f- D6 a
- </script>
复制代码
. W1 G, {2 L3 W: y4 v
8 w# h* I4 G# Z. p
在这里参数是监听的事件名。
5 V: i: o" i v3 [6 ]+ U
修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码 ( \4 S1 p% Y; a2 X* F1 U4 t, N. E. l
用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">3 p; f4 R& @5 d) G$ d( |* e4 A; c; I
- <p>{{ message }}</p>
" l. l! b/ p3 O' c l - <input v-model="message">( g0 H& V( K P/ ]+ C1 i
- </div>
) K. A1 G- K$ L- ? -
) `8 A7 V4 ?4 Z+ z - <script>
9 ~; s; H+ H3 x - new Vue({) p9 B9 w) T) H( d' v6 s
- el: '#app',
/ W! e8 Y1 C0 N1 H. x& k) T0 H9 | - data: {: B2 Y1 [8 f7 y+ [1 {: d4 @* Q
- message: 'Runoob!'3 J2 |, h: O! Y
- }
% a5 M+ M* s' V% D3 s2 K& ^ - })
( J) R7 V! p% D9 n1 B# H* o$ f - </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">
! ]$ c3 p0 E" w! _$ ~) w' g- g - <p>{{ message }}</p>
+ x% U- Z9 P. T, W - <button v-on:click="reverseMessage">反转字符串</button>
) W; [6 m" a( K8 o. n. W# I" _ - </div>
8 o+ I$ c" X R: f/ u' q -
8 _* `4 Z% V6 ]# Z" j5 i - <script>+ b) R+ ^ _6 u9 ~* W
- new Vue({
2 r5 k' o ~( v) i - el: '#app',# i# P6 b/ J- c% `+ \
- data: {7 ?% V. I R. e& J: \1 F, {
- message: 'Runoob!'/ A! K6 T3 x& L
- },: @6 c2 d3 S$ d3 w# ?1 [
- methods: {3 j& X4 s6 f0 E$ I# M' R- D2 N
- reverseMessage: function () {. \6 f+ \7 l) s
- this.message = this.message.split('').reverse().join('')5 @& \) }. I. m8 O8 B% v
- }* u- t9 v1 Z9 x3 U4 u" k
- }2 F( L5 O* Q2 t- c! e4 }
- })1 x" I" l4 A( E& m: s
- </script>
复制代码 $ N n( P4 }" r
过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->0 {; R% J0 t& l1 J6 f1 s# Z3 C4 L" Q% ^
- {{ message | capitalize }}
* S; h3 J+ Z# } - & Q* ~7 R: f! ?" u! M
- <!-- 在 v-bind 指令中 -->: W* |2 {" t* T- n9 ^2 f! x9 v T
- <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">/ k5 x# h( }) C5 ?% W4 C6 F
- {{ message | capitalize }}" a4 ^. A2 u# C; _
- </div>$ p! W; U2 W( {
-
* G% D$ t7 b/ c - <script>$ A* K4 v$ I+ }
- new Vue({
& z/ ?6 }: ]; |3 k3 r - el: '#app',- Q; j* |- H( T* W! ~
- data: {- f2 u( \4 {$ y
- message: 'runoob'. O( [" f% n9 C: \) J3 z* F. v
- },
$ z' J$ z( }/ P+ F7 ~$ h! F - filters: { Q3 `3 D# \, V
- capitalize: function (value) {
3 I$ J$ I, Z: M - if (!value) return ''
! f. l5 r( y5 f C - value = value.toString()9 R" _& N" H! Z0 s4 o$ b( B- y
- return value.charAt(0).toUpperCase() + value.slice(1)+ k. @9 z6 w8 d# ^1 l& W
- }
) G6 n: K8 K* n8 \% L - }
" W3 H5 P# O5 Q* _7 T - }); m- ^+ n5 h1 _9 u- ?) d" i, Z2 o
- </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
9 Z3 t: U6 |' t$ R) L. @# ~+ u9 `/ s! X7 t* y( Q2 q" C
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->8 z/ T, K. z; K) v$ f; _
- <a v-bind:href="url"></a>
/ D8 R$ I) u2 _+ ^" N - <!-- 缩写 -->) g' {0 s5 t$ i, j9 o5 g- U% @
- <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->3 v% ?$ ~+ { Q! c! q3 `2 a! J
- <a v-on:click="doSomething"></a>
3 u. T0 a$ \6 x. { - <!-- 缩写 -->
" O# ~% ?) P2 l - <a @click="doSomething"></a>
复制代码 笔记7 ~1 |& J' ? p8 P0 M( i% |7 D0 s
给元素绑定href时可以也绑一个target,新窗口打开页面。
1 R2 U* {( R2 k' ^# F- new Vue({
1 G( z/ v2 ]3 _5 V, v2 @ - el: '#app',
, X6 g* g) w+ n8 x, x - data: {+ q& [. ~, z) v3 z2 M+ [! f( w
- url: 'http://www.runoob.com',
( l8 D9 Q6 ^, k - target:'_blank'" R# K% d/ P( G4 z0 N" @
- }
6 Z3 \1 n. ?3 o. E/ Y - })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
6 N9 j v, A7 |
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
_! y0 ~0 [2 `) x
: ~+ _2 I @1 A m1 h$ v, x
" S6 h! c5 _6 ~1 g/ E$ W, T G* S5 |4 ~) w
$ q# [# |" D, F
6 h- t! s x" b- ?/ o, N5 ]+ _: v1 [2 m+ A- p+ w. Y% ~, {: [
: r3 \/ M) @ n' b6 J6 M- g! m5 e2 o4 C
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |