cncml手绘网

标题: Vue.js 模板语法 [打印本页]

作者: admin    时间: 2018-7-1 23:16
标题: Vue.js 模板语法
Vue.js 模板语法
Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

插值文本
数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值:
  1. <div id="app">
    7 G; v% T6 Z5 C
  2.   <p>{{ message }}</p>
    9 p6 N: [6 P( y' S7 r
  3. </div>
复制代码
Html
使用 v-html 指令用于输出 html 代码:
  1. <div id="app">
    1 d% ]% ?3 D# n" J
  2.     <div v-html="message"></div>) ], M; k& z' o" i. ^
  3. </div>! x8 A2 B# X# ?
  4.    
    * r) I6 {8 Q3 Y0 F: W
  5. <script>
    # `* a' l8 A0 a
  6. new Vue({& `' u6 u2 u3 W7 H' p
  7.   el: '#app',
    " S. O. e9 ^1 p
  8.   data: {
    $ [5 ~+ H/ S: `$ H
  9.     message: '<h1>菜鸟教程</h1>'
    9 t' N. k( k+ O" p
  10.   }+ A# T7 j0 a7 o1 Z8 I
  11. })* o/ u! s* o. j8 d- s: N) \# \. T- _
  12. </script>
复制代码
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
  1. <div id="app">* C8 C! n9 X- K! w+ F
  2.   <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">9 @& l! O' d5 ?5 Q
  3.   <br><br>
    9 {0 z5 L9 s2 l! z6 w
  4.   <div v-bind:class="{'class1': class1}">
    * \: ~$ c4 e+ m& `0 }
  5.     directiva v-bind:class3 f, V4 @) D+ t# a" t
  6.   </div>" ?3 a/ l: X% V) c0 i# t0 m
  7. </div>0 e& S; R6 h0 M
  8.    
    * [+ g9 Q, `: L
  9. <script>
    8 R9 Z( x( r8 x
  10. new Vue({
    2 o' b+ A( J4 T  r; p, y$ S) B
  11.     el: '#app',
    % t7 j$ S$ ~. d  C# E/ @8 I
  12.   data:{
    9 k5 _3 F0 @; J; L
  13.       class1: false
    6 a1 T3 _0 k% W  r2 e
  14.   }# \: v- G3 E- X
  15. });
    3 H- c2 b! p% }
  16. </script>
复制代码
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
  1. <div id="app">
    ; W8 J7 {2 p; l4 y6 X+ L
  2.     {{5+5}}<br>
    " m) x' Y. I& {( c
  3.     {{ ok ? 'YES' : 'NO' }}<br>
    1 T% E, R0 l# c! p" p1 ?5 ?+ `
  4.     {{ message.split('').reverse().join('') }}
    & O2 I# m! O( Z* x7 G* a0 h
  5.     <div v-bind:id="'list-' + id">菜鸟教程</div>% Z4 I  {8 J+ R9 |
  6. </div>) J. k2 w0 U, {2 X
  7.    
    2 K" Q3 `; j' s$ _% n5 Y
  8. <script>; n0 E# {4 b) a: T% C5 o: V. M
  9. new Vue({
    5 V6 v1 S# ]4 O8 R, Z- X/ |
  10.   el: '#app',+ P( F$ X1 Y& R# e. J/ ~# f
  11.   data: {
    * j$ H) e. `# f: o) u6 ?
  12.     ok: true,9 F+ {/ m* |( I
  13.     message: 'RUNOOB',1 e7 B: w& A$ v9 j  M" ^; U/ o
  14.     id : 1! `% Y$ s4 m% v% Y
  15.   }  ]$ S0 g$ X# q2 f4 |" l+ c$ E% Q
  16. })
    6 |; z/ Q) p% O# _- z# I' S, A! `
  17. </script>
复制代码
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
  1. <div id="app">5 }  a' }+ ]/ B
  2.     <p v-if="seen">现在你看到我了</p>
    6 D  r# y' I- L2 f
  3. </div>
    ! A, Q9 R8 i- {4 S$ W) V5 `7 P
  4.    
    , J4 \# L& h* M% R$ d* x( R
  5. <script>
    " ]9 Q2 e" S) T; n
  6. new Vue({- i6 m( V7 `% [0 ]/ Z
  7.   el: '#app',: a2 d) \+ g3 U
  8.   data: {
    9 G" [/ S  c3 o9 q( \
  9.     seen: true
    ' J3 G- ]% ?: n) M8 [' G1 t$ w$ \
  10.   }/ I; f  d1 }! _, {2 E& K
  11. })7 Y$ f9 Y/ R+ \" `& G
  12. </script>
复制代码

