+ `* _' @0 b' V, f2 S; e , M; h, r0 }. T8 \例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。* Y, m# r7 Z2 J3 u
8 G9 g, C6 M5 R; {- N T# \4 \! u
9 q9 m/ Z# d* M
(1)第一个Vue组件2 B ^2 h8 k S K% \! B3 A; R
注意:在实际开发中,我们并不会用以下方式开发组件,而是采用vue-cli创建,vue模板文件的方式开发,以下方法只是为了让大家理解什么是组件。; ]# M X- r7 `6 l' i9 k$ l: W
使用Vue.component()方法注册组件,格式如下:! `! p; V& [ G' f
% `. M4 F& f: ?, H& v
3 v& w! i; p- G6 h% B<div id="app"> 1 k+ T0 H6 G T% c H8 _) F <pan></pan> - X3 g4 u# U0 I- \6 o+ H, }1 C</div>, n q) m0 B& r8 @$ X8 s& r
. `! i3 v0 m: e- `8 i
" [: V( \0 ~% e: h, M5 Y1 ~5 m% D
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> 9 z; ^9 c" L+ V+ J, H/ x" I7 g& d<script type="text/javascript"> - G+ s' r) o. s( t( \ //先注册组件/ E5 \* x3 b8 z! g, J: D6 I0 T
Vue.component("pan",{$ |3 A" Z" k3 j! i
3 }$ s2 Q1 S; c% Y0 \! N
template:'<li>Hello</li>' 7 n8 ]% ?# A6 ], k J: H; P" X7 y& ^( a$ n6 \& R4 o
N7 o- d! w, G9 e
});$ q! \2 o$ X! W" E
//再实例化Vue8 Q; E% o* g6 J& H3 l! K5 r
var vm = new Vue({ $ T# e, q# K$ j0 i/ n el:"#app", & y1 M- E- ^! U! | });, I* ]' s' t( e
</script> ! k' w7 K+ t+ Y5 S8 g" {; f1 & x# H3 _: @) |: z" s) |/ h2 % k. ^, g! t) Z1 ?5 O% g/ H* j3% k; a3 S+ d' F& w% R, z
42 ]9 U3 v. l" h% ?5 e; k! Y
55 ?# T( c2 z* |
6) k% p& T+ A" S4 n: ?( d& _. w
76 I" i" P1 [' m6 H# w
80 @7 ]$ }* r6 t" f
9: Z5 \. k+ t9 C5 m2 d5 Z' @! t
10% c0 m4 s, n4 r v' n# ^% ?
11' [. v" O9 k; D
12 l3 G( \' _; s3 _) \( P/ I
13! a; O$ ~. A" w2 |- f C+ m/ l
14 9 v& I6 [" B1 U, z% y15! ^1 i: E4 M, k1 t' V" P
163 N0 i) q+ u- E: q# K3 D- ~" e
17 ; w2 K" U: j- ~3 W说明: + ]9 n J) k5 E7 t2 g' {" y" |- A. Y/ C& E9 ^. B* Z& B; j1 e# o1 U
5 {7 ]( E$ a. f+ z
Vue.component():注册组件 $ ?/ M4 q/ \) H! hpan:自定义组件的名字 & N6 y7 b' o9 C" S$ t$ G O. {+ etemplate:组件的模板8 p* b; ~& J* p- k" x
(2)使用props属性传递参数 ! r8 o+ {$ @( t像上面那样用组件没有任何意义,所以我们是需要传递参数到组件的,此时就需要使用props属性了! 7 Q7 Z# j+ I" w" a# m4 }* U1 ] 注意:默认规则下props属性里的值不能为大写; z# g8 ^8 X/ ? " `* @7 l4 ^9 C. `/ {/ f1 G) z" X* r# a q4 ~0 U
<!DOCTYPE html>! O$ f& Q1 ~* ~0 v
<html lang="en">, w1 J5 R( k/ o l4 Z
<head> $ w6 Q3 l5 c" h' \$ o <meta charset="UTF-8"> " m4 i: _# y+ e. q; ~7 ]! x" K <title>Title</title> 7 k4 E8 e& b! ]- B" H5 L</head>4 q! h" L! m; k: l& A, d. ~" k
<body>4 \/ H! x* }( \5 B
0 @) Q5 y. r: O: y' E- M8 @# T' ]4 X 7 V( |* e0 P" F<div id="app">5 o& r! c# q" ~. C# E
<!--组件:传递给组件中的值:props-->, S' }7 E3 g* D$ ?8 a; x
<pan v-for="item in items" v-bind:panh="item"></pan>: ]9 {. r) \% {
</div>; Y- O1 u' l, ?" ~
* ]! p. X! q F; ] }& r" B2 r7 c* f; J6 q2 a
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> 9 @+ g# G8 [( k5 k# N! m: D5 F<script type="text/javascript"> 2 U0 V3 S9 G3 R/ K, n //定义组件8 i2 q. O. f9 X. _ ?1 I; H# B2 y
Vue.component("pan",{. @; u5 L( x( ?5 S4 ?& n' t
props:['panh'], ( X/ L3 y% |9 r3 D) F template:'<li>{{panh}}</li>' / o# o' k7 k! A- Q" [) c 7 j% o& q& ~! J7 W# }: x; n. g; c7 b4 F7 [% g
}); 2 s+ Y+ ^. r: V0 f# d8 L2 Q% d var vm = new Vue({( S$ g& q, ~, ~: w2 v% q
el:"#app", ( F- P- v- d; K8 z data:{ 5 ^. ]4 T: h) O! u7 `$ D! Z; r3 U items:["java","Linux","前端"] ( E+ _9 E: S' D6 q% H% e }8 h2 c% k \& f# e+ v: I! l
}); 1 W' a( T7 ^5 ]( Z</script>, Y$ j& P4 {$ j' o! n S
</body>9 E! j5 C/ t% J4 p
</html> 4 Q, P" D1 U. N# x' R8 z1 ) @9 J, Y" T; [2) q7 f8 ]& V7 I. p- c
37 L+ N' e2 h' ]1 {! c
4 0 B' S s* x6 ?! P* V: `56 w) F- l1 U" v' Z0 x2 k ` |4 X( @
6 1 x) L( t! O4 b0 L9 W) c6 C7 % ^2 Q1 n* ~4 G+ _8 U8 + R$ v# U9 y8 x3 H, H4 ?9% Y! z% [6 ?# p1 {* {: u/ P; w9 q: C& d
10 0 ~! c: d8 V9 P7 G114 h5 @* D3 A* @- V% l
12 $ C6 k" u; o% b$ C m13 & ~' S+ i1 J; t* W0 D0 G, Z140 h. i \+ U. y" S
15" ]0 h; U1 P7 F( h& y8 ]
16) B3 `' m* {! ]! x" s+ P
17 - a6 z |& c$ R9 N' H8 W3 d0 }: S18 6 |' m- A2 p" {; r& g/ W198 H% O# O# t- a$ q
20* z) j3 z1 s) h/ w# [& s( l4 ^
21% q: @+ m4 I- E$ x9 s
22 ( X; N: V% d7 Z. _23% j$ S$ V7 Q+ S0 b
24 . \% r8 h6 A! U25 8 x2 F( s( x$ {( s26: f# q6 M _2 ]* Q' b' z$ N: S: I1 E
27 2 x% }9 ?; \- f6 n28 " J$ ~! J6 k7 a# k) Q29( r. k9 I. ]/ J+ l
30 2 B1 R: P7 B0 O说明:) M( u) W# x0 I8 u
+ V# r, m( B+ |1 v0 D8 P- Z/ S
5 s7 c6 J& U" u$ nv-for="item in items":遍历Vue实例中定义的名为items的数组,并创建同等数量的组件% Y; L: n: o, v$ d0 f$ O
v-bind:panh="item":将遍历的item项绑定到组件中props定义名为item属性上;= 号左边的panh为props定义的属性名,右边的为item in items 中遍历的item项的值 - Q4 I( G; m, G1 h! b2 j* K七、Axios异步通信- }- ?* l3 C7 X; N1 t6 r' P
7.1、什么是Axios 4 E" B" L6 X0 v' T! QAxios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下: 0 t1 v8 Z4 e |1 o 0 {1 P2 G7 C1 Q, s J4 C% l4 q: c, k从浏览器中创建XMLHttpRequests ) Q' I- C+ W% U, F从node.js创建http请求# ]% u3 |, C9 N& Y
支持Promise API[JS中链式编程] - n' f1 q0 W+ T, f拦截请求和响应 , r3 _* Q1 Y* |+ ]. o2 p转换请求数据和响应数据! G, |2 K1 s9 t
取消请求9 y/ M, ^# t1 ]6 U! S* e
自动转换JSON数据0 H; c+ U& b. u- ^/ D7 d& U6 `
客户端支持防御XSRF(跨站请求伪造). B4 v5 `" v) \
GitHub:https://github.com/axios/axios/ v: ?+ y- U5 L6 u
中文文档:http://www.axios-js.com/ 5 }- m, `1 f! m { . h+ `. X4 S( x% y0 z/ h 2 G& o1 u) Z+ R/ {# [+ c6 s7.2、为什么要使用Axios" i2 S7 r! v' n1 M3 Q# c$ t5 B
由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架。少用jQuery, 因为它操作Dom太频繁! # L/ f) {4 H0 J3 J1 ~: n$ G $ Y! }: ~% E6 y$ m' p# y0 X4 K. W4 H7 @0 d" P) X$ o2 }1 y
7.3、第一个Axios应用程序 1 L' H: }3 ~8 W1 L, N# ]咱们开发的接口大部分都是采用JSON格式, 可以先在项目里模拟一段JSON数据, 数据内容如下:创建一个名为data.json的文件并填入上面的内容, 放在项目的根目录下5 y0 e3 x! h( W( ^" ~
5 c7 F1 I. f5 a# q9 F, f $ K! B+ j3 m! b; C# O{3 R# t' _; S+ {# V
"name": "狂神说Java", " j* u( T+ V. M6 i3 M4 } "url": "https://blog.kuangstudy.com",) q3 s. Y/ `$ e. E
"page": 1, * V/ @- l$ h8 D/ ?: ^; c2 l3 U "isNonProfit": true, ! A: o, w+ X, `$ ]/ u' d# G "address": {* Z. L) O, R: ^* m1 i' J
"street": "含光门", # M1 c+ k1 J+ U" B/ b "city": "陕西西安", B. ]2 A5 E; _1 i3 \: g/ F. r "country": "中国" * U! H, \( _% ]0 R5 l4 h; ~ }, ( _( T8 K. U- U7 q1 Q7 J "links": [ 6 Y" g* X3 p9 b q {. s9 x& \/ Q8 ^- Z _
"name": "bilibili", 2 L2 Q& _% t) s8 c Y/ m/ p+ f "url": "https://space.bilibili.com/95256449"+ ]2 ?# P2 d J; P
}, : m; B0 F- V4 b6 B* T3 n* Z$ | {' {6 L; S3 i7 @4 y" x; Q
"name": "狂神说Java", 7 L% j8 w/ |/ _3 s$ f "url": "https://blog.kuangstudy.com"; O" X+ k3 F. t. U) h# ~( y+ \
},# i7 u( c1 C8 x
{ $ c- I9 J3 S% b3 e# L' c: Y5 J "name": "百度", 8 u+ f9 W: Q* T+ w0 t6 \3 { "url": "https://www.baidu.com/"5 G% Q+ m3 E0 U' }& M
}6 X, Q0 G7 ?2 S/ ]: i' O6 g$ Y
] 4 T6 _0 n1 `, I}! u( E& y! G. W0 r
1. C9 f' L I# v1 G# z' v$ U
2; G% h9 n$ p6 z* e) m
3, x9 |% A$ g1 {
4 0 ^0 u3 Z% i! \) J9 n, b5 , l& M( K' x$ S1 J, D+ y0 C U63 y* w3 z4 i7 D( ?- p2 F6 U d& X
7. {" p( l" I9 s8 y
8 8 M4 H5 L8 P" p( X9: {" K" |$ X( h; F
104 o k" b8 ~ w* |
11 8 f, i( O" h9 X0 E( \12* n! m' l! Y, m" z: A% h t
13 5 K7 O2 `7 O8 _. p144 ^- a( |0 e1 V5 R
15- d: R1 f' p# ~5 G
16+ B1 G+ { }# V$ O/ v9 W8 u
17) l' V# C# E% S- c
18 , Q- V2 Q0 E, @0 C% {0 L198 {* C- o6 S+ m M5 F- [' L
20- L9 k& i/ e. k+ J
21 5 f$ ]. m/ E' U, H$ ^. ]/ l22 7 `7 w8 y- C) u" W M+ Y; q0 w23: d7 [: \" ^. G% f4 m( _9 e* K
24' ^' Y# Q, u; S, h! I( o4 J6 ]
25! W# g- L1 }$ ^! \, S5 d
测试代码' x0 X6 K" @7 \8 |9 Y* b- W, k5 x; {
& G, Y: G9 A# z3 O, n4 H- y6 _
* M+ r1 B- a, {8 i% J* C
<!DOCTYPE html>. E. H. D( d0 N/ E
<html lang="en" xmlns:v-binf="http://www.w3.org/1999/xhtml"> ( m% }+ K& i$ [! o! }5 j3 z4 e& T0 ?<head> x& e F! c: e- t7 C
<meta charset="UTF-8">2 G( v7 S; @* j$ g0 I; w
<title>Title</title> , K0 ~- [8 k4 B$ g5 D/ s" R) ` <!--v-cloak 解决闪烁问题--> % j0 A/ |% x" G6 t9 \ <style>) T% T) `* k7 Q$ F( Y
[v-cloak]{) v/ l* b L' q" O1 u8 T- l
display: none; / p. J- g7 v: @- p7 L- | }# ?9 ~' J) |9 |, j ?
</style> ' O- C/ q! B' y6 }8 J</head> ; ]3 I% f9 G8 k+ J" |& ?; m9 x) g<body>2 g, E9 b% o) s( ?; B0 u4 ?
<div id="vue">8 M( h" E& G: N9 o' _8 k
<div>地名:{{info.name}}</div> 9 R, t7 V$ x+ c! n, ?# X <div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div> ' t% n2 g3 i) G! G/ C+ W <div>链接:<a v-binf:href="info.url" target="_blank">{{info.url}}</a> </div>* \ V. Z, K, s7 ~9 j9 L
</div>. k: s. _* V( v6 ?
* M3 e5 \4 n# f1 Q+ k/ Z8 j $ w" h* M9 I# \% {! V b<!--引入js文件--> : S- i7 t" k9 I5 i, P$ f& Q<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>2 s; U; i9 j/ o* P. ?5 s# H
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> & V' [) x6 M2 R$ D( r* |, p# w<script type="text/javascript"> % t+ s: W. l* j* S; Q6 J var vm = new Vue({ " K% z! }; [, d3 v" S( b el:"#vue",0 J- G/ J j i. b
//data:属性:vm8 j% C* ~- a; k. r/ L4 k0 L
data(){ $ n% X$ y4 M3 H1 K7 Q return{ # g9 }3 G. Q& h: v' K2 p) f( G4 z info:{! Y5 M% K: T# M
name:null, \. ^& ]3 [& n
address:{5 ]" _% m+ \/ x* D
country:null,; C8 k; ^9 _+ y9 k4 }- o+ k
city:null, 6 P& V. I1 ]0 Y* } street:null0 Y' I( p5 Y2 g: Q0 X0 ^
},- G$ K9 T6 ]- j' f0 ^( y+ |
url:null 1 Z! t6 n Z: E4 ?$ c7 R; [8 X }1 c3 }8 T8 E( D. e/ U
}+ S- e9 `0 @) P r$ r
}, / ^# b9 R F) G9 u( ~* a mounted(){//钩子函数 ' m0 u9 v6 k7 c, x" V axios; u8 I6 P8 @7 s, {
.get('data.json') 9 _3 @3 ?( _* D7 _6 ~ .then(response=>(this.info=response.data)); & A+ Z! B" h4 i9 R) I } b# \, N7 N9 ^7 R: R7 L1 R; y' @ }); + p# c% R" f/ b</script> % b- e1 l2 B5 O+ [</body> , y2 W" U/ g- |* t5 H! ? P</html> ! [: r) l' R- c0 {' W1% H$ M; V5 L' V" [
21 W& v5 [& I7 J4 v9 A
3 % Z+ Q5 y: q" h i5 @9 f# l( T4 w8 }4 9 K/ H( x4 [2 z w8 o5 }6 G% o3 l9 O& ~6% b f, X: ?4 V9 r2 b ?5 q
7 8 N; N0 q- |1 p: X' V8 " H' j8 m: d) x9! O1 A5 B; \" f7 {9 f
104 L8 r! O; H& i* C4 S
11 4 D% n) o* B# m6 g: l12/ n& d6 H8 K F% [' x
13 % w$ R- l9 s% A4 e: [$ R14 0 n. y" S( }. k( k154 N; D- t' G. k/ B9 o- Y) v8 k
16 ^3 y- M3 p" p1 W17 3 o6 i; u( B" ]) \/ i+ Q18 ' x# v+ h4 q U, E' q% E19! w {% B1 M& T) R# B. ?
20 0 z5 ]% \" a% g) A7 d T$ y211 Q2 i Y7 X8 L8 Q2 j
229 v& [1 j/ W3 s$ w! ^+ L5 ~
234 m$ h% A0 ^: m7 u6 m
24 8 e/ e0 v1 q2 K$ k% M8 i+ L25% \9 |+ N2 @5 X" X( o$ c
26 0 ^; g7 G% e1 s4 ^. U27$ N. o! y0 w4 X3 |# n1 n" H( X
28* o' S; z' d! Y9 r
29$ B. ]2 P- t7 Z3 m* ~- \ Z
30 + t- ^6 k! k2 `& y" w- y( B6 x31( E- h' f- d0 W, ^# S9 ~: ?" ^
326 [" F( e( H! V, J0 W. F
33" E; f7 v v. t$ E4 B
342 Z0 \: m- a8 \ ^/ J8 C% p
35 9 d( f; c+ ~+ \2 k: S% c366 P* g% q2 j. m& h
37 6 T8 ?$ p R, j) x, h38 4 f; n0 y y1 {7 @& f: h39) ?7 o0 ]' i% H
40 ( ~7 i( K! U3 c410 T, Q2 B* T7 J l6 _
42 ; g$ E9 v; ?1 C. B! f% X43 9 U+ _% n/ G+ I( Q# y! N44* |1 `. G4 N2 J: k0 Y1 a
458 E0 T2 e* |& B. _0 E
46 3 L9 }" g% y! A& N0 B% u47) r7 [4 @9 s. b. M! R
48 * l; j, D; l0 p( s8 @7 X9 `说明: 4 m* @* \2 K5 v% X& e3 A( ~0 @2 ~& a. m
- q8 E: z- j" v3 x: H5 E
在这里使用了v-bind将a:href的属性值与Vue实例中的数据进行绑定$ C' p" I+ l1 f- x p+ Q
使用axios框架的get方法请求AJAX并自动将数据封装进了Vue实例的数据对象中 ; O% ]7 Z4 L b( G我们在data中的数据结构必须和Ajax响应回来的数据格式匹配!1 X1 s J, C- F$ b u
7.4、Vue的生命周期 ' Y7 ]9 m/ y9 D# C官方文档:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示 ) z9 k* F+ X6 K _7 o/ }! ] Z Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。5 m: s+ s; G+ k& v7 P
在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。0 l4 K2 [" |6 @: |
+ P3 D+ C* B" v) m) G
0 p1 \1 e1 c, o2 x% G- p' a+ J, T9 [, V4 Y0 I2 ?- z6 m: O
! j/ Q* W8 i% x" Z) h八、计算属性、内容分发、自定义事件 s! C, s0 u! V* ^$ L; a- a7 ?
1、什么是计算属性 : I$ x# n# z2 E( [- g* V4 R计算属性的重点突出在属性两个字上(属性是名词),首先它是个属性其次这个属性有计算的能力(计算是动词),这里的计算就是个函数:简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为缓存!# @+ b' F5 L4 E! ^; l4 A. w
上代码- N: I ?) r% f9 C/ f2 ^8 l
: k m( s2 @ O, O5 O
% B4 c, j) Y% v0 i8 P& i4 A
<!DOCTYPE html>$ u6 \5 K9 L9 a2 C' ^
<html lang="en"> 7 t. d0 C% T8 z" W/ |. s, M<head>. j6 [% f; E. C9 I0 N
<meta charset="UTF-8">8 Z) ]3 r+ {; ]( m2 m# F3 w$ i
<title>Title</title>$ Y- v" N8 D, s+ J2 z, z+ O! t
</head> ( V$ j& z0 {# K* D+ S2 I<body> i% q4 y7 u5 S/ X1 {) d k) w. x& v
<!--view层,模板-->. I) r. |+ Z6 \; ?9 R5 i% Q
<div id="app">3 X$ l) E* |: t2 F
<p>currentTime1:{{currentTime1()}}</p> 3 v7 L# P. F4 N' p3 M) T <p>currentTime2:{{currentTime2}}</p> . c8 j( ~9 O! U$ l2 E g</div> ( c1 W5 B% D" H9 o# }# T% Y8 Z+ p 5 L, ^/ I: S$ \/ l$ @- E- E) z 8 m( G. ]& j$ `1 h<!--1.导入Vue.js--> a$ ~. |* R9 J) ] H<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> 5 [4 Q. i( S; M3 t* G<script type="text/javascript"> * D/ F' p( l- d% o1 O var vm = new Vue({. t- a% ]* R) Q" X/ ?6 r' h
el:"#app", 2 C' o* u( u; ?( f/ w data:{ - `- K" ]/ U# f1 ~ message:"pan") [' `% ]: k- i; O" m
},* t: t( B& t$ b; q7 Z. e* W
methods:{ 4 N" a! `& C% ?- P currentTime1:function(){ ! c" O+ d* u9 a. h+ @. ` return Date.now();//返回一个时间戳 7 z3 ~4 ^9 u! i3 Y } 2 J6 Q3 l2 o% }4 Q }, 2 `, P6 v! W x9 S, a( _ computed:{ & v: q- L$ i2 \6 h6 w: d/ w. l# Z3 p currentTime2:function(){//计算属性:methods,computed方法名不能重名,重名之后,只会调用methods的方法 4 z0 i. S; E, { this.message;: t; k5 S! u3 \
return Date.now();//返回一个时间戳 k) d9 e. V% @5 Z" ?1 F& U' Z8 |5 F7 b
}! K( {3 e! Q6 d( F4 A
} - d$ j& _1 a7 l/ m1 m8 [8 } });; r+ O I# k# ^5 c9 ]9 w. S, L) w5 M
</script>% _' ]: |1 N6 |4 R5 b
</body>- ?2 i5 k% q6 S! Z; Q# K
</html> ) }% t1 x" |. ?( R1 ! K, z3 \, G# k) L0 m25 R3 s/ C% S$ L
3 . w6 L. ] z" |4 , ?. i2 J2 u) f8 S% J& D c5! _- L) c' x* x H6 a$ ^ _5 g
6 8 z- K/ }! G/ l7 0 G: {: f9 U1 w( @' a8 9 S. p1 }8 f8 p; Z9 # T- C4 b+ h5 O5 x10+ D( p7 {9 J" F, l3 P
11/ r; K4 F2 f) x! o: O- }
12 1 a+ b- o& o; |13- L5 R, n) s6 A
14$ N* V& l4 {2 g( |# y
15+ R! [- P4 B% h8 x0 O! b9 a
16) I0 Z" M+ V" @2 N7 F
17 % Y; E$ |& L0 }9 t0 L3 Q2 P1 _18; k) M8 t( U W; d# L
19 l* `( m+ Q" {20 D' H4 G; A) Y4 d+ B; a) U9 X1 j21 # u/ ]; O, ], s* `- u" q22 1 Z# S6 g- w; Y3 a) L23 9 M9 M6 D( |& O8 t2 v( h" `8 y24- \6 t' S) ~' P
25, B) U, w7 d0 e' Y& j* O
26 # C; A5 O( O3 _* ~ {27 7 ^/ Y5 f @5 @4 _ M/ C281 G, M C1 w+ I/ M
29! w. ]& p) H( O9 N, b0 A
30. @" ^" ~! r$ U1 M7 `# C
31 6 H% W4 J/ J7 \32 + |/ @9 ?! c- f' i+ A1 T6 P' C337 C4 ]3 z4 c& P4 o& z
34 5 v' A/ x$ Y* j# m% p35. n; }; x2 n% j- R
36 ! E9 B7 d# y; A/ K. L% i3 k* V! \注意:methods和computed里的东西不能重名5 U8 }" u0 h/ c
说明:- J6 f$ H6 r, R+ N0 N" r6 H& c6 a ^
3 p+ R5 L6 F2 k ^% D# y! J9 A% D6 V! Q3 P) u
methods:定义方法, 调用方法使用currentTime1(), 需要带括号- H7 i9 I: {( d' f% m) X: E
: M( L& J! K. h. M" a2 E9 l5 ?7 s7 U& a% P9 g
computed:定义计算属性, 调用属性使用currentTime2, 不需要带括号:this.message是为了能够让currentTime2观察到数据变化而变化 3 V7 \4 }9 `9 P: @ , ]5 F! R/ G% [% F( [& ^8 j/ h* |+ k8 d2 {% q" A, r
如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.message=”q in jiang", 改变下数据的值,再次测试观察效果!% b8 R1 t; f6 w2 U; ?
8 Z# I/ }, C r' w3 b. B8 x J1 k5 V/ ]8 `' R9 F0 e结论:, z( I* m) \: |
调用方法时,每次都需要讲行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销; : G; h" P$ j, C" { Z7 m4 b+ J3 b6 K 2 s) k) G2 G* i) C" B4 R * E' O% ^! i0 B1 k8.2、内容分发) F, ]# ~- s, r% Z2 O' ~! x8 I
在Vue.js中我们使用<slot>元素作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中; + p. \$ E9 x- O' ~0 V9 U/ D2 S- s: Z4 |7 Y$ u
! ]" E0 i. J8 e- i) N5 Y) y
测试 t$ ]9 T! t b比如准备制作一个待办事项组件(todo) , 该组件由待办标题(todo-title) 和待办内容(todo-items)组成,但这三个组件又是相互独立的,该如何操作呢? . D# m. n7 E( F- k Q# G2 | 第一步定义一个待办事项的组件* @6 u2 h& H) O; B( r
! Y1 g9 ~0 G" @; p8 i0 ?. b/ [; R) f
<div id="app">* Q1 J) v$ ^; I4 |8 a
<todo></todo>1 b' \: c4 G0 P/ w" z
</div>: \4 l, \/ f# B' V7 b
<!--1.导入Vue.js--> + v4 w0 f) G/ l0 [$ t0 R& S5 M<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>1 I' V0 _% [9 P8 `/ s3 B7 L9 J9 P
<script type="text/javascript"> 1 R ^% w# h& c( ~% k) j' l% P Vue.component('todo',{ 3 @( @; ^" o" k% B! R template:'<div>\ / U% Q5 A/ e8 J: M |0 s <div>代办事项</div>\ 7 h* @* s8 V, Z& }1 ^ <ul>\* R4 t1 A# [6 j3 j' _& q: {
<li>学习狂神说Java</li>\ ) J4 @6 ?* f) T' I </ul>\ 6 q. a) M2 F e+ F* i" A! I1 b, D </div>' 5 _' t: U2 b) M& M! R8 u( X }) 9 z& Q$ X4 a# Z4 s# w</script>9 D) p8 k: N, x6 N1 j
13 r, A+ a2 `6 W0 T
2 , R) R: p; q8 d& b9 J; c34 o6 S0 J* J/ |* F& c
4 1 H% o& Q- \/ D! n% w5 6 c3 U7 D7 {; C4 e* N7 x6 + F- ], ^; G4 i* w! }) R9 Y2 m7; Z) `' u7 `) Z' [+ u
87 D/ N" o# V; r9 S( N" x A
9 , e/ ]0 ^% `5 F9 i& ^% U9 S" b8 \, I106 w+ _; V$ M$ x) A2 p% v
11 3 `0 m" y; b7 B6 a4 ^# D129 r- I/ V3 ]% N5 |' \3 a3 M; U# e
13& A# b! j5 |6 ~; f3 T
14 % i5 S0 F5 n5 d& P0 ~" z15 " P! ^) }' _. h第二步 我们需要让,代办事项的标题和值实现动态绑定,怎么做呢?我们可以留一个插槽!0 u+ w: r4 i$ s5 [! |$ E
1-将上面的代码留出一个插槽,即slot 7 R5 I' M9 L& l' \2 E) u2 l$ `( [0 {- y* K( _3 s& [ w' z5 _- o. M
2 t B- K7 Z9 A7 n
Vue.component('todo',{' e! s3 }$ T- ~) E l% A' q
template:'<div>\9 E( V5 _& K) F% d h8 U( T
<slot name="todo-title"></slot>\, }4 e- R4 G9 m
<ul>\ . T' e* i# d# }9 N6 H' C <slot name="todo-items"></slot>\' E1 V, I# y2 f% {
</ul>\3 u7 E4 P- i& p
</div>' ( w5 j& o& o0 ]2 a }); 1 I# p: g# n! b/ _; x18 ]+ I& S9 Z# D6 e
24 H/ V. t& z. c3 ?! @5 g: i
3 " S1 Q$ O' d+ o/ p4 * O& c* A, N: J# C ]5# `! Y+ Z! |5 ^* R0 K t1 F: y0 `9 H
69 B n7 v3 d* Q9 l! Z( S" ?
7 2 k% {, s# D y" {+ p8 0 U8 j+ ]- k. a+ h# t! B- F2-定义一个名为todo-title的待办标题组件 和 todo-items的待办内容组件 # {# @5 V0 P: P( `% r. n9 M6 C8 a) r: D, o( L* s; A7 u# ~
a8 d0 N# A: q {4 {: x
Vue.component('todo-title',{ 4 h5 N$ _! |. G, D0 ?# X: E props:['title'], " M. M5 Y& _9 r4 v/ Q template:'<div>{{title}}</div>' ; e2 W$ }" {& U9 ` });) m$ L4 W! i' `. q/ n9 J
# `2 L5 S. t2 c! |12345" h* L+ a! q) K4 \
//这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来! 3 Y4 g3 T4 X8 t% B# } Vue.component("todo-items",{% b1 J5 V( D$ [: j
props:["item","index"], 9 o% k0 ^$ }- N3 K6 \ template:"<li>{{index+1}},{{item}}</li>" ; }2 l" e4 Y4 ]9 @3 b' G }); ( E& x: V' V, M4 C! ~1) z4 G1 O, I. s% e
2 , T- j3 ?# Z% L& I7 C3: G0 m2 ~9 ]) X4 m$ m9 X
4 - L9 q2 ]1 t* r$ R# y, e5 $ J; S: Z4 H% o" c6! p' @0 p0 H+ b W* T7 R! G6 t& A
7- K# a; a% y6 i' Q
8( q( q& ]& k7 N+ a& [3 a
9 + f9 v" I1 @9 \10 . P/ N9 |& p6 O9 q11; g. m) S" [# K% Z. I4 \
3-实例化Vue并初始化数据 / a& o. ~1 W$ ^7 O ! R; ~+ Z! i9 E- R9 H. ` - Q$ r3 k# o% |; l' \1 y var vm = new Vue({ - n$ F0 t2 Q# @8 U* a+ t$ F el:"#vue", 3 j1 `* U7 t3 h( v data:{, L- J* m7 X+ J
todoItems:['test1','test2','test3']( X' |1 b2 `# U1 p. Q8 F
} ! F7 {3 a7 R/ [ X3 K6 v+ ^: P });* ^1 z* K$ t [6 {) ]& {/ c
1% A( m! Z9 ^5 d; a' Y8 W/ |" R8 `
2& U, w0 V) R$ A9 L& X- z& o
3 & A; v: p, _7 S& Q3 ~4# _+ r6 w( z: o l+ X& _
52 w9 Q" j& ~; b/ e! Y* u$ `+ M; \
6 * }- K9 \0 |" q, z9 O4 p, R4-将这些值,通过插槽插入1 U- K6 }7 _! q! U
! T$ v9 S3 r2 Z) w; h' l5 l" H
# r4 ~5 ?( W5 ^/ a! }8 u
<div id="vue">+ o$ w$ ]* N7 i
<todo> . G0 X; }- X/ {) U2 Z <todo-title slot="todo-title" title="秦老师系列课程"></todo-title>& ^# v6 z2 J/ j: ~6 K
<!--<todo-items slot="todo-items" v-for="{item,index} in todoItems" v-bind:item="item"></todo-items>-->( }8 E c0 {( |! V0 q
<!--如下为简写-->" A5 y r2 |) C, O7 ~3 c% E
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items " u) l6 ^" ^8 P5 S) R+ V+ r </todo> 8 Y# G$ f! ]) J( _; ^</div>+ `$ v; q& M, [. }3 L0 i
1& {: N7 ]. P( T: d
2' {7 t+ V; `3 B) E
3% t' |* b; e& I$ i
4 " q* q6 W& g! O8 N% V T, W5 2 Y. E& x+ [# A* t4 ^6 0 Z, W( B# q* Q8 }: q6 S3 \; m7* u, M# l: ~$ `0 J9 l g2 s/ n
8" I3 ?+ H, s( k( ]
说明:我们的todo-title和todo-items组件分别被分发到了todo组件的todo-title和todo-items插槽中; G2 H; A. g9 q) s8 d1 Z' Y$ B4 r
完整代码如下: , I) t. [+ g5 \ m: S" E# i6 ~1 F7 Y, m
2 Y A' V" \: {5 D5 Y+ l' o4 @
<!DOCTYPE html> * \0 T/ Q1 j# A5 ]9 o' a<html lang="en"> 4 ^ q6 N9 k" W. r8 h" W8 p<head> " r. Q4 \1 d/ i4 X# I! {1 p2 q <meta charset="UTF-8"> . Y4 C4 R0 q# @- B, i8 ?$ ~ <title>Title</title> 6 [ u- K/ m7 {& N7 G7 C1 }</head> 4 N- T; Y; M4 ?<body> r- L3 F! ?- [! [# j
<!--view层,模板--> , ~3 g# O6 R1 o Z! m) M3 I<div id="vue">( X8 c/ T, C0 F) P
<todo>5 u( B2 p( r/ O3 ] T8 u
<todo-title slot="todo-title" title="title"></todo-title>/ L6 d+ p+ b5 \; x4 {1 T1 X
<!--<todo-items slot="todo-items" v-for="{item,index} in todoItems" v-bind:item="item"></todo-items>-->+ x U3 k& D, h [0 d; g
<!--如下为简写-->; y3 a' H: \1 \% S3 n
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items& _$ u# P) m+ l
</todo>% f6 T4 z! X0 R9 _0 V; \5 H
</div>6 r+ C7 ^" G# Q# g# n1 a
<!--1.导入Vue.js-->1 ~3 z- _ W4 _& v' s$ H( x6 Z, V
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>. Q& j4 Z! ]" U p
<script type="text/javascript"> 6 J( |$ b; r% u6 ^; a9 ~4 V2 z' g Vue.component('todo',{3 ^, Z j, c$ t/ [+ o
template:'<div>\ + N, g" l6 m5 R2 c {6 n. \ <slot name="todo-title"></slot>\+ S% M$ M, ^, d
<ul>\- {6 s z0 \/ C2 F7 c# t
<slot name="todo-items"></slot>\ / q$ l) x$ }2 K) q1 q, J$ M: J </ul>\ y5 f" t0 w; z </div>'- c; E* }! S8 c6 g" L
}); / ]3 h+ {, T; n9 M; d Vue.component('todo-title',{4 W7 c$ n9 J; S6 k' |. d+ v+ @
props:['title'], 9 T8 g( A9 P( H7 {7 C template:'<div>{{title}}</div>': m) ^8 Z* e9 @1 J9 x
});3 K" w+ V/ Q1 f, [" w
//这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来!. \- l$ |0 |& k1 _2 P- l( o
Vue.component("todo-items",{ - ~% d" J9 W% w/ s5 S0 Z9 ~ k props:["item","index"], 9 T6 `9 Y, A( T6 W( z* ? template:"<li>{{index+1}},{{item}}</li>", S! u* \3 m" t0 P; h' ?+ r( h
});, ^: K3 J. K. m4 x* P- l
$ f9 Q) o- E# h" I X6 A3 m; Q3 b9 p( L' r
var vm = new Vue({2 J8 t1 {2 W7 i4 R' `% W7 [
el:"#vue", ; c- n3 b1 x$ k( G) X data:{ 9 m0 ]# M; @4 j title:"秦老师系列课程", ! V: N; l* j3 X4 w" Q" s4 d9 s* m% G todoItems:['test1','test2','test3']5 J$ h7 o. k1 y% F' G
} * p. M2 S) V7 y! e5 c; i });2 {# i% a7 c# Z! f' A
</script>& c1 A- f. X6 A8 B$ Z3 J A5 s
</body> . Q9 y4 u# K/ [</html>6 z/ e) n* s+ z* d) f4 v
1 * B0 U2 d) S6 C, c' S5 Z5 K2 $ l3 p Q% o# _, Z3; c* m8 }& c* @, d
4 ) n6 P |" ^6 j5 1 P$ P+ {$ o v$ }& v6 ! s$ f3 F7 }2 A) P7 : b* I4 f. h. O9 F1 Q1 O5 h; V8' }8 l0 m2 `$ M' C3 V! V
9 4 S3 `2 j& g' V6 O2 }10. E% x; u& R4 B' I5 `
11 9 F- W0 i; l8 X12 & t/ F/ z/ _7 _. [2 G138 n {, b0 m/ T& q* y2 c2 N
14 ' w0 t9 b% d! V8 i: p15. Q3 d4 R0 D# Q% E: S5 \, `$ Y
16 : ~" J4 @: A8 W( _8 {. S) h17# Q% N9 R5 | f; Y: f, _
18 / A# `% ? M% e! | q5 w4 W" t19% b& L4 v+ ^7 I M# u+ @+ j. h
201 |; n$ f( b* I, A
21) e. k( g) P- F. o% W: }
22 ; Z; N" }# Q: { N23 3 z: e" ~" c' \ L4 |# Q$ ]# p24& L5 V- I, T. y' g0 b
25, b* w, A- a7 `& f4 p6 f2 A
262 G8 S q" X$ i# Y8 u/ ?
27/ g! R4 w" p# [9 C; _
285 A) _; ]: @: Z/ W" V3 M' o
29 m; M0 W; y8 k ?; @' R1 G
30 ; c- C, e" F9 h8 ?6 `# D `2 V31 1 @5 v# j( T/ w32 5 ~, M- q! o G7 h33 9 C: d, b. k$ V8 p( V* B$ \34 * q& b7 |; {5 ^. ~7 d& t" ?353 ^) P7 P0 J. T
36: V6 Y2 u8 _! W7 e- c/ o1 W8 n) L
37 # n/ T9 D/ w# |" [7 v2 ?# w38: G: b5 A+ }* D" x) u0 s; Q7 R
39 & k2 K M- a V# H2 p8 U7 @& _40 6 [$ I) B% \ S# y9 i ~8 w, w! z414 W# R. E$ k$ d% d- o% C: `
42% d$ A, K6 \' ?, H8 B$ z
43, [, Y1 F5 z8 {# R0 `0 t
44& R0 O9 [8 ~6 }" T4 S
458 A# E/ \+ b7 W- d
46: ^3 Y% n3 u' N( m/ W+ D. A0 N
47+ U7 D- I" m: m ^
8.3、自定义事件5 d4 h% q Q8 y, _) \
通以上代码不难发现,数据项在Vue的实例中, 但删除操作要在组件中完成, 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 使用this.$emit(‘自定义事件名’, 参数) , 操作过程如下:7 V$ D. S8 H4 K# _- W
1-在vue的实例中增加了methods对象并定义了一个名为removeTodoltems的方法' _/ }( Q {7 T7 |
( P! c8 W8 N r; _7 _# E . t; x/ r1 d9 c$ h% {9 `* R# c( Wvar vm = new Vue({" }+ u: u1 l$ }
el:"#vue",, |& B) L; v7 ]; r
data:{ 9 q- D: w& S9 Y% u title_text:"秦老师系列课程", ) n" Q$ W1 v. l& }4 B todoItems:['test1','test2','test3']; S! G, I2 ]1 ]2 K8 r W4 r
}, 7 B5 i% e! a/ l2 R methods:{- |$ p6 q0 }0 d3 k3 H
removeItems:function(index){) I" B) h5 \! Q9 o
console.log("删除了"+this.todoItems[index]+"OK");9 }) V0 ~/ {; m
//splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目,其中index , C7 f4 [9 @% F) @" \ this.todoItems.splice(index,1);% p2 O2 t1 y! S' B9 @0 m u
} + k% p+ {5 @5 n. P: E4 ^% \ e } $ c; ~+ ]* |0 v5 f8 O f }); % L' S% F; \2 K6 L \) G* T1* J3 @' ?. }8 a8 E$ v1 w
2! R# `2 o4 m5 N5 `% O- F/ r
3 + x* Q8 a3 p' T& T% v5 C4; p* @9 ?9 ~4 ^3 Q9 W
5& ^( X+ A3 m! n2 z) f- C3 o
6 : ~, H& l+ j' a: X9 _8 b7/ n) L) n5 Y. P0 a
8 * x+ n! z& i$ h8 Z; }9- J" W: ^0 ]! k, T `( d' Y1 Y
10 6 N# t7 J1 K' u11 - K9 ~8 e/ q6 d) a% S12# t* k, M( G3 A$ ^ V
13 % [, T9 u, v; @# n# {6 ]14 3 H. j$ B% ]) a/ g$ I* Q. ^2-修改todo-items待办内容组件的代码,增加一个删除按钮,并且绑定事件!$ i# ?/ [( H! A1 g" A/ C
3 c8 M3 w0 S+ P% p4 W7 n0 v: j+ ~; n
Vue.component("todo-items",{1 o; m- k6 R; Y+ Q
props:["item_p","index_p"],4 m* `- s3 U9 B1 N: Q3 p4 i
template:"<li>{{index_p+1}},{{item_p}} <button @click='remove'>删除</button></li>", ' L* ~3 n' ]) D$ J, [% j methods:{: r8 y$ E; G J4 m: R/ K. C
remove:function (index) {5 h* Q* M# v/ `; ]- O! e
//这里的remove是自定义事件名称,需要在HTML中使用v-on:remove的方式 % `# y' n1 }, j- o: I( _" X$ Y //this.$emit 自定义事件分发7 Y; ~1 K/ R. ?0 O2 E
this.$emit('remove',index);: F8 v: ~ p! h1 }' T0 g0 `
}3 e# |' y* a. w* w3 R" V
}% \) @% |# A6 ^# Y9 i
}); / s `3 z7 E' f9 l% ?% k' \7 e15 b% c3 Z3 ?9 C; Z _
2% z0 }2 t; f; U+ R9 n# C: {
3 8 X0 x. C- T4 ]/ }, u- Q4 ( M! I3 { L; E3 m+ \9 P8 ^+ \5 * Z- G. W. a1 S; z; K8 N& O/ K$ c4 r6' V& q. \% T4 i; \: e3 E
7 / O0 L1 Y1 I- v2 K) Z8 ! {! D L9 `! S9" l; ]9 K+ I4 N2 }
108 @) J e. q( A0 v) @) m7 r
11 , i) `& _# G0 J* K0 J3-修改todo-items待办内容组件的HTML代码,增加一个自定义事件,比如叫remove,可以和组件的方法绑定,然后绑定到vue的方法! v/ a2 C. e0 L2 d
2 L# d" N3 r+ k
, o: @( E0 H( I( }- `2 y# F* `
<!--增加了v-on:remove="removeTodoItems(index)"自定义事件,该组件会调用Vue实例中定义的--> ' e& P" K* N1 y; D# H! O4 _<todo-items slot="todo-items" v-for="(item,index) in todoItems" # g/ L6 \1 N4 k, n7 L :item_p="item" :index_p="index" v-on:remove="removeItems(index)" :key="index"></todo-items> % W9 E7 V A8 I/ Q& z1* J; M6 n6 W8 {5 z2 K, _) k- X
2 O. v6 I2 y) L- l9 X; P* j4 Z/ }3/ T3 \8 a& n/ X" u
对上一个代码进行修改,实现删除功能) i; ^& v1 y" J9 m/ Q
& ]# Y3 n9 I4 T. c/ y- I7 s# L, Q: m5 T) X5 @7 ~' Q
<!DOCTYPE html>0 k. \( F1 ?2 Y6 W
<html lang="en"> $ u- }6 I5 p8 x<head>: \' n9 g: @& u& z- X5 K
<meta charset="UTF-8"> ; I6 C9 `. e# J5 C0 M6 q) K <title>Title</title> - e2 y" h1 Z% N& {</head> ' o+ Z- ]. t" Y4 v<body> 0 t6 M% I; J2 H& H<!--view层,模板--> ) a& p; X; Z* }7 q) ?- @4 S8 X<div id="vue"> 7 Y( \" A: h( Y4 J <todo> & p1 q( i Z; x8 g j <todo-title slot="todo-title" :title="title_text"></todo-title>. [* p8 f# K2 K+ n$ N% ]2 K
<!--<todo-items slot="todo-items" v-for="(item,index) in todoItems" v-bind:item="item"></todo-items>--> # d; ^' X. B( ~% q- Q- h <!--如下为简写-->/ s0 n4 {8 q5 j8 s: ?. I# r# q" O
<todo-items slot="todo-items" v-for="(item,index) in todoItems" ) k) Z' ^& Y9 j0 ] :item_p="item" :index_p="index" v-on:remove="removeItems(index)" :key="index"></todo-items>! a" G' K1 ]1 m2 t6 u% ]
</todo> / G3 h; q( U) C1 x2 w( j, r</div>5 G( U( g M- h+ y# l! g& ]
<!--1.导入Vue.js--> 7 [& n+ |: f* v" ]: q/ d<script src="../js/vue.js"></script>; f5 j* z# r2 o% W e D
<script type="text/javascript">- F; T# M8 ^ D- c
Vue.component('todo',{ 7 ?( [4 E4 _1 V* Q' L' Q template:'<div>\( J7 O. |8 o' T! q
<slot name="todo-title"></slot>\+ Q9 _8 q, x, R+ v* m
<ul>\ & P! @& V( x$ _ <slot name="todo-items"></slot>\ . k& _% ~/ T1 U- m" c- e </ul>\! n) `2 V( M& h- T
</div>' , D1 S" u/ ~" I5 N });% o/ m9 j$ {6 C8 n; V, ~1 z
Vue.component('todo-title',{ . B4 l( z0 F4 {9 K* l+ I/ F8 y props:['title'], D6 [$ ?8 b. o4 o# A template:'<div>{{title}}</div>' * V0 e9 Y( a7 o8 ?: Y! C }); 3 o7 j) G4 ^, N5 l/ \7 o/ L) F //这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来! ; |. `/ E" j3 Y5 U; e% H' Y! Z+ s Vue.component("todo-items",{ 5 C5 h: ?* {( h$ {) N/ o9 P8 X props:["item_p","index_p"], . K- b% r H" ]5 s; b2 h template:"<li>{{index_p+1}},{{item_p}} <button @click='remove_methods'>删除</button></li>", ; f5 c6 j* C9 @7 W. O z methods:{8 F/ k. l$ N2 T, D3 G% u# v
remove_methods:function (index) { 9 \+ w% {8 Y4 j3 w; W6 e& n( y- M2 k5 b //this.$emit 自定义事件分发 - s1 Q* O: |$ K1 F# V# Q$ Z this.$emit('remove',index);, l$ u3 c% n+ a
} 5 R8 h1 H9 G* n } 3 \: _% r( Z6 A- W. h+ S });, s4 W5 i$ |: d0 c7 k
- `5 p) Z' i, i. p" D9 f1 T. J) Y( y( h
var vm = new Vue({ / c! ]( z1 Y n9 M8 Z+ Q/ S: S el:"#vue", 0 H+ W( W$ ^: I8 W; J/ _. y data:{7 |! e$ H8 h. D4 F
title_text:"秦老师系列课程", : z" v& l( r/ a% R7 x: f todoItems:['test1','test2','test3'] " q v3 M; ?0 G) t }, ' ~7 [! v' B7 k8 \. s, U methods:{ 2 c; y9 O! v1 L4 ]- b removeItems:function(index){ * z- {" p2 U. |+ j) F# N console.log("删除了"+this.todoItems[index]+"OK"); " l' D% E9 g, ^9 ]3 | ?2 t- i3 f- \ this.todoItems.splice(index,1);4 X1 g4 R n2 T4 R
} . B- H- ?/ _( B5 U: R# I }6 n+ ?3 p4 k; t' y
});! G4 j9 q3 t" Z" m5 ?3 I( S% X: j
</script> , {3 z) W- v8 h; ]9 y4 b: K7 |</body>: b6 d% i/ O% a4 X/ j6 d8 @7 g
</html>$ `8 f9 U8 N4 H0 b
1 % L* c; Z. x: ?. U2; B+ t& {8 x* e# c2 \+ x) I7 p4 F
3 : K9 f3 X6 d% }' Q: M" u41 |9 r6 z: ^3 f0 n, ^( w
5 8 P3 v" J8 N$ ]8 W& ~. Y& S! u6 " O" H8 |/ D" K# Y0 A7( t/ x- u! e! I$ J6 P
8' a: i" T8 D8 W: y
9 - N: p, P. J% U7 S/ M. R1 w/ O10 ( ^' c& O" l2 Y, k) E2 }' ]/ h( I11 ! [; Q8 b/ F' i: J$ C0 O6 G12 h, S, t+ Q/ @. p: P4 w% p4 x/ @
13 ) }+ _& J) r9 J S5 E14' _5 [ f# f- D C( s
15 , ?- u& m4 {/ w2 y5 ]2 r9 F3 x! T+ M- w16 : [: y f; ?2 n ^- ]$ t" Y9 r17 / L, I- ~' v+ A! v) Q18 9 u1 M% x! v/ K190 n& B" |$ M( s
20 ' C: B3 ?1 |+ m$ a# o( H3 @21 j6 Y- }" h! c22; ~& C0 y; q6 t; ~/ _ o
233 t( ?( c% ?/ }* l, I5 m1 H
24 3 Y- Y( n1 p- \5 [' i% Q9 t! ?25$ H- B. e1 W' f' m% g$ q6 {: J
26 7 e1 Y5 x/ r6 V$ _1 Y# o+ R7 c273 C4 y. M0 E' y* H2 w3 F7 w
28 0 H8 i( u: ` H7 g29) X; |1 g( n. G+ T" z2 L2 M
30 5 h$ p. v# A+ l; W9 H31- F* n+ @/ g; Y$ x3 H; T. R5 n$ n
32 # Q8 p a5 g% G1 M( a33) K$ k) n0 e2 |( @ u
344 r5 x5 B# K- F, p7 C/ p2 q
35 2 I! `9 I- N |2 W3 O+ j36( g0 B* `/ W6 R# w
37 9 ?: z K; R; ^$ p9 _7 z38- h# E |4 a2 p4 r
39 4 _% [) k |8 g; B9 d, e! m: k40) B5 v/ D, H1 ~# w. O
417 }2 a( ?6 c1 E$ q
42 8 F# z r& i! J' {, J436 c3 g$ p* X) i- X* ]
44 , `4 ?" i1 X/ J3 ?" D45 5 ]2 j; z0 Q3 i' p1 P) H46 0 U! L' G8 q( V6 I47$ ]/ W8 x0 x3 A# C
48$ ?. e2 F# l" e2 O* W" W: _
49' }0 s" U' S6 U9 o4 ~
50 : R, g9 d1 \. b1 ~5 r/ S51# Y2 p v: M" d4 ^' n+ `( C
52: t0 E, Y/ [8 S
53, w4 c( ~3 Q" z9 [' A
54* {* [; M& e9 }5 Y+ v. I
559 q" r1 b# u, V5 ~
56$ [& E3 l- K- H' d) f
574 q" @( o5 A& ]' v; @! l1 p
582 Y. ~ K6 F% w: t' G7 A
59 4 R$ T. I, w$ ~60 , A& @5 Q. ~. v6 l* m逻辑理解; U. w" X( Z& Y9 s8 Q6 N2 W
5 l1 y+ v# u4 m$ g9 i! P7 x
+ @) m, K" P: _6 t& U0 g5 G8 I0 o# }& o' ?( v: i
! A& \8 i3 G. P& f8.4、Vue入门小结 # \% P+ E0 g3 b+ g) s: g: {核心:数据驱动,组件化 6 B! l2 V, V9 r9 O' w% K X 1 d. n- r0 B, h2 K$ |8 w$ I: s c. P' b, J& s) I% U
优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;( M9 A* N% o# S1 h; Y: e7 h* u
# K. U0 b% O+ _: D5 p. E+ M
3 X/ R& e" r3 q常用的属性: / K* C3 ?) [3 j: B% O " U! K* w5 K0 n/ X( R5 m + w2 H0 u5 s A" V; j7 Gv-if # R# f `9 A1 s g @: [; fv-else-if 4 d* X6 c% E+ }& av-else+ q% }+ J, U& W4 @% g- O8 O2 D
v-for ( n" P: ~$ @5 c ^+ l- u O( p+ qv-on绑定事件,简写@ 4 M. p: K' q# X k3 {: Qv-model数据双向绑定( T2 W0 M$ [. n
v-bind给组件绑定参数,简写:. }9 `& a5 ?6 S9 j2 e1 o2 O
组件化:7 `. ?% f9 A* [. w
% j+ ]3 K1 |+ o. A6 h1 b6 h# L; D* N
组合组件slot插槽0 R1 W+ k- m$ K5 K8 ]/ S: Y/ i) K
组件内部绑定事件需要使用到this.$emit("事件名",参数); N4 a- G# ]1 E2 j, {' y
计算属性的特色,缓存计算数据3 {3 s2 X: E$ i
遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含,比如Ajax之类的通信功能,为了解决通信问题,我们需要使用Axios框架做异步通信; $ o4 { b0 L+ F) A! u 5 F0 p& F# }4 a3 C; v+ }' e) B. J' g6 q) J. J. I
说明$ @7 w* p2 e7 _4 e7 P5 |8 }0 ~/ \
Vue的开发都是要基于NodeJS,实际开发采用Vue-cli脚手架开发,vue-router路由,vuex做状态管理;Vue UI,界面我们一般使用ElementUI(饿了么出品),或者ICE(阿里巴巴出品)来快速搭建前端项目~~ a! g3 C/ G1 H& I8 s3 ^. Y7 c& W ! y' N( b" V' j' s+ u* |( P 7 M, ]& \# q; W: |4 Z9 Y3 w. `& ]官网: ( q1 @7 M: Y7 {$ O) f( _) [, g ( a) q* `! v0 X* I8 ]; \# [+ r9 U8 r- @4 s* f* D5 a
https://element.eleme.cn/#/zh-CN0 M! ]# A" h6 m! ~3 t) a7 J% N
https://ice.work/ % T6 t! e, W1 A7 a( p九、第一个vue-cli项目 ! Z. ~ f1 z* E+ p3 y4 W9.1、什么是vue-cli' j! o, f1 K( J* H
vue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板;* S! ^( F# [/ P2 a7 ?
预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个估计项目就是脚手架,我们的开发更加的快速;2 ]6 e6 \% s0 Q( K3 c/ Y2 b
项目的功能 . `5 U# k- N* T( p+ c2 W J 2 @9 ~( g+ y- U$ y$ V) ?( g5 q - ?; e0 p+ T# `9 X统一的目录结构 ( ~4 A; X4 {5 @! O本地调试 * f5 o1 ^" X' Q L; N热部署6 ^( T0 _: V( M3 U, K3 H
单元测试 : o& j1 }% |$ J集成打包上线% m* o% `; Q, u U$ k2 g) M8 S
9.2、需要的环境 - ~% Z0 {# W" L0 s7 Q6 e: O- g9 O6 YNode.js:http://nodejs.cn/download/ & E3 `! s S1 g+ j安装就是无脑的下一步就好,安装在自己的环境目录下 6 ?- j* v( \7 P# Z+ T6 s7 Z0 i8 kGit:https://git-scm.com/doenloads, x! K2 ]4 W/ b
镜像:https://npm.taobao.org/mirrors/git-for-windows/ 0 {. h0 V( W7 B e确认nodejs安装成功: k* [+ {8 f, f1 ^0 \* h0 _& H % f6 Z! N! c( q4 K! { l( _$ R + \. O0 l! P2 M6 V0 f7 Kcmd下输入node -v,查看是否能够正确打印出版本号即可!! k- R5 t) p4 o* w4 x. V
cmd下输入npm -v,查看是否能够正确打印出版本号即可!5 i) n$ T, [* O: E5 u
这个npm,就是一个软件包管理工具,就和linux下的apt软件安装差不多!' X) ^0 @- S; u m
安装Node.js淘宝镜像加速器(cnpm) + m N7 b. ^. k7 a3 I 这样的话,下载会快很多~. t6 c! S" E) F' {: \# c
# -g 就是全局安装! H/ y/ d6 x' O I0 @" U
npm install cnpm -g " w3 }! W1 t# ~3 F0 p$ H) e9 [9 h! Z: p: S( p
' \* i+ n' \$ c 1 m3 M4 R }" G* ~: F' W服务器端模块便于重用 % x4 h4 y5 |* a! m: @NPM中已经有超过45万个可以使用的模块包 ( `% a5 j2 B0 O" O+ i M, P简单易用 `5 y: O" ^. Z6 j. }) o# m; p' i' }缺点: ! O) N2 s8 N. s1 u$ |/ } ^: W' w5 Y( ^ 5 q/ g! q( V" A% a8 S; w同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的 : \' F6 K/ B0 `/ D& k% G, U, h不能非阻塞的并行加载多个模块$ ?; F& ]! }9 ~1 t" k' f7 y2 e2 @
实现:$ Y4 O( V! K5 v; B2 D; R9 {
7 M8 {5 ^( A9 i" b$ r" s, u8 }
$ A) h6 T9 [0 R6 B% m! H3 p
服务端的NodeJS $ J, e1 u3 A( I5 ^0 {•Browserify,浏览器端的CommonsJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大 - m9 o0 }+ w( d& b# Z" xmodules-webmake,类似Browserify,但不如Browserify灵活2 k; X% ]5 _) Q( C2 S
wreq,Browserify的前身9 n, R5 ]5 {, a
AMD 1 ~4 ]4 J5 c2 g5 }8 W9 `$ x) sAsynchronous Module Definition规范其实主要一个主要接口define(id?,dependencies?,factory);它要在声明模块的时候指定所有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行。 7 o3 ?4 Z2 ]2 R4 S, O6 w5 v" G * Z# @. b$ `$ j 2 f! T1 H0 c7 N0 Hdefine("module",["dep1","dep2"],functian(d1,d2){ * U8 N, _, b3 y, \# g$ P return someExportedValue; ( D/ T# Y! J" ~9 S}); " L4 A! X# Q- C- F4 ?0 Crequire(["module","../file.js"],function(module,file){}); 5 J% G. w$ S) c1 m0 {: I; g6 h" B2 J12345 ^4 `* @ g/ B0 U8 c
1 F0 i9 o+ \) V) m26 P z _! b' j( N
3& P% I6 w# y0 d
4+ X0 U; V d) _/ U$ v# |
5" v, j3 S( P T' p; i
优点 9 {) u0 _. u. y+ O1 X7 h, R, ^, N4 K! ~
7 N* k9 C! L3 W' L H2 l) N1 M适合在浏览器环境中异步加载模块 6 C0 R* ^* `( `0 ~可以并行加载多个模块 1 [! X+ n+ H2 e缺点8 @8 {. S( ]/ L5 n3 f' u. C! c4 i
2 B/ f& e4 B1 b+ d/ X3 Z
- Y0 Z/ X1 Y% F7 I; |
提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不畅 H) f% `$ a o; Z# ~
不符合通用的模块化思维方式,是一种妥协的实现 + \& S) ]; D+ w) i# s实现 / C1 L8 H' u1 l7 {: g ! N# N5 z: O8 G( V, T % B4 |: b: X t2 D/ M3 ?' e$ H9 ?RequireJS5 A5 a. Y5 J% ?# j3 U8 p3 l+ C
curl' A1 h+ z: R: [, F w. y
CMD ; Q' p3 s0 a- X' Z% QCommons Module Definition规范和AMD很相似,尽保持简单,并与CommonsJS和NodeJS的Modules规范保持了很大的兼容性。3 ~! `" T) p4 t
; n6 O, S4 @7 b1 w
$ E/ E2 I* E5 a+ d- @define(function(require,exports,module){ $ d [4 S1 y5 t% c var $=require("jquery");" [" c0 }8 Y2 ^, [ V
var Spinning = require("./spinning"); y2 g+ B7 _- } exports.doSomething = ...;% N9 J" Z, S( I; G5 w+ M0 i0 p
module.exports=...; 6 s( u' ]# E* j$ a});* U( O) S2 _2 A: r
15 o5 k6 [$ e* q7 F, Q
2 ' u/ F( k, H0 O: _4 h3* v' {* {9 c% T
48 K7 f2 ~: A. H. C; g: Z& A# e
5% d; r7 k( U! W
61 y! u7 ~. ]4 c# u4 z
优点:5 I0 t/ g0 Q& X- T& u
# z5 ~( L4 o+ t' r- ~( `2 p! a( t2 W* M s3 l- Z$ o0 f
依赖就近,延迟执行+ _2 l; R* O. ]4 Z1 g7 N
可以很容易在NodeJS中运行缺点 # T+ h+ W3 G( b2 E0 v依赖SPM打包,模块的加载逻辑偏重" f- |/ K' O0 J' k6 p
实现5 W. g0 Z( j8 l
- @5 U' [8 c3 g' j3 x% L : p n: g' a& t# C- W( c4 F4 tSea.js 0 M" }. @% @( W: _5 icoolie * S' K' }+ X) IES6模块 # l7 u* r& b5 X" S4 V6 T$ o* C% r8 A8 L. u8 p; r
' a$ V! e9 p, A" ^, gEcmaScript 6标准增加了JavaScript语言层面的模块体系定义。ES 6模块的设计思想, 是尽量静态化, 使编译时就能确定模块的依赖关系, 以及输入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。 8 F" }; s! W& ^/ j ! G+ V8 O" B2 G( S5 ~ : X# k. Y% E5 C- [2 w- `import "jquery" ( o! f: r w) I- bexport function doStuff(){} . {# P3 b. b; C$ a; s: Tmodule "localModule"{}' C5 I4 C$ j# d% [- O2 b1 O1 o
1/ e$ r$ A7 T$ j( v) F. y$ a
2' I8 `! T7 i$ \; z+ Q
3 / z/ M j1 e6 X2 K$ T优点 : J* s8 `0 e" a' Y $ `7 T9 l4 {# V) X- }2 F0 |5 b 3 J2 X0 P# J0 x3 |; z8 q1 `3 J容易进行静态分析 / J1 n3 g; q' t% A! n面向未来的Ecma Script标准2 B' \4 W7 K- i9 J) {2 \- ~
缺点, Y" n: k8 H$ F' _3 x% \
: l5 A' l" n, M+ H2 t; g
' K4 s6 B0 o/ Q9 H+ y/ l原生浏览器端还没有实现该标准; N/ t) x# K5 f b' H( Y( S( ]: H
全新的命令,新版的Node JS才支持 3 N' b4 N5 X: b实现 ~: U0 [! ^. p( W+ H, D) g9 s: t% T4 d0 i: b6 [( N. ~" W! j) j
: Q9 ~0 ]5 |; Q9 D3 U |( z
Babel 5 t/ x* H4 C! w' C) G! T9 f大家期望的模块. v% P: C9 b$ |3 ?7 u+ R8 Y( o
系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。! x! O, W3 z$ x+ \/ ]+ h; F4 K
6 p" V! [# ]; p, X% D0 K( J9 y9 A r' E8 N% Z
10.3、安装Webpack- A* m1 f2 f O( Z9 @- L
WebPack是一款模块加载器兼打包工具, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。( w. |0 G& |. V- T l
安装:9 b+ ~+ X' V! L. R
, O9 K# W* L; M) V: Z. ]<template>( I% c5 q6 Y$ {# A" \6 a+ @& \. a0 s
<div id="app">) d W9 T7 f% P9 L) E g; h
<router-view></router-view>% d0 I9 V& B+ M0 S2 h& q# [
</div>% h/ |) C) {2 p( ^
</template> F7 ~) Q2 i8 |* M& w. T 2 H5 p. D! Q. U* E ) z9 ~5 h( O0 ^) k; t7 q5 o2 i) ~<script># `4 b2 h, n; ^, _ a
8 A6 O" K' K# o1 u& @+ y, z- r# e. T 5 y: t* c! [# E3 U$ n, r( W7 f& ]7 j
u/ ?3 k6 j- n
export default { * [) F0 @- w- |5 Y: F/ i7 @( C name: 'App',5 s. Q7 L& Q4 E, q% V
$ }* T _' Z) E; b' C
. Y# K+ }& P7 r} ) A4 u. c0 L+ k9 a0 D* X- @5 A</script> 4 S' n& O. U( D+ \2 ?! g' m( ?" F2 l, M6 s& _6 }1 L/ M
9 T: L! Z1 b! v e* m7 o/ d. p<style> 2 F! l8 H! B% @#app { 8 f3 D% [* @; Q% l$ E& D$ H9 x/ W font-family: 'Avenir', Helvetica, Arial, sans-serif;- l7 z; ^, v9 O9 \4 U+ z" O' c! m
-webkit-font-smoothing: antialiased;0 {$ p) G1 M$ t& j
-moz-osx-font-smoothing: grayscale; - W `/ \# n9 z- a1 t. L text-align: center;6 D& B) [8 j4 s K! _, [6 x( }
color: #2c3e50; ( g8 D" C. }) z/ T, p0 q0 r N margin-top: 60px; 3 ?( s0 i9 I2 W; i" `% ~}6 w! {, {; o ?7 F8 U
</style>7 y, Q% `- f' \2 r( Z" ~
14 ]3 J/ ?4 Z7 C, E% j, I
2- g0 ~5 ?! j I
3 : `1 l/ V/ N7 x% @) P4' B# |: D) S2 q" c ~2 X
5( F; ], `/ x; [, }7 F& W3 H! F, a
6 0 ?) ~& D, U! x, L& F+ I$ P! V7 1 d6 w% \! z& [3 n. f8 , ^6 {( y+ Q7 ^6 w* h% i9 2 ^9 ?% K+ s, Q& i) @) L10 ( b: j) ]7 E2 `* [- d5 Y11 " z/ }% S8 n# {, s! T. V H" q: k12" G: l( R' B" u" P. \+ D# Q+ u# P3 \
13 ( W8 X1 X6 I" F$ W14( c, M$ O4 z3 S. M; P9 t" g* l
15* X: G/ q; D; H9 j1 d9 _6 T: \9 Q
16! i& p# `2 S# _4 h+ i/ v4 O6 ^
172 S! ^ ?3 x' @8 m# R4 z+ o
18$ h. o2 R' }- ?5 ~+ u8 ^# J0 H
19 $ X9 |/ x) l6 h+ w @) j8 I6 q20! K% k+ y; ?4 `4 z7 }, g
21 ; S; c: ]/ ^$ F& `/ U Y/ Z% u227 i) `( ?6 {+ j9 }$ ? z
239 `. G! z* w& l* x1 I
24. y+ Z8 H6 a6 F9 ?+ ]* F
257 ^' `( V+ R; y+ s& o5 C- G
main.js6 B0 n8 Q) Z+ ` M5 M
4 K; _9 b0 x! W, ~! T
# n7 o. |' p! _2 K. p# I// The Vue build version to load with the `import` command # v$ s) F; m; L$ d. _& ]// (runtime-only or standalone) has been set in webpack.base.conf with an alias.2 M6 U) p1 o* ^3 W% p
import Vue from 'vue' 8 p. I+ Q% @- f: Aimport App from './App'8 C) p1 U) j3 V; \
import router from "./router" ( Q5 e( R0 x8 `: C! ?: N# Q$ B6 h* @3 e/ S
# M( }2 g& S+ }. Gimport ElementUI from 'element-ui' 0 l4 W9 @8 S9 N# }6 [/ g, w% Oimport 'element-ui/lib/theme-chalk/index.css' ; X; i; P4 Y( j6 V2 H% f$ Q, G$ x . i6 q5 N# q, K* r5 ~. P. E6 @: A$ E
Vue.use(router) 6 Z% N& |6 h& aVue.use(ElementUI)5 m) ?, p- n+ x/ G
* _* C! K. v$ p. ?) C& [! s; I$ r6 F9 A
import axios from 'axios' k: `4 O8 K* j/ W G) j
import VueAxios from 'vue-axios'' e* Z5 _- x( J
Vue.use(VueAxios, axios)( K! n9 h5 i! B H; O% Y* Q
1& S& ~$ I" s/ {3 \0 M o
2 N2 J$ p' k# Y6 z& w" a: R
3 % p" _* e2 E s9 k l! M) H3、准备数据 : 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下。4 B) R* R8 o5 t1 Z) z: k/ Y
数据和之前用的json数据一样 需要的去上述axios例子里+ c4 \4 G8 ], _5 u
" y4 h, I' o8 J V6 T8 g " I" D: J- ]* F/ f6 O# G// 静态数据存放的位置 & o! J8 |% X0 Q6 D9 _; g @static/mock/data.json . u& p! k/ L, x8 _1( h- w/ {/ l9 l# \+ L, D
2/ }% w; m6 C+ t( K. E
4.在 beforeRouteEnter 中进行异步请求) q: b+ P! G6 a. p" [4 A
Profile.vue 8 ^! m* c2 O" T5 Y p7 m# |- r# B0 {% R' t" d
D6 ~+ u) n% r( G' i export default {0 [" J* d. N0 k( ?6 L9 L5 |
//第二种取值方式4 y* {0 C) ?) C. ]
// props:['id'],+ C# W1 y% `4 o* Z. N
name: "UserProfile",1 V3 g2 c: t5 X
//钩子函数 过滤器 ) {" L7 o4 E- A3 q0 b beforeRouteEnter: (to, from, next) => { 8 R& D- o2 n2 R0 F0 A //加载数据 2 w1 c9 E& v( v. _! i. ]1 ? console.log("进入路由之前")9 Y3 j. W, \0 p( I& F# C* o {; W
next(vm => {3 }' B/ K( |+ K
//进入路由之前执行getData方法 - T% |% o" ?' H vm.getData() . B8 d8 Q5 Z7 Q% ?3 g });) J/ A* F: L. C* h, D
},6 v0 ]: m4 J) R' f& G5 {3 R' } M
beforeRouteLeave: (to, from, next) => {( n# c; |! ~. _; ~
console.log("离开路由之前") " F l) O0 @: m7 d2 q- x next(); % j2 Q* G2 l: u* ], p }, ! M, O6 E: p! N2 e //axios : n, J: S4 x) U& O; Y3 X5 I7 { methods: {- V; g& |4 `+ M/ f. t2 ^; T3 w# U
getData: function () { 2 R" ?; {' h0 {$ K0 G this.axios({ . s5 F0 j3 R V; } method: 'get',- |" W, g4 ^( g- t4 K7 T
url: 'http://localhost:8080/static/mock/data.json' , {+ e1 A- W) J! Y }).then(function (response) {' l3 q9 U( g1 L. t. v0 n
console.log(response) 9 C6 a+ J1 [1 v- M% R i })% Q/ {4 Z+ |5 H
} 1 N+ B6 X& _# | `; F( u+ S$ X }) @ T4 ]/ C3 |, _" q
}5 U7 e- \/ f0 u
1 m- y V) D. v" N+ \* \
2. [$ }6 S v# P6 B2 z$ h0 q' \
3 5 z: Z! B- Z2 L$ u4 * \( d) ^ o! _+ s4 W) t* o9 T z55 `0 ^# E8 E) ~1 I
6 ( w( q9 o9 P8 v* N& r, b9 v7 0 b9 y) a' G. ?9 {$ R9 a% _! c) E8 . [4 f* }# o8 O- D W2 t8 _9; ]/ ^& S; y6 M1 t- s
10 5 l5 ^; @5 O2 t/ H9 H6 n% n11 2 g1 J2 V9 w: E6 T- i3 }, W12 ! ]% y- z7 M0 ^7 Y# z6 h13# R4 w& v7 u& Q! ^7 F3 w% m' U
140 u# X$ P' m2 W* \9 S6 F
15* t0 ?0 \6 g/ i' Z" t# w
16- n4 l R* F* Y, h' M
17 # N) Q3 b) s' v) Q1 O3 e18$ ?! L7 _3 v5 g/ E- [4 J
190 G; J& P+ A# R
20" j! b1 a/ ]+ C5 X
21 - j3 B3 r; K# }22 2 Z- f& n9 N# ?5 `5 e8 y( a23 : y( |, k) H1 W$ {& e24 1 p& f2 P" ^9 N W25 - n5 G& [% G, U, Y! \26 & l( m4 H4 Y1 G: W |27 5 L* }% _& _% x6 n/ P" t: X280 w2 x; W; E8 y" S; g
29 ! D' o2 R5 x+ Y' ]$ Y5.路由钩子和axios结合图5 [ q2 t* b& A! ^& W" J
4 c- e# O7 x) B0 m6 r/ J 5 a+ j' _1 I" v) r2 G, D- N 8 t7 I. z; J& u' c% i 4 h' Q* S6 K' k# ^图 效果图, O; K: U5 B0 i9 @. `" ?' \' ^& l
; R- O, w9 L) \* s1 }! @6 P c5 b) ~6 y. v
到此结束 完结★,°:.☆( ̄▽ ̄)/$:.°★ ( k3 Z$ Z4 I, W4 P' U ~————————————————! F L: Y w+ V* \9 K
版权声明:本文为CSDN博主「one peice」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 4 `$ o1 r& I( I7 t8 R原文链接:https://blog.csdn.net/qq_46138160/article/details/111028492$ K4 P. b( k+ L4 O