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">
    8 l  T$ s  f" Q* e/ O, W4 _9 t
  2.   <p>{{ message }}</p>
    5 k- x9 c' T) p' s
  3. </div>
复制代码
Html
使用 v-html 指令用于输出 html 代码:
  1. <div id="app">
    7 H; U5 ^6 n5 O2 T$ Q
  2.     <div v-html="message"></div>. ]8 u8 Z: `' Z) a# Y. e2 \  a
  3. </div>
    1 c& Y' \2 I0 w; U/ c
  4.     * K4 R: T9 ~/ `, m- j
  5. <script>8 h) W( X& ?& X3 s+ ~* |. W
  6. new Vue({/ h$ u; a  H  C4 q2 ]% S
  7.   el: '#app',
    * X( d+ I8 r6 L  h
  8.   data: {
    2 P; q3 `8 W' p* n. {# l8 r3 P
  9.     message: '<h1>菜鸟教程</h1>'
    5 S9 X( Z0 u' A1 @) b) H
  10.   }$ [8 V) }6 A2 @7 R; h: y; M3 U; k
  11. })7 p6 m' T- e' H6 s
  12. </script>
复制代码
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
  1. <div id="app">4 `( A0 ~8 Z1 l6 v3 d# B
  2.   <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
    . h; A: o3 G- L. k2 j
  3.   <br><br>
    & z  N5 v/ R8 b5 C6 X& T0 X# Z
  4.   <div v-bind:class="{'class1': class1}">
    , b# w2 A% p, M% y+ l1 c
  5.     directiva v-bind:class
    - o! \' B2 L6 H& }4 N  e$ c2 A
  6.   </div>( f, J; f7 _. t- x9 u
  7. </div>( s4 ^! x$ E: V
  8.     ! w0 z8 F! ]# u
  9. <script>
    * C" N+ h. i: t+ c7 s
  10. new Vue({1 n7 p: g" s1 {' M, x8 q
  11.     el: '#app',
    5 x  U7 m$ Z. O5 f  q9 b
  12.   data:{
    3 {* R& l6 `# b$ m- W
  13.       class1: false$ R$ O* L6 \6 G: B' R
  14.   }
    1 D" @( Y0 }3 Y$ l
  15. });4 U3 z6 I! H7 x! \
  16. </script>
复制代码
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
  1. <div id="app">
    0 D; [: |2 }  ?( b4 p- V
  2.     {{5+5}}<br>
    % J4 j6 ~+ b1 R7 c3 f/ w6 t' w
  3.     {{ ok ? 'YES' : 'NO' }}<br>
    % h4 L5 R: c( Q6 m% ^, Y% v
  4.     {{ message.split('').reverse().join('') }}
    , x$ ^+ Z# T1 V5 {$ M
  5.     <div v-bind:id="'list-' + id">菜鸟教程</div>
    $ Y# q8 k  f  h! x
  6. </div>
    6 N. P6 N/ v- V3 h6 C! R8 b  h
  7.    
    , Y$ t* T5 W: p5 z" s- }6 @
  8. <script>  v0 E3 f5 A7 p6 }9 n4 {1 j- T
  9. new Vue({
    5 |1 L* x$ X' v( |& a  L
  10.   el: '#app',
    3 I5 L6 S7 D$ O+ A# }) H
  11.   data: {
    , j) g6 ~9 {$ \/ l, z; T
  12.     ok: true,
    " r; R1 R0 Q) }& {
  13.     message: 'RUNOOB',, C; J, l7 Q7 k$ T! s+ ^, M; A
  14.     id : 1
    . g6 B4 P; g. a
  15.   }7 I( |; t6 ?+ N
  16. })! d* T& Y- s+ }! j+ M7 b! c
  17. </script>
复制代码
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
  1. <div id="app">: _% w: E* V" R' Q6 r
  2.     <p v-if="seen">现在你看到我了</p>. I0 |, B' w, ^' G' V$ d& C3 ?
  3. </div>
      s# w8 C. c0 B% O3 z
  4.    
    4 M! F  S( |1 C7 F* Z" a+ O/ r
  5. <script>6 v+ J$ H9 n5 [$ m0 h# v
  6. new Vue({
    ) v* ~0 s/ o" i3 c, Q! d; C. |
  7.   el: '#app',$ K) O9 w) j7 B, P6 }. ~' @
  8.   data: {+ q/ N1 V+ b5 t; c
  9.     seen: true* k. J# r2 k0 T4 N% \
  10.   }- p$ G0 h" Z5 P3 c
  11. })
    7 o" x  z% C$ O  D1 m6 t0 J0 C
  12. </script>
复制代码
1 z; A" R4 \8 O
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
  1. <div id="app">8 Z1 y3 \& ?8 K! U7 w* r: ?
  2.     <pre><a v-bind:href="url">菜鸟教程</a></pre>* ^: G: s8 ~/ Y' M
  3. </div>
    $ f! e* z0 O+ u: W* ^& A
  4.     0 w/ @4 T  G% b: Z! d
  5. <script>1 C$ Q2 d; u4 d" f* ^/ Y" \# O0 ~
  6. new Vue({
    # y1 t$ R$ M2 @
  7.   el: '#app',
    7 h9 l" h5 J  ^$ p7 E, F: B+ t
  8.   data: {
    4 Q) t( A: g+ }. K  u
  9.     url: 'http://www.runoob.com') o* a, e5 Q  Q2 E) [! k
  10.   }
    & X' |* ^2 |3 ^5 O* M6 q
  11. })3 g* H4 s& Z, G  H
  12. </script>
复制代码
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
  1. <a v-on:click="doSomething">
复制代码
' T/ v# g) s2 K; d) g" \
  1. <div id="app">" [& G9 X5 |. N- W0 P, }2 }6 `/ ^
  2.     <pre><a v-bind:href="url">Vue参数</a></pre>
    - e6 D- _8 b; C; u* D- f/ ~

  3. ) y6 \" F5 c6 L7 ~5 D4 }
  4. </div>& {& ~8 K9 M' k0 |9 ?* S+ r

  5. 0 a  W* G7 k' q  S# o+ |0 ]! b
  6. <div id="app2">
    + }/ j- w# I/ P9 s5 e! @9 w
  7.    <p v-for="val in arr">
    - _, D3 q$ x4 c1 i( e
  8.     {{val.a}}7 V* u; e* C( ^+ z0 `. _) R
  9.    </p>
    ' O! h) _' b4 U
  10.    <a  v-on:click="tap">点我</a>; X$ J3 a: k, _- P1 w/ Z2 R/ V
  11. </div>
    ; _& r, Y3 c% N* m; v
  12. 1 Q& Y7 c* z, \* K9 d( q

  13. 0 ?) ?7 [+ Q0 z. y
  14. <script>- e+ v& U5 Q) Y& f9 D8 y7 A( q* m
  15. new Vue({" e7 c4 ]: U2 J3 C
  16.   el: '#app',$ d1 o+ y# s0 o
  17.   data: {
    8 T# i% r9 r$ \; D, [
  18.     url: 'http://www.cncml.com'
    / L0 u6 U5 H. l: D7 |
  19.   }
    7 K' E3 `" Q0 K  b2 p3 f, I
  20. })
    & B  t+ b3 u, R3 S1 ?: W% v
  21. new Vue({" @) E# x7 ?5 G
  22.   el: '#app2',
    ! Q! q3 h! x( P: m& [
  23.   data: {( X5 i7 |$ J% y3 {( J
  24.     arr:[' }8 ~' P& _# O
  25.      {a:'bb'},  D2 l/ l% [: V8 @/ }( O
  26.      {a:'cc'}0 F  A4 a6 _# n: c8 S
  27.     ]; j% M  r- i$ i% X- ?2 E2 T! p
  28.   },! X' y" ?3 p, C# s9 Z% x
  29.    methods:{
    4 \! F9 R# y& S( D. o
  30.     tap : function(){
    ( p. `8 J1 D' ^; _1 J" N
  31.      this.arr.unshift({a:'new'})
    9 U- B/ {* ?" Q# V) W& [4 j- V/ b) X
  32.     }; R3 b+ s. e; Y% y5 M1 f: |7 e
  33.    }
    7 z  o2 u/ o6 |: `/ v; M% ]0 U
  34. })
    6 e# F# P  K/ i# T' d4 I: p
  35. </script>
复制代码

. j& t; A! T& B2 n1 q$ g( w

% ~5 M; ]( N- Z5 ?4 a
在这里参数是监听的事件名。

% ~% E, g2 y6 O$ f. a0 s! X修饰符
修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
  1. <form v-on:submit.prevent="onSubmit"></form>
复制代码
* c* H) C. {4 J# z5 b2 h
用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
  1. <div id="app">' r( I" @. S1 k- p6 D
  2.     <p>{{ message }}</p>: K% R" ]+ B: W' }, L% F
  3.     <input v-model="message">9 ?3 j$ Z5 e! G) q5 |# O( d
  4. </div>
    2 R3 b$ S" J) s: |) k
  5.     - \+ i- s) |1 d, h" e
  6. <script>( i, X. _5 z2 P6 u2 X5 r- C
  7. new Vue({9 x6 m! D( K, J& F% n
  8.   el: '#app',
    + N$ O/ x/ e3 K( {
  9.   data: {; a' E! a& p5 q3 J, \9 e! Q
  10.     message: 'Runoob!'
    $ L7 c) f( i* [: |% j- Y; i5 ?: j& _
  11.   }
    ) \& Y' I3 J# s
  12. })5 G' f/ R3 F; ?; R$ @. ?
  13. </script>
复制代码
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
  1. <div id="app">/ `1 _+ D6 O! K  E
  2.     <p>{{ message }}</p>
    1 A: V+ Z0 S  i( g
  3.     <button v-on:click="reverseMessage">反转字符串</button>
    $ R0 ~& P2 |6 m, P7 k" k& `
  4. </div>8 w: ~- n6 F) R% O
  5.     & l+ G, R  A$ ?' F* ]( g2 ?& R
  6. <script>* g) g, n! Q9 M- L; W( g
  7. new Vue({# e; m1 P5 ^  }) [- L6 g$ G* L
  8.   el: '#app',
    ; g1 x3 {) {8 m! i* h" u- m
  9.   data: {! D! |. \% f3 a- O3 h0 I9 P
  10.     message: 'Runoob!'$ F3 H+ @+ _( E" Y% J
  11.   },% x' |: k: I& g7 Y1 K) r4 @( o
  12.   methods: {
    7 C! O: s, t7 o  P" K# b- M
  13.     reverseMessage: function () {  y; |7 z0 w  @# ^" q5 Q- @" z
  14.       this.message = this.message.split('').reverse().join('')
    ) O4 K3 P4 Z: z9 d' h5 \! g
  15.     }% d! C2 B$ _# ^* U1 |4 Q5 |  c
  16.   }. a0 J0 T3 b/ B& a/ F% ^& f
  17. })
      r$ C7 P* i# w8 u" A! y7 x
  18. </script>
复制代码
; y3 A; q5 A3 h% Q1 E! x: o( f7 T
过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
  1. <!-- 在两个大括号中 -->9 r' O2 E# p8 H, ]+ O9 w& J
  2. {{ message | capitalize }}
    1 v1 F, n2 h5 _  v: m8 R

  3. , H! M; i+ K: a! n  m1 S
  4. <!-- 在 v-bind 指令中 -->
    ; H0 P0 a/ D' R) r. x( k
  5. <div v-bind:id="rawId | formatId"></div>
复制代码
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
  1. <div id="app">
    ! N4 X& _; a0 w1 U
  2.   {{ message | capitalize }}2 \# C$ a/ u" r4 n9 H6 R0 X
  3. </div>; H9 h( T: l5 E8 \
  4.    
    - X  [* L) n8 U+ \6 T3 F# K
  5. <script>7 K  T& p8 T5 g) Q0 h% Q
  6. new Vue({$ k2 T  v+ X$ m+ ^0 f, z2 p
  7.   el: '#app',
    # Q6 H/ _, O, {
  8.   data: {
    , L) K9 f; p4 e% q1 w& k3 I
  9.     message: 'runoob'
    $ W% _4 B2 q/ f: a
  10.   },
    ; c2 t2 j" d- p! W* M! w$ l
  11.   filters: {+ W- r+ H7 G% d$ q' @9 z# [  i  `; Z8 ~
  12.     capitalize: function (value) {
    ) U" o  j& A9 D6 g
  13.       if (!value) return ''
      h( p: v9 G  @  I. W
  14.       value = value.toString()
    - @9 N, t8 H6 ~: u. A
  15.       return value.charAt(0).toUpperCase() + value.slice(1). B  j4 E3 ], q
  16.     }
    0 ]5 z0 F( a6 l) c3 T
  17.   }
      h4 E" R) l2 z
  18. })
    6 w  ^/ P3 E' `
  19. </script>
复制代码
过滤器可以串联:
  1. {{ message | filterA | filterB }}
复制代码
过滤器是 JavaScript 函数,因此可以接受参数:
  1. {{ message | filterA('arg1', arg2) }}
复制代码
这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

# q4 ?$ R! t/ c* L( q# Y$ `" q4 F+ F% s# D$ G, y) I, J
缩写v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:
  1. <!-- 完整语法 -->- c. K. m% Y4 E& ^0 ]6 U7 O
  2. <a v-bind:href="url"></a>
    & ^" b, D; C2 u. v- J
  3. <!-- 缩写 -->
    - G2 Y$ m; h2 ^8 J
  4. <a :href="url"></a>
复制代码
v-on 缩写
  1. <!-- 完整语法 --># l* e7 h  g7 H6 m' q  L+ J9 f: L1 C4 \
  2. <a v-on:click="doSomething"></a>; ?3 H3 ^& [. ?, I
  3. <!-- 缩写 -->1 V8 @5 G3 e* J7 {& j, g
  4. <a @click="doSomething"></a>
复制代码
笔记
, S% i2 x7 e0 K& Q9 \给元素绑定href时可以也绑一个target,新窗口打开页面。* }+ [. O6 C4 t- i3 b- [
  1. new Vue({
    + q* Z" r; ]3 v6 K
  2.   el: '#app',% T1 F9 ~. `  f( f/ o  l7 |
  3.   data: {
    3 _4 H( q( z& I( c' n
  4.     url: 'http://www.runoob.com',
    ; e( p8 [; h* y: R7 i: S
  5.     target:'_blank'6 O% [3 S: d- f0 {. e
  6.   }
    - I3 z# T/ [  B7 z# \
  7. })
复制代码
当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新

* A( E% L6 K! l/ \  y
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
2 h3 S0 N9 d6 y  a1 F0 y6 t

! U. X% e6 p1 l* C7 k; W" N3 i8 J) a6 u, s5 S- `, P1 p: J- O- Q! u

) e* k$ X, j! C* b5 p9 U) x! a7 i% f2 O; d5 c! V/ K% |
, |7 N5 C& w" J0 k4 U

8 P) M+ t- `. M, L! ~: C: [! S3 k3 n2 K5 }  Z- V( _! m
6 U8 D' S* w# g" n( [$ h





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