0 q+ @9 r) f8 H9 ^2 `* E
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
  1. <div id="app">
    5 K3 n1 R. @* t! Z
  2.     <pre><a v-bind:href="url">菜鸟教程</a></pre>
    ) N! X5 F9 Y% U% A( B6 }: M. D
  3. </div>
    8 D% p) ^9 ?* @( R! F! p- F" H
  4.    
    9 H/ ^2 N& I( c0 @* d0 ~  A
  5. <script>
    0 j; `4 ?6 K3 E; i
  6. new Vue({
    ) v& }# j+ d/ T$ B/ l$ i9 o
  7.   el: '#app',
    ) v) c8 `6 Q% u$ O0 E8 _
  8.   data: {6 O; @+ T+ G& j4 ~  B6 Z
  9.     url: 'http://www.runoob.com'% S: @) o' Y/ e
  10.   }+ z$ ^% D2 z9 r3 h
  11. })* i4 L8 T! W& M7 i: {
  12. </script>
复制代码
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
  1. <a v-on:click="doSomething">
复制代码

  k: }: W0 r/ N% X( p
  1. <div id="app">  i5 k+ |9 x5 r. g0 j3 {6 J
  2.     <pre><a v-bind:href="url">Vue参数</a></pre>
    , y, `* L! R% Z2 o0 K# z
  3.   A2 m. [; j! H" o
  4. </div>
    ! f5 \* M% t9 D: Z

  5. & D1 ]6 B6 L6 V
  6. <div id="app2">8 q( V8 \- t/ w) q
  7.    <p v-for="val in arr">
      d5 d1 m1 A6 F+ X$ \# {. T
  8.     {{val.a}}2 I& q  e4 G, s. W$ `4 o
  9.    </p>+ L; a0 l; T# G" a7 q0 K" ?: K1 V
  10.    <a  v-on:click="tap">点我</a>+ C- Z- `$ v' |, z0 j
  11. </div>9 ?) i5 x2 S0 D! ], X/ g
  12. * X4 D6 F7 m5 v2 S
  13. 9 r, ~6 F& Q# Q! c6 l8 U) q1 X+ t  B
  14. <script>7 v& S7 l- U3 c6 C
  15. new Vue({# n9 r! z7 ~! |1 V; N: Z  ^3 L, t
  16.   el: '#app',% S# \& i) `+ Z; ~
  17.   data: {: {% p" r) U6 m8 X& O
  18.     url: 'http://www.cncml.com'7 p, l8 Y) y9 ^2 r% ]
  19.   }& S$ Q9 c  G4 S: ~* o/ |' d
  20. }), K* k" q6 {9 U" s3 D9 D
  21. new Vue({; Y! V: d9 v- H4 W' p
  22.   el: '#app2',
    & ~. \5 [- F+ ]! X2 }
  23.   data: {
    ! E; ^* L) M: v: K+ b' R& U1 ^6 k
  24.     arr:[5 y* V; p& f* u3 \* n- c- W) r
  25.      {a:'bb'},  V, L( G5 t2 T, m/ t; Z
  26.      {a:'cc'}" w1 x; A# E) s* Z
  27.     ]
    ) {" D% h8 M6 w0 f# L1 R7 [# Q
  28.   },
    9 F, r# X" D$ I0 G4 Y  C( B- D3 A
  29.    methods:{
    / {/ k9 r, l6 E; m6 w3 P
  30.     tap : function(){6 N- z, z" X$ B0 ~7 _7 M# _6 I
  31.      this.arr.unshift({a:'new'})+ ]$ Z+ E  D; `$ G8 u+ ^- i5 d
  32.     }
    ; Q) S6 W8 C8 m
  33.    }5 ^* N: Z: n" \
  34. })
    3 \; i% v0 _( d
  35. </script>
复制代码

/ c/ _; x6 o( m. O' Q* R; Y+ Y3 q! V
9 \5 ]! Z' q, G2 Q3 S; Z
在这里参数是监听的事件名。

, L9 {  `' m5 R6 L& p' B3 h修饰符
修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
  1. <form v-on:submit.prevent="onSubmit"></form>
复制代码

2 \) y$ M5 x3 o# i用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
  1. <div id="app">
    2 g) M+ K- {6 x! U# L$ J
  2.     <p>{{ message }}</p>+ |% B3 l9 e3 [& u
  3.     <input v-model="message">8 S* U& b& k, P/ t* T' `
  4. </div>
    / m' u/ S+ [6 N( I5 b
  5.     # s) Q4 t8 u0 t- e5 Q
  6. <script>9 x5 }/ b/ |/ B
  7. new Vue({* f- C: ?$ W1 j# M8 H. i0 f; _
  8.   el: '#app',  H( r  Z5 g: u% \/ P- K1 L. R. P
  9.   data: {
    / I" e7 {4 b# x
  10.     message: 'Runoob!'0 U; Q* K$ O! H$ P3 {$ E8 H
  11.   }
    ' {( V' g( R6 k
  12. })
    7 _, C% o; E5 y- F: Z0 R  s
  13. </script>
复制代码
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
  1. <div id="app">, ]4 Y8 H/ `1 J
  2.     <p>{{ message }}</p>7 x% Z. V) ~. X' u. t  C6 `! `# x
  3.     <button v-on:click="reverseMessage">反转字符串</button>
    2 k7 }0 L  b5 R4 A0 m( z9 h" g! r
  4. </div>, c, J- [0 o" ]
  5.       G4 D% S6 j& E' c/ ?% I
  6. <script>( q+ C; W6 I) h
  7. new Vue({
    7 b- ~* s& }8 U
  8.   el: '#app',
    / {- m* b; @; j) G+ E% G$ z: ]
  9.   data: {
    , Q2 I. q  n* |% Q, ^  K
  10.     message: 'Runoob!'$ h9 I/ B$ h7 l1 m9 ~9 X
  11.   },& S" a% @* ]5 J/ T/ j
  12.   methods: {* ^- @) J5 n+ f$ U5 `
  13.     reverseMessage: function () {
    ! _& ?3 u4 C: c1 |; E' I1 @" H
  14.       this.message = this.message.split('').reverse().join('')# m. u" h$ U( ^3 q$ O# t/ h
  15.     }
    ( r; |% r4 y% z6 b
  16.   }
      J2 r/ v8 C6 D8 X  k9 Z
  17. })2 P( ]# W9 J, N3 l, D; @) \1 C
  18. </script>
复制代码

+ f% y0 E. w; T9 |% ^过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
  1. <!-- 在两个大括号中 -->  N3 @2 ^) n, e
  2. {{ message | capitalize }}
    / h; G0 g- U5 Q

  3. 3 k' R; I+ K" N
  4. <!-- 在 v-bind 指令中 -->
    : B; H, A6 I; w$ D% N
  5. <div v-bind:id="rawId | formatId"></div>
