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">
    % a) E, r0 D9 c: m# f7 ^
  2.   <p>{{ message }}</p>
    ) w* {+ p2 M* I8 Q3 z8 E2 ]
  3. </div>
复制代码
Html
使用 v-html 指令用于输出 html 代码:
  1. <div id="app">0 k2 S: v% y6 s4 z2 m
  2.     <div v-html="message"></div>3 E8 n& u( `2 r- c" ]% o  {: K: [
  3. </div>, c" y2 A0 m- D, a& _
  4.       o3 O1 [* ?& {9 g
  5. <script>7 K; k3 z5 N$ q) Y  R, h
  6. new Vue({8 L6 G9 S; _, Q- o! f
  7.   el: '#app',4 I  N4 g3 H! ?+ T
  8.   data: {
    ! P+ h9 z. L( @" e- B( R
  9.     message: '<h1>菜鸟教程</h1>'
      _8 u9 _3 M! q6 u! b9 }* D2 K5 S
  10.   }- d0 ^  e# _0 L
  11. })
    & [7 E; z% \, k/ s
  12. </script>
复制代码
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
  1. <div id="app">
    , L5 n5 S7 b4 |& o( I" o) K
  2.   <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
    3 w0 l* p( d" `2 Y" k% H
  3.   <br><br>
    1 f1 }" X# _% E; Y4 q" Q# U0 I
  4.   <div v-bind:class="{'class1': class1}">- f% j% H! S0 z: ?# {
  5.     directiva v-bind:class
    ( ?7 O! N) A& z# e0 a5 I; ~
  6.   </div>
    : r. [6 V6 r' f6 ]
  7. </div>
    8 G2 J2 [) L2 ?/ s& \8 Z/ s( y
  8.    
    ( A' E# `+ y2 S2 p- X
  9. <script>
    : z3 ?  g9 s. f
  10. new Vue({: [9 z9 \3 N0 f- `! M) q. N& D
  11.     el: '#app',
    ; L; y0 s4 u+ t) @) g2 Y) V# n0 b8 Z
  12.   data:{" t7 Y5 B% _; M
  13.       class1: false
    9 m& _- H4 l+ ^' |1 U5 w* r
  14.   }
    2 y. U# N9 ]9 R9 G
  15. });% i# Y% _9 v8 t! o/ @
  16. </script>
复制代码
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
  1. <div id="app">, c( [1 S3 N  o
  2.     {{5+5}}<br>
    7 ]5 Y. p) K7 S" z8 }6 w5 R
  3.     {{ ok ? 'YES' : 'NO' }}<br>
    / {; z; v  C5 g- @& N, U" K
  4.     {{ message.split('').reverse().join('') }}
    ! X  j/ v! H2 q5 f( i
  5.     <div v-bind:id="'list-' + id">菜鸟教程</div>
    , @! ?- ~9 b: ^# E/ i! q
  6. </div>* p4 a  c+ |( o, D
  7.    
    + I0 I2 }- `. Q8 v; O8 _. Z, X
  8. <script>
    6 ]  w# k9 c' O4 G
  9. new Vue({, X8 J; ?+ o1 D5 r2 f& c# Z: `
  10.   el: '#app',# O: X& q& m8 i4 P( C2 A4 R( k
  11.   data: {
      ~7 u- [* z9 u3 j( }9 L) S
  12.     ok: true,
    + ^* {4 V0 Y9 m6 t/ P- M* b& |1 P
  13.     message: 'RUNOOB',
    - r( k4 p$ b1 `( Q  W9 l" D
  14.     id : 1* T5 e! }7 R* g+ c8 {* q
  15.   }
    % O. E+ G! ]3 [
  16. })$ h+ S+ p2 |3 a* M5 v
  17. </script>
复制代码
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
  1. <div id="app">
    8 A- L. K1 T* X6 L* I' `) ?/ Q
  2.     <p v-if="seen">现在你看到我了</p>
    7 {/ V! s2 E- C
  3. </div>4 V7 I1 f0 i; x" r# }/ |
  4.    
    * s4 x7 Q; L( i$ B3 w' h3 x3 Z4 S
  5. <script>/ V9 l2 i  o# k% r: b" k2 v
  6. new Vue({8 [% E* }8 }, L# Z6 q. l, ?  ]
  7.   el: '#app',
    . C; m- I# g/ g2 f4 Z2 |
  8.   data: {  H- P/ r, L* B
  9.     seen: true
    9 s! u+ R. t) W, w! _# a
  10.   }
    . y$ d' n  I! ?' P( W5 x$ M
  11. })
    / X8 P7 ~. Y0 P) T8 I  g; @- s- H
  12. </script>
复制代码

( G) a5 `0 V; I1 ~, x0 j* k0 ~
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
  1. <div id="app">" P+ o7 y( l% @* I
  2.     <pre><a v-bind:href="url">菜鸟教程</a></pre>, J) X% U, e% ~$ R
  3. </div>/ h- h& u3 S# ^8 S) `7 x+ p/ a
  4.     0 Y+ `  x2 f6 f" L4 j+ y1 N3 H+ U
  5. <script>
      d% o4 c" S4 y6 J- U9 b; `
  6. new Vue({
    - W/ n3 H# K  \# h, u" z
  7.   el: '#app',
    : T9 J  s9 F/ Y: t& O
  8.   data: {( e5 A% I% p" E; t* M6 X2 q0 j
  9.     url: 'http://www.runoob.com'* R8 C! _# \. s$ u& g. Q3 |8 ]
  10.   }! A0 H: ?* T, D4 B9 q0 X
  11. })
    1 k; J  S% s/ @1 ?
  12. </script>
复制代码
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
  1. <a v-on:click="doSomething">
复制代码

  C" ~, K" y; x4 j# S# R* z
  1. <div id="app">0 Y' K+ n* y' @3 }. [, S: [
  2.     <pre><a v-bind:href="url">Vue参数</a></pre>  T- Z" P* C6 D/ z" W7 K

  3. " i! a% y3 r2 l
  4. </div>
    7 _# r. I. ]  `0 W

  5. 2 m2 P2 l" b9 y4 ?/ r9 M3 N
  6. <div id="app2">6 W6 V; J" N) F) Z) i$ u
  7.    <p v-for="val in arr">3 C0 T( g6 g' h' S6 l
  8.     {{val.a}}. K4 X; K6 j& ^1 A
  9.    </p>2 p; L9 ]' }4 P5 W
  10.    <a  v-on:click="tap">点我</a>- d% b* @2 G; Y/ q; V3 ~
  11. </div>* o0 h: g; E' G) f& B+ I  \0 @. e

  12. / }  }# r: Z$ a

  13. ; t% f+ K1 X4 v5 ~1 W- t6 k
  14. <script>
    : ?' S% ~! Z1 F% [$ K+ K7 N+ p' f
  15. new Vue({
    2 `8 W- L* N8 h4 I* P6 d
  16.   el: '#app',3 V5 a  x+ _) Y* c
  17.   data: {1 Y/ z( `7 n) a' ^' N0 E( g2 p
  18.     url: 'http://www.cncml.com'7 G; F9 a8 l; Z: _
  19.   }' B4 J( N2 v3 S/ Z
  20. }); R0 l* y1 g" G+ w
  21. new Vue({! I( S$ W; H# h3 y
  22.   el: '#app2',
    ! i3 j) P% ^, X6 Y8 _3 T
  23.   data: {
    " m. b4 f6 q+ b- o1 \: v" d
  24.     arr:[
    & L& [3 y# x" ~4 b# @' L5 w
  25.      {a:'bb'},2 o4 M; e4 j0 n% K5 M* [
  26.      {a:'cc'}
    & |2 T* p$ E+ Z$ x6 z5 M/ J/ K7 R
  27.     ]
    1 a6 D/ g6 R8 Y' b! _8 A
  28.   },
    # t/ a( b2 y2 B" R" O  u
  29.    methods:{& k2 Z5 t" d& U  j
  30.     tap : function(){
    ( t% C6 o% E# G; \1 N& Z
  31.      this.arr.unshift({a:'new'})
    2 r0 U/ `2 u  R$ k8 w
  32.     }
    4 ]0 i4 Y, q* K' e
  33.    }! n; f) \- T/ C; S- H
  34. })
      F- ^; G2 |- X4 Z$ E& Y. c
  35. </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():
  1. <form v-on:submit.prevent="onSubmit"></form>
复制代码

2 T1 \" J. G+ a/ F! ^* B2 f用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
  1. <div id="app">" |8 i9 l5 I9 R% B" Y; ]
  2.     <p>{{ message }}</p>! l6 s  i* r' ?' _" ~  d$ y7 @
  3.     <input v-model="message">
    ) G. n* F2 n, I
  4. </div>
    , [& e, a' s# ~& z
  5.     6 V# z$ l! l. n8 s
  6. <script>
    6 Z% x0 G& a6 I' N. e
  7. new Vue({
    ; d! E: j0 I+ b( J
  8.   el: '#app',% d+ I, h* v  ?' n; u8 U0 d* ?
  9.   data: {
    . G+ C) I- [. c" q3 n- f8 D
  10.     message: 'Runoob!'$ J( |0 A6 d! H
  11.   }
    # z- f0 R& x; J" P7 l
  12. })
    8 \+ \2 S- [0 I) ]5 O1 f
  13. </script>
复制代码
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
  1. <div id="app">
    ' W6 z/ ]. C7 n& _, Q* ^; X* \
  2.     <p>{{ message }}</p>
    , @' f% A) G9 P
  3.     <button v-on:click="reverseMessage">反转字符串</button>
    1 A! b7 }. k" M2 d
  4. </div>1 o: e' t9 w. F5 j0 n
  5.     ; k- T/ J- l4 D" p* L: x3 Y0 |
  6. <script>% i1 D3 b/ j/ @+ l4 w) \+ }
  7. new Vue({
    4 X" [. a. r6 |% Q  p  j$ y' e
  8.   el: '#app',7 t4 _" `0 \6 y1 G
  9.   data: {
    3 t3 G$ Y% x" F- O
  10.     message: 'Runoob!'; j9 v9 b8 \; ~. X3 y3 X
  11.   },! i5 ]! p  p, L2 D% D3 T- x
  12.   methods: {2 F4 N2 X$ e5 ~8 _) n6 x
  13.     reverseMessage: function () {5 `* h, [3 |; Q4 A
  14.       this.message = this.message.split('').reverse().join('')
    2 b8 o0 m8 V7 j
  15.     }7 Q. x6 Q, A" J. U
  16.   }( e+ @0 K6 o+ L! d  r
  17. })- p5 F: U0 B% [8 s  \+ R
  18. </script>
复制代码

8 E: A* _. g: c5 A过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:
  1. <!-- 在两个大括号中 -->
    0 j7 Y9 e( ]  y- I. A
  2. {{ message | capitalize }}
    9 G% d' w% U7 h

  3. ' ~: |: S' q/ j6 W
  4. <!-- 在 v-bind 指令中 -->; F4 N4 Y2 \$ c
  5. <div v-bind:id="rawId | formatId"></div>
复制代码
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母转为大写:
  1. <div id="app">
    9 ]+ f3 n; k& S  q' u4 p; X
  2.   {{ message | capitalize }}
    / P# l5 e* p( u2 }  F7 ?! W& G
  3. </div>
    ) l: I2 n" N) j( N: N1 n& q  ?
  4.     . D: l: C! |) R1 d- ~  a) N$ L5 \
  5. <script>/ P$ H& e* x. E7 B9 s" d
  6. new Vue({
    8 B# D& b. n9 Y6 G" N" |
  7.   el: '#app',
    & i& f9 e3 ^) J. P; C, \
  8.   data: {
    " w: F0 S* m( e
  9.     message: 'runoob'
    ; J) F, c% o9 ]) R; G7 K
  10.   },5 m% c. V& t4 B3 s: w
  11.   filters: {
    9 |# v* E+ e# T2 U, u# O# p
  12.     capitalize: function (value) {
    ) |( X4 z& }* q4 P
  13.       if (!value) return ''+ T% O8 z! a2 \7 g
  14.       value = value.toString()
    * _! D5 x' w4 [2 i* C/ J  A
  15.       return value.charAt(0).toUpperCase() + value.slice(1)
    4 f* B+ ~( [9 n8 ^1 I
  16.     }0 u+ k7 g/ o. b% |( n& y
  17.   }7 O* U; g& v; P1 v
  18. })
    % N# b: o* g1 T1 p; \! q
  19. </script>
复制代码
过滤器可以串联:
  1. {{ message | filterA | filterB }}
复制代码
过滤器是 JavaScript 函数,因此可以接受参数:
  1. {{ 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 为两个最为常用的指令提供了特别的缩写:
  1. <!-- 完整语法 -->
    ; M4 e$ c$ u2 F$ y$ O8 R! v) q! w
  2. <a v-bind:href="url"></a>
    3 {6 O( |: r, g/ U& f  e
  3. <!-- 缩写 -->" g) k% _, |. \! S9 r7 u4 M& p/ R# y
  4. <a :href="url"></a>
复制代码
v-on 缩写
  1. <!-- 完整语法 -->
    . p. L0 f& y# X9 v1 n" c7 K/ t4 A
  2. <a v-on:click="doSomething"></a>
    8 H' k+ H  U4 j
  3. <!-- 缩写 -->
    4 _% K8 l) Y6 }7 {( a
  4. <a @click="doSomething"></a>
复制代码
笔记
0 }! |! J" k0 r1 x1 W; q& M给元素绑定href时可以也绑一个target,新窗口打开页面。3 N8 p* S8 i5 Y8 f* u+ s
  1. new Vue({/ w: [* T$ a  U4 L. P
  2.   el: '#app',8 J9 S% Y6 {9 i) ?
  3.   data: {
    : ]% H6 P8 v) }  S2 g1 ^7 J
  4.     url: 'http://www.runoob.com',. @1 O$ P0 z* E* H
  5.     target:'_blank'9 _. n4 ]1 |! B" D: J
  6.   }6 B" q! k+ F. w* _6 p
  7. })
复制代码
当我们给一个比如 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