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">5 j, X; s" o2 N5 w( l
  2.   <p>{{ message }}</p>
    9 B/ x4 g# P. \' v6 n
  3. </div>
复制代码
Html
使用 v-html 指令用于输出 html 代码:
  1. <div id="app">
    / m- x1 p) T/ @! _0 `! o1 f
  2.     <div v-html="message"></div>
    " d/ S4 k8 t, o
  3. </div>
    . t! ^9 _( X9 c5 q, q6 m
  4.     7 t0 k' w/ {% x! t8 X* e- c
  5. <script>
    + n. |0 F4 R5 J( O* l/ \
  6. new Vue({
    6 _+ O* m4 Y5 A4 u
  7.   el: '#app',0 B$ L/ \& p" v/ A0 e
  8.   data: {
    0 ^9 R- s! a+ N
  9.     message: '<h1>菜鸟教程</h1>'8 Z) L4 t* Y  d9 o+ m
  10.   }
    ! Q8 g3 y4 Y  T
  11. })
    # O6 L+ e) |) n
  12. </script>
复制代码
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
  1. <div id="app">" f: y+ I5 r7 w; S- g4 X. g: t
  2.   <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">( t' k! \# F. l
  3.   <br><br>
    3 {- W8 _0 }, I
  4.   <div v-bind:class="{'class1': class1}">
    ( H7 h+ F1 v4 _  s
  5.     directiva v-bind:class$ f  x: ?3 v! L! F; u
  6.   </div>
    + M# @1 C# H3 J1 y* N9 _8 l
  7. </div>& j5 n, z  K$ ^- |
  8.     ( p- k/ _- y5 k* Z$ d4 g
  9. <script>
    # L  p+ D" l7 E) \5 K) p5 p
  10. new Vue({# c# B* q5 R- g: H$ i7 Y3 V. _1 j- N
  11.     el: '#app',' E0 Q8 m8 G1 k9 F7 D" l
  12.   data:{- v$ B6 E( m* j
  13.       class1: false
    4 {4 V" Q: ^( r& m5 A
  14.   }
    & L) }7 Q% Y. P* n( ?, ?
  15. });
    / S* v1 `5 M9 _! I6 _/ G- P" G
  16. </script>