复制代码
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
  1. <div id="app">& s3 @3 m' k4 u, _: v
  2.   {{ message | capitalize }}
    - @7 K9 D; L/ O0 a1 z
  3. </div>: u3 a6 Q$ m9 L
  4.    
    0 I% K* X! h4 j) ]* q- g: p" n+ U
  5. <script>
    1 D* Y0 t) L1 j7 L, n0 R
  6. new Vue({
    , l# e  K& `4 ^/ L5 j, |) c
  7.   el: '#app',
    " P: D, ~5 M' z; H* ?2 Y
  8.   data: {, ]9 D* U" |3 N9 @' r6 }) O* S
  9.     message: 'runoob'1 C& V3 m$ f2 M' ~: r& F2 ~1 \' u6 K8 Y3 R
  10.   },
    ) @; ?7 l# N6 C3 X# u4 C9 I% I
  11.   filters: {
    * x& h  T7 R3 T( z2 w* M# w
  12.     capitalize: function (value) {
    0 C6 Q" H$ z  s$ X% ^+ E% u
  13.       if (!value) return ''9 J* c, P) F. _: Y: r# l2 J
  14.       value = value.toString()2 g1 `, t! {4 g/ L- t+ e1 @5 a
  15.       return value.charAt(0).toUpperCase() + value.slice(1)
    . j  ~' _3 x! p5 K
  16.     }# U1 ^0 |8 e/ u. a. O
  17.   }
    / A( `/ }5 U. S* a1 S$ o
  18. })
    + o0 E  [4 O8 O+ `2 E. a
  19. </script>
复制代码
过滤器可以串联:
  1. {{ message | filterA | filterB }}
复制代码
过滤器是 JavaScript 函数,因此可以接受参数:
  1. {{ message | filterA('arg1', arg2) }}
复制代码
这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

! U) k) R# E5 K- }; ^' ~
) U2 g3 F, B2 {4 u1 f& r, f" Y4 Y缩写v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:
  1. <!-- 完整语法 -->, G6 Z) }! k- u0 r
  2. <a v-bind:href="url"></a>0 c# c0 L5 w" R) ]
  3. <!-- 缩写 -->
    ( l; R. ?* p. z
  4. <a :href="url"></a>
复制代码
v-on 缩写
  1. <!-- 完整语法 -->
    ; F+ _" c, x) b7 p  E5 d
  2. <a v-on:click="doSomething"></a>5 H! ~& y( _5 Q/ e" q6 E
  3. <!-- 缩写 -->( X% H. i$ O9 }: W' B: O
  4. <a @click="doSomething"></a>
复制代码
笔记
5 ^# b: v9 }1 v5 i给元素绑定href时可以也绑一个target,新窗口打开页面。: v* j: G/ P4 W3 T' G; n7 I6 _& H
  1. new Vue({/ J+ i% A, s/ l* W% E- g# `
  2.   el: '#app',8 ~4 O  O! n- u, A$ q
  3.   data: {, I/ P+ u1 t" K5 J6 _8 q0 E# l! ], Y
  4.     url: 'http://www.runoob.com',: S$ O# }+ n7 q' w# ?+ \* o3 H
  5.     target:'_blank'
      b7 C" u; E4 {1 v+ Q0 b  n
  6.   }  |2 T' d( Z# b5 }# e
  7. })
复制代码
当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新
/ T+ j% A2 H/ O5 M  N
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
$ K$ v8 B8 H. Y. }9 d) d

6 X9 t' W5 ~4 N( A. c
9 q8 q: M  f, o3 T6 @4 y
/ I! B: Y: s! N6 S% r8 E3 I( O0 V) |% D
7 {* g/ f/ g0 {6 K1 {
3 A9 [. s$ V2 @3 P- g3 o

4 A. N/ S5 y% Y; q+ T- W2 k
2 h8 @1 K! m/ c




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2