|
文章目录* n, w( @ |. M
% U) a+ e) ]6 Z9 ]( R0 n前言5 R0 ?$ F2 l" N
一、ref属性的使用3 H# ?0 V5 r& v
二、props配置
: |" f. W9 b5 `7 E三、mixin混合语法
- u' |/ ^- r! }# m& n
$ C7 x. f5 @; y" ]4 |6 e; ]1.简介$ H& @. @) a7 D7 I
2.使用方法
$ W% B8 J3 `' j2 j! d5 B% V3.注意点
& I. O' J; q' @; x' G4.结合实例使用
# u: D: ?; g( X% {8 |0 b
8 N4 n8 X' k0 {8 |2 }$ H0 C" |①全局混入
, Z( u' N" H* [+ L3 L②局部混入
3 c3 r$ I3 \4 C+ \# C5 F3 b+ N. w 6 L F; D, n# i7 l# C9 W
四、插件的使用' q3 r4 s& C9 I7 i0 }* D
$ l) y; e# f+ d: D( K2 D6 h
1.插件语法
; t# G! l" }% i4 U* H4 S: U$ s/ Z) y7 ]2 a8 f# B) l
①定义插件9 P# G0 t% H7 W# n! Q4 N% T( {& b
②引入插件并使用
/ l8 { a6 I( P: ~8 u8 a 2.上手插件
3 f% B8 [4 t' }4 ~ 五、样式混合问题
; P$ r, k% y9 j9 v! y* h ; E- U) j3 O4 r# K T' _
' v6 t; I+ P( X2 s3 u$ t前言 + _1 ]& n& A6 r2 m
. |/ |. }. r& \, z在前面介绍到了Vue的一些基本概念与如何使用Vue,并通过node中的npm 使用vue脚手架(vue-cli)搭建了一个简单的Vue应用,其实所有的Vue项目搭建的时候都是换汤不换药。今天将会介绍几个Vue中常用的配置,他们的大致功能如下:, o& h& z E2 I/ D$ I
- F6 m/ n# [+ m1 p9 d8 b- I2 O. W
ref 作用是将dom元素选择出来,对普通标签来说与document.getElementById(“xxx”)是一回事,对自定义组件来说会将Vue Componentd对象选择出来,获取到VC对象也就可以获取到其中的dom元素了。) ^* w* e9 M! T( _
props 作用是父组件向子组件传递数据(当父组件有更新的时候子组件也会有更新)
1 [* I- {1 w; q& F# ]mixin 将组件公共部分提取出来,哪里用到就在哪里引用$ e% w0 Z9 d9 b% K0 `! y, j- Q, E
插件 别人写好的js文件,我们只需引入并use即可(这里要区分好组件与插件)
6 \ k+ U: u. Z样式混合 如果给组件的style不加scoped将会导致样式的混乱 2 g2 X9 `) u% B& F @
有了大概的预览之后就可以进行深一步的学习了,将会配合一些代码实例进行叙述。4 I7 t7 d; h' s7 ~+ x" G
' H; F1 g9 Y3 H. G0 ]
一、ref属性的使用
6 _4 w3 S+ V7 @6 ?3 \' u& d4 A
+ O2 i: ^6 A2 S 大家在学习css的时候学过各种选择器,也学过使用css选择器将dom元素选择出来,这个属性的话起到的作用就是将想要的dom元素选择出来,根据ref属性可以很轻松的找到dom元素。
8 _$ Q1 D. O) n6 ]( @6 x6 H8 l' j& x & ]1 a/ V* k" B% r* @- S0 H
3 B. U- ?% k) h/ j& U: J
[ol]被用来给元素或子组件注册引用信息(可以认为是id的替代者)
$ @) K# C9 a6 o" `$ L9 b标记在html标签上可以获取真实DOM元素" o+ N* f3 p' J- w. _ F
标记在组件标签上可以获取组件实例对象(vc)5 ]4 ~) P% G: O, V, ~6 `
一句实例对象可以进行自己想要的操作
5 |( @& l" T6 i/ ]0 T, X; G8 z使用方式:
9 |, M' G) k6 i1 P$ `/ u) y7 u [ol]给元素打标识:! [" R. B3 f7 V- @% `+ ~6 H& ?
①. .....
1 k! X, D; e( { ②.
0 o/ B% G8 h9 s7 d2 @! ]' u! C ③. 获取元素:this.$refs.xxx[/ol] [/ol]
. u: b+ }' f6 B5 b结合以下实例代码:# |) C4 h- Q( E$ c
App.vue; ]& J4 S3 F5 I5 w1 \/ Y
9 ~: p9 [0 }- a
]3 h; `2 v6 [; R- {) O( Q( O
6 {- \; N$ a; L: M$ h Hello World% i/ A# |% T% b% y9 g3 J9 u( |7 s: q0 d
3 u+ w, L0 X$ H' F) }& `* X 点我体验ref
9 B5 L4 l% T! D, i( V ( y. E3 d6 h, I. S
3 R- _3 T/ v7 B/ [8 o& b/ ~
% O4 U4 `- H9 l& D* f0 G& m
& h2 r4 \6 l ^% }5 }
. ~# I9 B# X& K. y5 ^" ?8 A. `Student.vue; |0 k! J% o% H- a4 k
& F. P6 W' k- A1 r! J
; `. a% p1 f# @* X0 t 我的名字是:{{name}}
, l. Q7 j2 l7 G. q# H% C, T 我的年龄是:{{age}}
( S6 f+ E3 C( n; Y- i9 W* ~ : G8 {, R* Z& E$ z2 X
[img][/img]
. i7 P. z5 |- }8 e* e& c0 f7 u a" i$ e$ u
( T/ D) A/ c7 l
6 [ c7 [7 C/ o) L
, V6 p6 ?: T! ~/ v.demo{
9 E% I, j. ?9 F# F background-color: rgb(173, 167, 167);
. z6 z3 \( w+ b# Q& C7 O& f}
: O1 p l+ ^) B/ @, l1 c
; ]5 `& ^$ D8 G+ Q2 P: f
8 M# B: F: s0 x; F* K' q, t ; @2 j, l5 C1 ~0 B9 u( Z# A
5 P/ ]6 A, c1 D6 o0 Y# B5 r
8 |8 W5 | {7 B2 A7 B. m二、props配置 ' i# V! `, C1 k. b
[ol]功能:让组件接收外部传过来的数据
$ h) S7 n$ u9 S J. W, T) h# n传递数据:4 B' B7 d. @4 N' e' S; `
接收数据:
: g1 l& B, [! K4 Q* K/ Y [ol]第一种方式(只接收):props:['name'] . Z1 t( j5 N6 O. F$ P4 u2 ^
第二种方式(限制类型):props:{name:String}4 U% \. P; U# x) {) B9 P4 W) \- I/ U, x
第三种方式(限制类型、限制必要性、指定默认值):props:{
/ X7 a( n% [# K* I. D N: e4 r name:{& F- `3 h6 D8 f' v
type:String, //类型% I b) t1 w' K8 @- C" u
required:true, //必要性/ `2 A+ j8 L9 Q9 z7 M
default:'老王' //默认值
; o$ i7 w5 c( `" U* t }& a/ R, t) a3 d$ C: J
}
# i* d o' ~6 `6 r& ] [/ol]
/ _2 w" I( j( m7 s9 j 4 ^% D# R6 t# \0 N: t! b) N% C! K
注意:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制(将数据复制到其他对象内)props的内容到data中一份,然后去修改data中的数据。props接收到的对象被替换掉会有waring 但是props对象内部的属性被替换掉编译器不会发现,但是我们一般不这么做。因为存在隐患。6 P" G" g5 B7 A, j- y
; h, z: ]% N0 R2 z/ l' \
[/ol]
& c* w9 s8 Q7 _+ i. M, I. ?% N当父组件中传给子组件的属性发生改变时,会触发模板的重新解析,如图所示。改变的是父组件传过去的name,会引起子组件接受到的属性发生改变。
s- \, J1 e4 d0 A. ?5 y
n$ z* o) w5 q9 p, O% K( v( i7 u. Y7 z6 ?$ ?
代码如下:* o. G7 w- f% G" s8 W5 M! @
7 n4 Q, z+ {- g0 d% ~6 dApp.vue
0 ?1 u) H- v k. W$ J2 P1 u
6 c* V8 k" @. V: @, v$ k U$ a , ` i9 F( d2 p$ e& ^
' A5 i9 \( W6 h+ d6 o
点我改变传过去的props
/ |8 q0 M6 Z6 _+ D ( c( b9 I$ f# O+ j8 d* V& n
2 `1 o r- l( p6 W$ s9 w5 g& N
a+ [+ F/ o. D7 u, G; o# Y6 w
7 Y8 I5 c6 t5 i5 @( ^ F
+ T4 L W( O3 T! L; D& p; i5 \Student.vue3 _: Z+ P+ \5 U' W
# V3 n/ Z/ o4 n3 h0 w& j
+ l( ]- p- k/ L) [2 D 我的名字是:{{name}}
( Y1 A- ?* [/ _; |2 D; b3 L: @" D/ q 我的名字是:{{newAge}}岁了
! \ k( U7 H8 A' T6 u 点击我进行年龄加1 4 G6 y9 M4 \% Y: b
! K' e9 w6 y" T8 M( P
# i I% q2 n& ~$ Z& m- n$ H. O+ U
.data{2 g# L% w( ?9 z) V
background-color: rgb(202, 190, 190);' t7 V& ?9 A0 }- f! p2 m$ k+ S
}) g* L4 U0 z3 ]& v9 F
9 a) w1 F) v$ s7 x) V' u
三、mixin混合语法 / F: q2 K6 \" B! t$ ^" q- e) H7 M0 J/ f& R
1.简介 - H3 S- J9 c( l8 p( T Y
6 E9 y1 d$ ~; w& B6 J& w
mixin可以大大的提升代码的利用率,把多个组件需要的功能提出到一个文件内4 Z2 {2 e3 ^/ x+ Y
如果mixin限定在main.js上,那么这个程序所有组件都会有
! Y6 f% ?! v; A3 f, _. \ , O1 i# f; c' Z; v
% g; j0 T& Q/ n: i( b2.使用方法
1 y s. `) G2 x9 R+ Y, y[ol]在mixin.js中定义要混合的代码,组件中引入,并显示调用mixin属性mixins:[]其中mixin后面跟的必须是一个数组
1 T. N8 G# I* Y在main.js中开启全局配置[/ol] + F* e7 O6 e6 [. P% L! D1 U f9 i
3.注意点
/ Q' h& t. _$ S% y9 W9 M) u1 y( I如果你的组件中定义了与mixin中相关的代码,脚手架会以你定义的代码为基础(也就是组件中定义的代码优先级大), W: [; C6 s' A, V9 r/ K+ Y
但是一些特殊函数例外,比如mounted挂载函数。声明周期函数会先执行混入代码再执行自定义的代码& f, Q4 } O: r' w
7 T& w8 s9 g6 @* r8 _$ c F y4.结合实例使用
) q d* r, @% {/ V, {! l9 a混入的生命周期函数会先执行,然后执行组件内定义的生命周期函数,普通函数是以组件内定义的为基础,如果组件内没有定义会以混入的函数为基础,如果两个地方都没定义就会抛出异常。
% o& ]% Z3 ?3 B' V: J
2 O6 _2 f. |# S0 T5 R0 v/ x2 |* ?# h6 C: Q+ j
2 e. n# X% G4 {& }* C8 z( F
①全局混入
2 O7 y/ q. L, h+ Q8 `9 v7 B8 _全局混入通常在main.js中进行定义,然后在所有的组件中均可以使用(不需要再定义属性mixin)
( q9 |! Y4 s: f+ k2 p1 L& T6 P 语法如下:+ R9 A; I3 {4 |: K8 T) s8 n4 k
main.js$ E* A& B6 I; L" g$ s! l5 D
# `/ M3 A; W1 N( Z7 U9 ? l' q. j3 F1 [// 导入即将混合的代码
# S% V$ E/ x) V0 jimport {mixin1,mixin2} from "./mixin"$ b/ m3 D( f: M$ l
// 开启全局的混入(合)
; a8 }$ l, _: Z7 m9 N6 A4 t9 J3 J0 RVue.mixin(mixin1)% G1 R8 i' h% S9 p; L3 @" ~# G
Vue.mixin(mixin2)8 H; ^4 @- _, Z4 R# a7 N- t
8 t7 C8 _7 K& B2 U# j- K, q, O
②局部混入 - H+ O- b& r/ t }) ~8 X' V: _7 M
局部混入的代码需要先进行mixin的引入,然后将其写进Vue Component对象的属性内也就是前面使用方法中介绍到的mixins:[xxx,xxxx]。/ x/ A! O& D, O$ \4 p& o- Q: |- l
下面是App.vue中的一部分代码:
5 T9 M: {' h( {4 G9 M J + x, f, |, I9 {) l# V. p0 `" i% w# g
import {mixin1,mixin2} from "./mixin") C% E- ^# P* d1 b
export default {+ L/ B# B- W" z& B7 w
name:"App",( J6 l7 n/ A8 g7 @2 w
components:{
% E, l( S3 j* l9 Q$ g Student,, G) ~. W v/ C
School" G; j, [5 t: g
}," ]* I* J. b I
mixins:[mixin1,mixin2]
! Q. K& P- `# w/ m+ a6 B, Y# ~' m}
; y# |! \- X- N# w
8 W0 f. o2 _# _6 y8 o8 V当然在体验局部混入跟全局混入的区别时,也可以通过以下一个实例:
6 X. g4 V* n* M/ l 当打开全局混入时,不必使用mixins,即使使用了mixins,普通函数会以你定义的代码为基础。
# z( u) c6 c2 S4 z# _" u/ y test.html- M' A8 T% Z3 l9 u9 ?: O
5 T" K' o9 [3 l$ R T
+ s" D& T. Y! k+ h
5 S5 F3 `; J. t3 L: vVue 测试实例 - 菜鸟教程(runoob.com). W! @: U% T) @' ~& A
?# E% A- @1 p8 t; J6 e
# v- a, H! N7 ^* |# T- j
$ n5 I7 e% l# E四、插件的使用 4 v) W0 v/ T4 C
对vue的一种增强,包含一个install方法的对象,install方法第一个参数是vue,第二个以后的参数是使用者传递的参数
% v) v1 l! t# v9 x $ {- ~3 f6 ^+ F% D0 X4 G
1.插件语法 + ^# ]5 P0 T$ u1 e/ P
①定义插件 ' `2 X7 Q% v) c/ f; J, s$ R
```js% o* B: {! e4 T( g; w, v1 b6 v
const plugins={
; C' Q: P0 r6 ^ // 这里install其实是一个属性4 R" h$ m& Z L m- |
install(vue,x,y,z){
& f) ]% d+ K6 ]- k j4 `0 R& T2 u' W ....
9 r* U/ W! T6 Y9 l$ B ~ }
* f& T: V. `. [1 ?) M( q}" d& ? T1 f) C) ?! Z
export plugins
- m2 r5 _9 [1 ?7 }: q* f```
b2 G; J2 ]* n; \% P! z. n' z
% q+ J* V w5 P0 z# f②引入插件并使用 ) B. e/ q7 O8 q! J9 Y# M+ ?2 ?
import ... from ....
$ t' |' [- y5 p6 ^; Y. c1 }9 ~Vue.use(...,参数1,参数2....)
" Q1 I. ? }) S& T* ~3 u. Z9 K
" s5 @; i+ z* B, A+ u+ J' K2.上手插件 # d- a& M( Z0 A8 O* B
自定义插件一般放在plugins目录下,网络上也有许多大牛定义的插件,只需引入使用即可;接下来带大家自定义一个插件,并导入Vue项目进行使用。
! X7 j u, | P9 g1 g1 H " e& p+ O: _. M k$ v# f3 M- @
plugins.js1 n( b) X+ z2 y6 w/ l
^) C1 b" b( z; D/ X/ X
const plugins={
0 h( v! u6 @2 n4 h& e6 d, v: K9 j install(Vue,x=0,y=0,z=0){7 j5 K+ Q6 ^# j( w+ j! Z o. z7 l1 _
console.log(x,y,z)2 N5 s* C# V6 K
//全局过滤器3 c# B# u0 x2 l F& X* b
// 使用到这个过滤器的地方将会只显示列表中的前四个元素
; e: w( j3 {9 D0 g* u* y% g Vue.filter('mySlice',function(value){: Q3 S4 B4 [% P/ p) P4 }$ C+ N6 Q
return value.slice(0,4)1 q* J+ _& r% D7 v% \4 \ z
})
" h3 f% n! i2 O2 w- Z //定义全局指令8 z' [2 v7 k9 O! `" p
Vue.directive('fbind',{& i. J; v% w" s, j1 E( r; r; R; R' z" g
//指令与元素成功绑定时(一上来)
3 ` T s# V2 C; ]7 W3 w bind(element,binding){
( T4 j! o: b5 m6 w i- n4 S element.value = binding.value2 r5 j c: J B# V
},
0 f( B: b% ?# w k$ b( @' P' _( Y //指令所在元素被插入页面时
, g" H/ J1 G& u3 O7 \& a- Q inserted(element){
W7 M% h. P" w element.focus()
6 N7 T G1 |. A0 Y- ? },
. A; [* T- O) f& S1 T //指令所在的模板被重新解析时* k0 C: x8 W4 _4 ]# [( K) q
update(element,binding){ q4 d- X( D, Z4 j. ~! D' w
element.value = binding.value
& A+ {6 Q4 O$ b( J h }
9 o4 Y* P9 g3 g( ^7 E& K })9 m7 r7 z$ d+ S4 T! {% ]$ d
//定义混入: c, ?# S$ ~2 j- {- x6 S! [
Vue.mixin({7 k5 I2 }* R V I- w( |
data() {# [1 F3 k7 Y' L: Q9 v E: J
return {
" \2 z+ Y* ^( m x:100,
) T6 V3 n7 Q& n& z1 ~9 M8 b { y:2004 Y, |+ I: z% y+ D; [; ?2 q$ ?9 q
}
5 e7 q( M/ p* P1 k5 H* K' w0 o/ A6 B },
/ {$ c0 V/ }1 x( R: P" M, j+ ^ })$ f0 M% b# K" A9 D; t
//给Vue原型上添加一个方法(vm和vc就都能用了), l4 o$ ^, X& F, s7 Y) v0 z7 T
Vue.prototype.Hello = ()=>{alert('你好啊')}
7 s2 c# `9 \7 D0 \ }0 e4 j% Z. e7 X' e! Q. v' k
}) \) f( e; j! A& |: `5 y
//暴露出去
7 {: O5 G8 o/ V* Sexport default plugins7 V) e9 G" g8 Z9 c) ^
4 S; K: J/ L4 B0 T/ I! P, a
引入并使用插件% w0 L, L, s8 R6 x' R8 X# |* W/ K
main.js0 N, u7 b) e: M8 _* w
# Y" G$ I* T5 Q k, Nimport App from "./App.vue"& G# |* G( u- G4 ]5 |8 _. x+ n( V" {
import Vue from "vue"7 c" K- X0 o" @1 \! t
//导入插件
% u& G% }- x7 o! i$ himport plugins from "./plugins"4 u( T5 g! ]5 X; Y, e
//注册插件% D# y' W. P" b
Vue.use(plugins)# l m. V9 \, p. H' Z9 v( N+ \7 e
new Vue({& Y# X5 L% B7 g$ i
el:"#App",
, @* p4 l+ G! x$ |% V5 O% x9 o! ? render:h=>h(App)
: I0 ^( C, y: q- ]/ n})! b3 U1 D# f6 L* r( U2 R
8 u% d6 K( B) g
使用插件中的自定义指令
' d: \: I1 y. b, c9 d0 r1 P7 ~ . u5 R' X6 D2 K# ^7 C; u8 [) r9 H
6 u" V; u9 G2 H 姓名:{{name}}
/ v0 I4 [" r' f, W5 r* s 年龄:{{age}}
5 [8 b; o. s& Z6 W }1 W <i>
$ B, x! e, p2 T. M, `' |
c3 x. Z6 ?: ] j1 k: d4 X' I
+ X; H% ~* ?: @3 L8 T+ N' Q9 k, ~9 a" N3 M. _0 r
4 v! ]4 r9 R- [: _! K: O " \1 q- T. x Y2 V$ [
五、样式混合问题
M; b) Q0 v( y9 _1 E* i& J描述:不同组件中如果使用相同的class,会导致出现样式覆盖的问题,覆盖规则是父组件覆盖子组件子组件根据导入顺序,新的覆盖旧的。可以使用不同的类名进行区分解决问题,也可以使用scoped属性,对style属性我们还可以使用lang进行指定,我们是用Less还是用css
' L5 b( H; j( `5 q 原理:scoped会根据经纬度、时间、使用电脑型号等生成一个唯一id,然后将这个id插入到对应的标签内
; t& x: D* ?+ x0 C1 l8 ^9 b 再将相应的样式转换为标签属性选择器,进行样式语言的限定。默认选择css样式语言/ v+ v6 F0 Y0 m% o7 f+ N
9 Z: c, P: |* N% U. z4 L1 Q
.demo{
6 r; j) g# i7 m4 v7 f6 @" T1 \7 F background-color: red;
- Y1 \& _& P- S W- }; s( ?7 h}* b' W9 G4 z" d3 P& P& i
4 l* A3 t* ]4 K7 P
1 a6 i# p8 n, h* B" b: O* ]" E
至此这几种属性或者使用语法就介绍完了,大家有啥疑问或者好的想法欢迎评论区留言。
( U( q4 R. `& {# A2 B * U( X# z/ X B, F9 D) z* X9 _
|
|