复制代码
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
  1. <div id="app">& d: O; E- ]. N- K( w
  2.     {{5+5}}<br>
    & w6 {4 T/ E, z! c- j# Y
  3.     {{ ok ? 'YES' : 'NO' }}<br>, U( r7 n# Q' X# I* R1 {) ]2 E/ D
  4.     {{ message.split('').reverse().join('') }}
    $ O. ]% w  Z! J( q+ L, f
  5.     <div v-bind:id="'list-' + id">菜鸟教程</div>. C- x: }8 B2 p( Y1 m3 q! J
  6. </div>
    / [9 t( f$ d# f
  7.     / F' N$ m" O  S
  8. <script>7 X: P* @$ ^4 p
  9. new Vue({
    ; G! F# `1 s8 A* `, j9 z, i- Z
  10.   el: '#app',* ^6 j6 E8 w. ~- i# h3 d
  11.   data: {) {: x- n! c3 G. e
  12.     ok: true,
    ' d' A' u- X" K4 i& _# O/ B
  13.     message: 'RUNOOB',! M" y5 s, E' u/ Z$ s9 i: v/ o& W
  14.     id : 12 p$ l% L! v! H2 K
  15.   }( \& ~6 [7 |  X$ J  O* l
  16. })
    . m  m) l0 J# N8 C- m. ?7 r9 T
  17. </script>
复制代码
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
  1. <div id="app">
    ; [2 N& L/ K7 E' l# c
  2.     <p v-if="seen">现在你看到我了</p>' N) Z/ q; z1 e- T; r! K
  3. </div>, M6 w% e% D7 Q( g+ t
  4.    
    ( f' U! S: B5 X# C6 K3 ~
  5. <script>
      `9 j9 I9 c: ]/ ~4 C
  6. new Vue({
    6 a0 X* o7 f5 k4 o
  7.   el: '#app',
    - D% Q0 V  g% v1 v
  8.   data: {9 x, |! E( _8 ?1 v- \! ?  L
  9.     seen: true. H$ d* Q+ p6 O5 }: p( f: B9 F
  10.   }0 ~7 K8 P) y  d1 t$ s
  11. })! r' c4 o" _- m( l/ T+ D; `, f
  12. </script>
复制代码
" K# |, ?6 g" k2 Z+ n7 o0 [
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
  1. <div id="app">; ^* J. T# ]1 ^6 N, |; A4 o" ~! a
  2.     <pre><a v-bind:href="url">菜鸟教程</a></pre>+ A+ {: x9 I$ x4 d  p% f
  3. </div>% O# @0 r6 N4 H2 P' d( F& E) P2 R6 u8 [
  4.    
    - p) v2 b* H3 l' ]+ h+ y
  5. <script>
    7 u# x$ J  Y* T/ u- H4 y
  6. new Vue({, i# J+ a! ]$ R: t, a4 {
  7.   el: '#app',
    : G: v' ~# ^. z) _  ~
  8.   data: {$ ^8 {; O5 b; j
  9.     url: 'http://www.runoob.com'
    . k; _9 H& P' W* n: u+ j& d
  10.   }
    4 x6 j4 C0 x5 @& p1 m3 e
  11. })6 |+ H0 U& m+ x7 l! f3 |9 q4 g
  12. </script>
复制代码
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
  1. <a v-on:click="doSomething">
复制代码

' F% ~3 F, V( K# e$ b! T
  1. <div id="app">& @8 R; ^5 m$ M% z" ^0 ~  x; I9 _
  2.     <pre><a v-bind:href="url">Vue参数</a></pre>. V8 R; O: I$ B1 g- J" m3 z! d2 N

  3. . j  ^0 Q2 R8 b5 h6 L, x4 K# v
  4. </div>
    ; V0 R' I/ y  k# Z

  5. ; V- M5 o- B2 [/ ^
  6. <div id="app2">" X0 b# ^  Z/ |% ]5 h" U
  7.    <p v-for="val in arr">
    " b* I0 Y" u2 Y! M# |
  8.     {{val.a}}
    ; v9 o) d6 }& Y1 S4 d: {8 |
  9.    </p>) F9 N: [/ Z( C0 M& V8 N
  10.    <a  v-on:click="tap">点我</a>- [$ y/ j$ F$ J( e9 P$ r/ Q
  11. </div>) j) [! }& S6 ~+ u. h, p: k
  12. 9 s! |  M3 N4 [% n4 ~' \9 J& h
  13. 1 s' W2 F; X) z
  14. <script>3 b+ w2 L/ T. u& h1 ^- c. T
  15. new Vue({# G2 P% c) K: M
  16.   el: '#app',
    $ l. d# m4 o. e6 E
  17.   data: {
    * T* y  f8 L2 v  F+ y
  18.     url: 'http://www.cncml.com'
    3 ~% J  |6 H/ `, A6 a' `6 C
  19.   }
    ( m2 C$ F9 }5 K* }6 l" ]
  20. })1 z5 ~/ P. V) g& B: p- z$ ^
  21. new Vue({
    * I4 s* s& Q; N: S: U' e
  22.   el: '#app2',
    % A* d$ k) A1 n
  23.   data: {' c2 _& b! F0 U$ {( g
  24.     arr:[8 d1 X7 Y2 C; e- ^$ K2 I- @& b
  25.      {a:'bb'},( L3 \" C) V; ~$ |8 ^
  26.      {a:'cc'}$ l" Y7 G" q4 F( G
  27.     ]
    + |+ |# G* t0 A" C$ O
  28.   },
    " p) `0 _% j7 d5 u/ F0 B
  29.    methods:{9 B; S1 ?' H& @* Y
  30.     tap : function(){! g7 L) N! W  g  _0 f8 N, n
  31.      this.arr.unshift({a:'new'})
    & m1 D& \8 L" V5 o" i1 H1 u
  32.     }+ S' j9 Y7 l$ \
  33.    }7 ~5 {7 \! e& ], w0 p
  34. })% k& V9 T- @, `/ X6 }
  35. </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():
  1. <form v-on:submit.prevent="onSubmit"></form>
复制代码

0 [" w6 Y9 _' q, z# `* f9 [* S' W用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
  1. <div id="app">
    9 ]4 ?: ^9 ^% B; K8 w
  2.     <p>{{ message }}</p>
    ) x8 P9 R& N! ]2 h6 ]5 A- j' e, Z
  3.     <input v-model="message">, I2 m3 [' q) B: v
  4. </div>8 m% `! t" i- \; n
  5.    
    / F; h7 _+ T# e5 c/ M' g. e
  6. <script>0 r# S6 q1 T4 B, ~/ K
  7. new Vue({$ s/ H7 ^2 P" H2 l. U) w" U
  8.   el: '#app',
    ) L& u: }% H& @
  9.   data: {
    " n% X. R* D1 O% }6 }# m
  10.     message: 'Runoob!'
    % S4 n& Q" T  H& q- {5 X1 f- g) I
  11.   }+ B) C) `, |0 F  \# z
  12. }); Z7 [1 Z" M+ i% `1 Z% P
  13. </script>
复制代码
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
  1. <div id="app">" U3 h$ c3 ~/ {* E
  2.     <p>{{ message }}</p>! D! B; m% ~$ l7 q3 x4 e
  3.     <button v-on:click="reverseMessage">反转字符串</button>
      l5 y/ M4 G) R) i: l9 \6 f( q; @3 ?. ?
  4. </div>
    2 v/ n) e' h6 l' b
  5.    
    7 `6 |! Q7 X1 W6 F, @
  6. <script>) F$ G& s0 Y4 D, _
  7. new Vue({
    $ y' d  F7 E- ]6 w: s  u
  8.   el: '#app',4 t" v( l  X, L, Z9 a! g
  9.   data: {& L9 e9 [/ o" b' X/ s( u; G/ @
  10.     message: 'Runoob!'6 L& J+ y1 r! Z' p0 U5 ^, Y
  11.   },$ @( H* E8 L. `: B3 K& P& w
  12.   methods: {
    1 q! r# T* W' }
  13.     reverseMessage: function () {, y6 ~/ W  d9 F6 ^$ N) y1 v
  14.       this.message = this.message.split('').reverse().join('')
    3 |! Q: H$ j# m* e2 }* J; @2 Y
  15.     }% l& f1 ]+ I; ?) T+ g* X4 h
  16.   }; D0 N+ r+ X. J6 F: U3 |; s$ H0 `
  17. })
    - _: s1 E" z& h: r8 ^
  18. </script>
复制代码

2 e5 k! Q; G" V0 `/ h过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
  1. <!-- 在两个大括号中 -->8 ~# u4 J7 D5 u0 S/ ~. r- Y9 |
  2. {{ message | capitalize }}6 w) Z$ d  t' F% t8 Y) y! O
  3. 5 |) U. y. h; c, R" \2 [, C. v
  4. <!-- 在 v-bind 指令中 -->
    " ]0 P. U# V5 ~+ i: l$ a* w8 x
  5. <div v-bind:id="rawId | formatId"></div>
复制代码
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
  1. <div id="app">
    5 m* p% U+ x/ ^0 {) p
  2.   {{ message | capitalize }}' a+ `4 W& O9 y
  3. </div>4 `% `$ e+ K0 j3 P. M, n1 R" R8 S
  4.    
    . a% ^8 Y, {' Q2 r& |% k  T
  5. <script>
      ]- C5 X: h' o6 k& H
  6. new Vue({
    : G/ ^6 ]) k/ @( E3 g
  7.   el: '#app',% f3 p& b/ \2 G1 A5 o/ O
  8.   data: {
    * g, w0 M) F3 R* L0 g9 S
  9.     message: 'runoob'
      i/ S9 U$ o0 }0 W" L' ~# d6 k
  10.   },' d6 b. L* x7 @( @6 [0 u) N
  11.   filters: {7 n- _+ b6 s: }+ e
  12.     capitalize: function (value) {" S2 o+ r* ^- l0 @8 e
  13.       if (!value) return '') L1 @8 A- _; ^
  14.       value = value.toString()3 W- k9 E7 |( e2 [( o* R+ @
  15.       return value.charAt(0).toUpperCase() + value.slice(1)4 V6 W  l; f1 h
  16.     }3 y: v( V4 Z" V$ q6 G( r
  17.   }% G% O! k# _; t! w9 Q0 Z5 I
  18. })1 d* l) K. E9 E$ u
  19. </script>
复制代码
过滤器可以串联:
  1. {{ message | filterA | filterB }}
复制代码
过滤器是 JavaScript 函数,因此可以接受参数:
  1. {{ message | filterA('arg1', arg2) }}
复制代码
这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

! e' h+ m; {7 e' @- B2 M$ L1 Q& ^% f1 X# p' |) O
缩写v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:
  1. <!-- 完整语法 -->4 Q0 J( i7 {; E0 v7 b! K3 L
  2. <a v-bind:href="url"></a>
    ) ]* ~" M5 J2 P
  3. <!-- 缩写 -->
    % [2 B% U  {$ Y- E
  4. <a :href="url"></a>
复制代码
v-on 缩写
  1. <!-- 完整语法 -->9 b' C2 }: r1 b: S
  2. <a v-on:click="doSomething"></a>
    6 u# g" e+ q; {5 a% y9 z; f
  3. <!-- 缩写 -->* \8 N3 e2 z9 W! B4 A
  4. <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
  1. new Vue({2 g5 J1 u8 O& d/ W
  2.   el: '#app',
      n! d/ P% ]' r7 t" m! @8 @8 |
  3.   data: {
    : ?! P' ]5 A/ G* a% h7 w& p) w4 o
  4.     url: 'http://www.runoob.com',/ }/ k  B* S7 k$ `$ h
  5.     target:'_blank', a: W  ~  W4 b0 L7 G! ]
  6.   }2 m) C. G/ A7 m$ H8 O
  7. })
复制代码
当我们给一个比如 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