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">
% a) E, r0 D9 c: m# f7 ^ - <p>{{ message }}</p>
) w* {+ p2 M* I8 Q3 z8 E2 ] - </div>
复制代码 Html使用 v-html 指令用于输出 html 代码:
- <div id="app">0 k2 S: v% y6 s4 z2 m
- <div v-html="message"></div>3 E8 n& u( `2 r- c" ]% o {: K: [
- </div>, c" y2 A0 m- D, a& _
- o3 O1 [* ?& {9 g
- <script>7 K; k3 z5 N$ q) Y R, h
- new Vue({8 L6 G9 S; _, Q- o! f
- el: '#app',4 I N4 g3 H! ?+ T
- data: {
! P+ h9 z. L( @" e- B( R - message: '<h1>菜鸟教程</h1>'
_8 u9 _3 M! q6 u! b9 }* D2 K5 S - }- d0 ^ e# _0 L
- })
& [7 E; z% \, k/ s - </script>
复制代码 属性HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
- <div id="app">
, L5 n5 S7 b4 |& o( I" o) K - <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
3 w0 l* p( d" `2 Y" k% H - <br><br>
1 f1 }" X# _% E; Y4 q" Q# U0 I - <div v-bind:class="{'class1': class1}">- f% j% H! S0 z: ?# {
- directiva v-bind:class
( ?7 O! N) A& z# e0 a5 I; ~ - </div>
: r. [6 V6 r' f6 ] - </div>
8 G2 J2 [) L2 ?/ s& \8 Z/ s( y -
( A' E# `+ y2 S2 p- X - <script>
: z3 ? g9 s. f - new Vue({: [9 z9 \3 N0 f- `! M) q. N& D
- el: '#app',
; L; y0 s4 u+ t) @) g2 Y) V# n0 b8 Z - data:{" t7 Y5 B% _; M
- class1: false
9 m& _- H4 l+ ^' |1 U5 w* r - }
2 y. U# N9 ]9 R9 G - });% i# Y% _9 v8 t! o/ @
- </script>
复制代码 表达式Vue.js 都提供了完全的 JavaScript 表达式支持。
- <div id="app">, c( [1 S3 N o
- {{5+5}}<br>
7 ]5 Y. p) K7 S" z8 }6 w5 R - {{ ok ? 'YES' : 'NO' }}<br>
/ {; z; v C5 g- @& N, U" K - {{ message.split('').reverse().join('') }}
! X j/ v! H2 q5 f( i - <div v-bind:id="'list-' + id">菜鸟教程</div>
, @! ?- ~9 b: ^# E/ i! q - </div>* p4 a c+ |( o, D
-
+ I0 I2 }- `. Q8 v; O8 _. Z, X - <script>
6 ] w# k9 c' O4 G - new Vue({, X8 J; ?+ o1 D5 r2 f& c# Z: `
- el: '#app',# O: X& q& m8 i4 P( C2 A4 R( k
- data: {
~7 u- [* z9 u3 j( }9 L) S - ok: true,
+ ^* {4 V0 Y9 m6 t/ P- M* b& |1 P - message: 'RUNOOB',
- r( k4 p$ b1 `( Q W9 l" D - id : 1* T5 e! }7 R* g+ c8 {* q
- }
% O. E+ G! ]3 [ - })$ h+ S+ p2 |3 a* M5 v
- </script>
复制代码 指令指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
- <div id="app">
8 A- L. K1 T* X6 L* I' `) ?/ Q - <p v-if="seen">现在你看到我了</p>
7 {/ V! s2 E- C - </div>4 V7 I1 f0 i; x" r# }/ |
-
* s4 x7 Q; L( i$ B3 w' h3 x3 Z4 S - <script>/ V9 l2 i o# k% r: b" k2 v
- new Vue({8 [% E* }8 }, L# Z6 q. l, ? ]
- el: '#app',
. C; m- I# g/ g2 f4 Z2 | - data: { H- P/ r, L* B
- seen: true
9 s! u+ R. t) W, w! _# a - }
. y$ d' n I! ?' P( W5 x$ M - })
/ X8 P7 ~. Y0 P) T8 I g; @- s- H - </script>
复制代码
( G) a5 `0 V; I1 ~, x0 j* k0 ~这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
- <div id="app">" P+ o7 y( l% @* I
- <pre><a v-bind:href="url">菜鸟教程</a></pre>, J) X% U, e% ~$ R
- </div>/ h- h& u3 S# ^8 S) `7 x+ p/ a
- 0 Y+ ` x2 f6 f" L4 j+ y1 N3 H+ U
- <script>
d% o4 c" S4 y6 J- U9 b; ` - new Vue({
- W/ n3 H# K \# h, u" z - el: '#app',
: T9 J s9 F/ Y: t& O - data: {( e5 A% I% p" E; t* M6 X2 q0 j
- url: 'http://www.runoob.com'* R8 C! _# \. s$ u& g. Q3 |8 ]
- }! A0 H: ?* T, D4 B9 q0 X
- })
1 k; J S% s/ @1 ? - </script>
复制代码在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
- <a v-on:click="doSomething">
复制代码
C" ~, K" y; x4 j# S# R* z
- <div id="app">0 Y' K+ n* y' @3 }. [, S: [
- <pre><a v-bind:href="url">Vue参数</a></pre> T- Z" P* C6 D/ z" W7 K
" i! a% y3 r2 l- </div>
7 _# r. I. ] `0 W
2 m2 P2 l" b9 y4 ?/ r9 M3 N- <div id="app2">6 W6 V; J" N) F) Z) i$ u
- <p v-for="val in arr">3 C0 T( g6 g' h' S6 l
- {{val.a}}. K4 X; K6 j& ^1 A
- </p>2 p; L9 ]' }4 P5 W
- <a v-on:click="tap">点我</a>- d% b* @2 G; Y/ q; V3 ~
- </div>* o0 h: g; E' G) f& B+ I \0 @. e
/ } }# r: Z$ a
; t% f+ K1 X4 v5 ~1 W- t6 k- <script>
: ?' S% ~! Z1 F% [$ K+ K7 N+ p' f - new Vue({
2 `8 W- L* N8 h4 I* P6 d - el: '#app',3 V5 a x+ _) Y* c
- data: {1 Y/ z( `7 n) a' ^' N0 E( g2 p
- url: 'http://www.cncml.com'7 G; F9 a8 l; Z: _
- }' B4 J( N2 v3 S/ Z
- }); R0 l* y1 g" G+ w
- new Vue({! I( S$ W; H# h3 y
- el: '#app2',
! i3 j) P% ^, X6 Y8 _3 T - data: {
" m. b4 f6 q+ b- o1 \: v" d - arr:[
& L& [3 y# x" ~4 b# @' L5 w - {a:'bb'},2 o4 M; e4 j0 n% K5 M* [
- {a:'cc'}
& |2 T* p$ E+ Z$ x6 z5 M/ J/ K7 R - ]
1 a6 D/ g6 R8 Y' b! _8 A - },
# t/ a( b2 y2 B" R" O u - methods:{& k2 Z5 t" d& U j
- tap : function(){
( t% C6 o% E# G; \1 N& Z - this.arr.unshift({a:'new'})
2 r0 U/ `2 u R$ k8 w - }
4 ]0 i4 Y, q* K' e - }! n; f) \- T/ C; S- H
- })
F- ^; G2 |- X4 Z$ E& Y. c - </script>
复制代码 6 C+ @ N, ?# H& e9 \( Y! L; J1 P* s4 E
0 A, @& ~+ D1 T0 p7 G K
在这里参数是监听的事件名。
$ Q8 s2 K* h9 N* U
修饰符修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
- <form v-on:submit.prevent="onSubmit"></form>
复制代码
2 T1 \" J. G+ a/ F! ^* B2 f用户输入在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
- <div id="app">" |8 i9 l5 I9 R% B" Y; ]
- <p>{{ message }}</p>! l6 s i* r' ?' _" ~ d$ y7 @
- <input v-model="message">
) G. n* F2 n, I - </div>
, [& e, a' s# ~& z - 6 V# z$ l! l. n8 s
- <script>
6 Z% x0 G& a6 I' N. e - new Vue({
; d! E: j0 I+ b( J - el: '#app',% d+ I, h* v ?' n; u8 U0 d* ?
- data: {
. G+ C) I- [. c" q3 n- f8 D - message: 'Runoob!'$ J( |0 A6 d! H
- }
# z- f0 R& x; J" P7 l - })
8 \+ \2 S- [0 I) ]5 O1 f - </script>
复制代码按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
- <div id="app">
' W6 z/ ]. C7 n& _, Q* ^; X* \ - <p>{{ message }}</p>
, @' f% A) G9 P - <button v-on:click="reverseMessage">反转字符串</button>
1 A! b7 }. k" M2 d - </div>1 o: e' t9 w. F5 j0 n
- ; k- T/ J- l4 D" p* L: x3 Y0 |
- <script>% i1 D3 b/ j/ @+ l4 w) \+ }
- new Vue({
4 X" [. a. r6 |% Q p j$ y' e - el: '#app',7 t4 _" `0 \6 y1 G
- data: {
3 t3 G$ Y% x" F- O - message: 'Runoob!'; j9 v9 b8 \; ~. X3 y3 X
- },! i5 ]! p p, L2 D% D3 T- x
- methods: {2 F4 N2 X$ e5 ~8 _) n6 x
- reverseMessage: function () {5 `* h, [3 |; Q4 A
- this.message = this.message.split('').reverse().join('')
2 b8 o0 m8 V7 j - }7 Q. x6 Q, A" J. U
- }( e+ @0 K6 o+ L! d r
- })- p5 F: U0 B% [8 s \+ R
- </script>
复制代码
8 E: A* _. g: c5 A过滤器Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
- <!-- 在两个大括号中 -->
0 j7 Y9 e( ] y- I. A - {{ message | capitalize }}
9 G% d' w% U7 h
' ~: |: S' q/ j6 W- <!-- 在 v-bind 指令中 -->; F4 N4 Y2 \$ c
- <div v-bind:id="rawId | formatId"></div>
复制代码过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
- <div id="app">
9 ]+ f3 n; k& S q' u4 p; X - {{ message | capitalize }}
/ P# l5 e* p( u2 } F7 ?! W& G - </div>
) l: I2 n" N) j( N: N1 n& q ? - . D: l: C! |) R1 d- ~ a) N$ L5 \
- <script>/ P$ H& e* x. E7 B9 s" d
- new Vue({
8 B# D& b. n9 Y6 G" N" | - el: '#app',
& i& f9 e3 ^) J. P; C, \ - data: {
" w: F0 S* m( e - message: 'runoob'
; J) F, c% o9 ]) R; G7 K - },5 m% c. V& t4 B3 s: w
- filters: {
9 |# v* E+ e# T2 U, u# O# p - capitalize: function (value) {
) |( X4 z& }* q4 P - if (!value) return ''+ T% O8 z! a2 \7 g
- value = value.toString()
* _! D5 x' w4 [2 i* C/ J A - return value.charAt(0).toUpperCase() + value.slice(1)
4 f* B+ ~( [9 n8 ^1 I - }0 u+ k7 g/ o. b% |( n& y
- }7 O* U; g& v; P1 v
- })
% N# b: o* g1 T1 p; \! q - </script>
复制代码过滤器可以串联:
- {{ message | filterA | filterB }}
复制代码过滤器是 JavaScript 函数,因此可以接受参数:
- {{ message | filterA('arg1', arg2) }}
复制代码这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
9 T8 R' N1 x& j0 N* O# n# c
: X2 C- a/ R6 H' |# t
缩写v-bind 缩写Vue.js 为两个最为常用的指令提供了特别的缩写:
- <!-- 完整语法 -->
; M4 e$ c$ u2 F$ y$ O8 R! v) q! w - <a v-bind:href="url"></a>
3 {6 O( |: r, g/ U& f e - <!-- 缩写 -->" g) k% _, |. \! S9 r7 u4 M& p/ R# y
- <a :href="url"></a>
复制代码 v-on 缩写- <!-- 完整语法 -->
. p. L0 f& y# X9 v1 n" c7 K/ t4 A - <a v-on:click="doSomething"></a>
8 H' k+ H U4 j - <!-- 缩写 -->
4 _% K8 l) Y6 }7 {( a - <a @click="doSomething"></a>
复制代码 笔记
0 }! |! J" k0 r1 x1 W; q& M给元素绑定href时可以也绑一个target,新窗口打开页面。3 N8 p* S8 i5 Y8 f* u+ s
- new Vue({/ w: [* T$ a U4 L. P
- el: '#app',8 J9 S% Y6 {9 i) ?
- data: {
: ]% H6 P8 v) } S2 g1 ^7 J - url: 'http://www.runoob.com',. @1 O$ P0 z* E* H
- target:'_blank'9 _. n4 ]1 |! B" D: J
- }6 B" q! k+ F. w* _6 p
- })
复制代码当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
% E* y8 ^$ m- T3 {0 d, x
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
: l5 Y! b6 O1 p2 t
; F( ^/ S5 v+ _4 S$ m% ]" R! Y9 [/ `- I4 Q8 c7 W/ I# P) o
" u3 I; j; T# ~& A$ q* n0 n. I/ A( Y0 b# A! `7 n6 j
$ \ I& e B0 G# H
9 ^# g5 c3 y- i' h
9 S, J$ d7 d4 D0 C) B- ^
4 H8 H3 C3 T0 @; M) b
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |