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">
    9 a  m% o4 C7 Q. N
  2.   <p>{{ message }}</p># F2 m" E' k' |
  3. </div>
复制代码
Html
使用 v-html 指令用于输出 html 代码:
  1. <div id="app">
    3 W& c$ _7 ?! f; U& [  H1 I
  2.     <div v-html="message"></div>& _/ n" I, q" }0 A- n
  3. </div>: T" a% @* f/ r3 {+ t) A
  4.     6 t7 f4 ?* y% A
  5. <script>
    ( ?- T+ Y2 E* R" W& ~6 C9 L
  6. new Vue({
    ( R; X& L) w( N3 b" m
  7.   el: '#app',
    6 c1 `- Y* {/ W. j3 M
  8.   data: {6 Z9 T! W' ^* w, m5 Y
  9.     message: '<h1>菜鸟教程</h1>') f) X/ H0 F  D( Y% |) H: X
  10.   }  E1 L; ^0 C. L& c; }) n' _6 }
  11. })
    + n& |5 e# P) `1 V' t9 w* |
  12. </script>
复制代码
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
  1. <div id="app">: ~; O- ]# ?" j0 P6 z
  2.   <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
    6 n# U: B! d& O6 F
  3.   <br><br>7 k( M; m4 p6 ^6 ^) U- K, ~
  4.   <div v-bind:class="{'class1': class1}">
    1 {/ Y  y6 a" u7 |' U
  5.     directiva v-bind:class7 {2 x/ H5 y( S1 t, f* F* X/ C
  6.   </div>
    , V. l8 l  Z3 W7 F. Q% p$ J2 F, W' [
  7. </div>7 l' Y" ]0 n  _8 i+ w
  8.     - p( x# w9 b( C  G& [0 ~) Z
  9. <script>
    6 j! e+ k5 n" q' S7 O  M
  10. new Vue({5 V3 r; \8 @2 A% u
  11.     el: '#app',
    8 I) c% \9 |6 x) N. U& E$ M. Z
  12.   data:{
    % E2 w. V5 a* K& x4 @
  13.       class1: false
    ) f7 S) }3 `6 Q4 B3 Q- B$ P1 Z) K
  14.   }
    : D- T% X7 {. p  l+ Q
  15. });1 c4 d, F9 v8 U
  16. </script>
复制代码
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
  1. <div id="app">9 N, V; h; c1 \6 f8 [+ I. n% z  y
  2.     {{5+5}}<br>4 v# o6 x1 Q/ W7 v
  3.     {{ ok ? 'YES' : 'NO' }}<br>
    - ^. S3 d; p, w3 L- L( L
  4.     {{ message.split('').reverse().join('') }}. }; \/ U9 w' k9 i
  5.     <div v-bind:id="'list-' + id">菜鸟教程</div>
    ; @# o1 o0 ?1 C9 Q# m/ ]
  6. </div>4 q* x" J/ E! K: p& `
  7.     2 B# k3 Y6 p9 {9 a* B) [" y+ G- F
  8. <script>9 `( z  v: S+ w/ k7 g; Q% V. G  Q
  9. new Vue({) `1 r+ J! N  J
  10.   el: '#app'," P0 [; K. M4 _% b- V
  11.   data: {
    & ]& l/ W/ S" g  o7 U9 X- F* N
  12.     ok: true,9 [# d( n* w7 W. ], Y& R% \
  13.     message: 'RUNOOB',
    1 ]: e  Q& ~2 \) f
  14.     id : 19 Z$ o6 j; Z8 u# N) e
  15.   }! N9 _) Y6 [6 `4 m  j3 N. b  F/ H2 i- x
  16. })
    - O" `4 T, ^& Y5 |) W. l  R
  17. </script>
复制代码
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
  1. <div id="app">
    8 Q3 P% a; v+ }
  2.     <p v-if="seen">现在你看到我了</p>
    ) Z6 d& U& _' \1 m, g
  3. </div>
    ( ]' H! Q. h( `6 [; G% i
  4.    
    & }  Z& A7 ~  o, e$ U
  5. <script>
    " ?1 l6 X1 X0 Q% i
  6. new Vue({
    $ }. w% G/ G' x
  7.   el: '#app',
    1 @  H7 F- X9 b9 I% _8 M
  8.   data: {- V9 j$ O% [5 e6 `: p; g
  9.     seen: true
    4 T: t, e% O2 \% H: S
  10.   }
    / f- \( |5 O% h
  11. })7 Q1 i( R+ k: J. T
  12. </script>
复制代码
$ {6 m5 s% J0 t8 {! `
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
  1. <div id="app">
    1 [6 H7 x# P: w' L& x
  2.     <pre><a v-bind:href="url">菜鸟教程</a></pre>! c: C, B) w6 n% b& t
  3. </div>
    2 ]2 X4 H# C* f# q% X
  4.    
    ( }& m2 x4 |, U( b3 ~
  5. <script>2 h, b- Q8 M4 D1 P0 N  j
  6. new Vue({
    1 _9 ~; u3 \2 P9 J5 P3 C
  7.   el: '#app',
    9 Q$ z5 n  i5 Y- v
  8.   data: {
    ' h, g4 q" F$ o6 a- w; m0 `
  9.     url: 'http://www.runoob.com'! Z$ m3 T7 V; y- y: y4 r
  10.   }
    9 w: u7 p. U! \9 U! _
  11. }), a  k7 x, |4 I  S1 }1 V
  12. </script>
复制代码
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
  1. <a v-on:click="doSomething">
复制代码
7 Q* F0 V4 W. |+ K1 `
  1. <div id="app">1 I. z+ Q0 ?9 ]3 V. W7 A/ X
  2.     <pre><a v-bind:href="url">Vue参数</a></pre>5 E' z* ]' c1 S* k: e

  3. 9 `9 G# s. H  P, C) ~" u
  4. </div># t8 Z8 J& k" ~& A" G: n' R% ?

  5. ; y- \* B( c3 T" |, a9 j# U
  6. <div id="app2">
    3 |. |0 I4 N7 z& H4 ]3 \) _
  7.    <p v-for="val in arr">( _  ]) [+ p( |  S. C( e6 J) r+ h
  8.     {{val.a}}' ?. H0 X, Z2 L' @/ C7 U
  9.    </p>3 _% e; @; P  g' D
  10.    <a  v-on:click="tap">点我</a>
    6 l9 O% L3 e9 G0 U4 _9 G
  11. </div>6 {/ \1 n. K" Z: A

  12. ! d9 e7 |% `1 q# X, Y
  13. 4 g& F9 \2 }  C) m
  14. <script>
    ( E9 I7 r1 W; Z+ A1 m$ X6 ]
  15. new Vue({
    + B1 b( ~6 u0 h6 J: V% n4 o" }
  16.   el: '#app',$ K/ z# l2 i' {
  17.   data: {
    , h$ Z/ u, g1 a
  18.     url: 'http://www.cncml.com'
    ( @4 T6 O! ~  [* t5 o5 _
  19.   }( X; A8 I' r8 h+ I" d4 Q
  20. })" m) Z) d; k( C; i6 I; U' n
  21. new Vue({
    0 s- E& O' c8 A' S5 C& G, f
  22.   el: '#app2',
    ( x) ]0 c. \" S! n
  23.   data: {
    7 _9 `3 N+ {: A$ k8 V0 ], ]( {
  24.     arr:[
    $ W6 e. K. J( H$ E
  25.      {a:'bb'},9 w, Q2 y5 ^( h! |5 J
  26.      {a:'cc'}. r* G2 I! ^' E& p8 E
  27.     ]- ]9 ]0 H+ H6 a; F4 t  \6 ~7 C
  28.   },( d6 Q9 ?) k/ w
  29.    methods:{
    1 i* A* X: `) ?% V' w
  30.     tap : function(){
    / ?- w# m/ g# O+ m6 p
  31.      this.arr.unshift({a:'new'})! C, ?8 P' z8 u
  32.     }
    ( i' X6 R4 m+ F
  33.    }
    5 n6 i: b6 H4 y9 \1 e7 ^
  34. })
    . T  v# X& o6 W
  35. </script>
复制代码

; w% B8 `3 z5 |3 I/ a% q; C
% f% G. ~( o: A9 I) d) |- S
在这里参数是监听的事件名。
* F+ {# n; x: B
修饰符
修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
  1. <form v-on:submit.prevent="onSubmit"></form>
复制代码
' I7 V& }$ f7 a
用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
  1. <div id="app">
    8 z9 S3 H* B. J& |
  2.     <p>{{ message }}</p>% K/ P# J# V) V; a) g
  3.     <input v-model="message">
    ) J9 A9 J$ `( A" K+ L/ p* n
  4. </div>
    6 I. q! f) D1 R/ T' j7 E) N
  5.    
    ; U" p6 T2 f. \
  6. <script>
    ( @- F  W; f. Q! t' q
  7. new Vue({
    % H6 e' n/ C* Q( A, p
  8.   el: '#app',5 g8 Q) u4 N6 T7 J
  9.   data: {1 ~4 P) E$ b2 C1 S2 e: C
  10.     message: 'Runoob!'& }1 Z) w  l( I$ |! o9 P$ o
  11.   }7 J0 B8 g6 {2 Z9 z% Y% {! d9 c1 q
  12. })6 ~3 e+ o& _. O6 N% L
  13. </script>
复制代码
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
  1. <div id="app">- B/ W/ w0 D& W; ~( B/ [* N6 E
  2.     <p>{{ message }}</p>- O# n) b" E% _
  3.     <button v-on:click="reverseMessage">反转字符串</button>
    ' O1 t* }# k& U) S* K6 e) n
  4. </div>
    7 x1 ^0 l- q( R. q( [! }$ f
  5.     3 V0 x( h4 `+ Z  X
  6. <script>/ R( Z* A& f8 M% H" Z
  7. new Vue({9 [$ v9 n! z' E' I7 ?" {
  8.   el: '#app',+ c. ^8 r6 ^* |
  9.   data: {9 H- \# e. Y: F2 k2 s, S# e, |+ x1 V
  10.     message: 'Runoob!'
    # \2 m8 }0 B: L- z2 u
  11.   },
    . u: |3 `5 L- K
  12.   methods: {6 \% M1 B; e0 r7 K  B4 y8 n
  13.     reverseMessage: function () {
    : D% E# L' A% c# k" M7 |/ g
  14.       this.message = this.message.split('').reverse().join('')% A* i1 k9 ^, g2 r9 X
  15.     }
    ; S3 N) \+ }- u" i" `. v; ?2 h/ X
  16.   }, ?% i1 P/ S; n- l  a
  17. })# T% C0 o* h( }5 G) G1 C
  18. </script>
复制代码
1 Y  `2 F0 B( T& z% e5 Z
过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
  1. <!-- 在两个大括号中 -->& W* i' X" q# s4 C* x6 W
  2. {{ message | capitalize }}
    % B0 T% \( }( j+ I6 R7 L( l

  3. 0 f9 N" |! U6 m0 l% t
  4. <!-- 在 v-bind 指令中 -->
    3 T3 L, }+ `, c, X3 `. a* u$ y/ i7 d
  5. <div v-bind:id="rawId | formatId"></div>
复制代码
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
  1. <div id="app">) i2 v2 `4 \9 W" b
  2.   {{ message | capitalize }}
    ' g6 V5 w5 y/ u% V  A
  3. </div>
    8 d& I1 Q( ?$ S) |% x' t) ^3 s1 y
  4.    
    5 R+ R; G6 [+ c8 M9 c+ l) {
  5. <script>: \) y+ z4 i$ ]5 h& d5 q( M0 z
  6. new Vue({
    2 T" K- Q7 p( k; n( J1 V
  7.   el: '#app',- J; _: q1 N; m" i$ k$ ]
  8.   data: {
    ; v- e9 x) V: t) e% _$ y
  9.     message: 'runoob'- u2 v! X/ c5 |1 [) U
  10.   },
    . X" C+ W5 z! j
  11.   filters: {
    5 B4 w7 T  ~8 _# V9 k+ ^) q1 e
  12.     capitalize: function (value) {7 v7 q0 W5 o1 v5 I# Y4 ^9 l
  13.       if (!value) return ''
    0 t4 v* f' ~# P, k4 |/ r" \% H, L9 L
  14.       value = value.toString()
    7 E8 s3 S% d( W- F* \3 E- W
  15.       return value.charAt(0).toUpperCase() + value.slice(1)
    $ a" g8 K6 a  G3 ]: q( G. g
  16.     }
    " V  G3 ^$ ], N* X# O
  17.   }
    , c) u0 U! @% u( D1 W9 R
  18. })) `# P9 q( j$ X! V5 ^
  19. </script>
复制代码
过滤器可以串联:
  1. {{ message | filterA | filterB }}
复制代码
过滤器是 JavaScript 函数,因此可以接受参数:
  1. {{ message | filterA('arg1', arg2) }}
复制代码
这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

6 x" n+ R; H2 y& I3 ?8 P5 c. M) _8 o' E+ h
缩写v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:
  1. <!-- 完整语法 -->
    0 c+ E/ S* ?/ y( E: F0 M2 c
  2. <a v-bind:href="url"></a>
    2 V6 q9 b  k1 r3 `* X, R3 R  H$ _
  3. <!-- 缩写 -->
    ) o1 h: I0 D" N+ ~0 W7 t; e
  4. <a :href="url"></a>
复制代码
v-on 缩写
  1. <!-- 完整语法 -->
    9 c8 ?, K/ Q# e& l
  2. <a v-on:click="doSomething"></a>
    # u. T: {- @" M8 I6 i  k
  3. <!-- 缩写 -->
    % R* h, K+ }4 s& ^; ?/ u- n" ~+ A
  4. <a @click="doSomething"></a>
复制代码
笔记
8 @# ?7 [+ s  j给元素绑定href时可以也绑一个target,新窗口打开页面。( Y7 i  M9 P, @. B. B4 l) n
  1. new Vue({0 ?6 S) o4 z1 f+ k) ~. }! z" c
  2.   el: '#app',( Q: j" A2 x# x6 V6 P& ~
  3.   data: {9 b2 X  ~1 J( E1 a* |2 s0 T( s* x  ?
  4.     url: 'http://www.runoob.com',
    ( h/ E9 _1 N7 I: j4 q4 O6 B
  5.     target:'_blank'+ j$ f/ M& M) U7 y- z2 a& m
  6.   }( s; T0 B9 j; W5 h+ `2 K
  7. })
复制代码
当我们给一个比如 props 中,或者 data 中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用 Vue.set 方法。
Vue.set 方法用来新增对象的属性。如果要增加属性的对象是响应式的,那该方法可以确保属性被创建后也是响应式的,同时触发视图更新

3 c3 f6 h- L: p5 F  |! u7 h! z3 `
这里本来 food 对象是没有 count 属性的,我们要给其添加 count 属性就必须使用 Vue.set 方法,而不能写成 this.food.count = 1
. Y/ W; k. b6 n/ G9 o+ K
6 }) Q- k* f7 }4 q! T3 o1 C( L

0 \/ w7 {- J7 Q+ a# h  d! N" m
! W2 X8 C8 _+ r' [
# p- v5 q5 [+ E/ h3 R3 H9 a4 {" X9 H4 Q3 c# w9 m& X" \
; K9 I) b1 z8 {5 f) X) |$ B
8 J& c. z5 I8 b+ h# T& T

! A3 P" y( K9 c3 s/ a5 P




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