|
文章目录
+ Z4 ^2 O# e# k7 v' ? ! Y3 ]% T2 R9 t9 U
前言. d/ j3 O7 D$ [+ h
一、ref属性的使用
6 [4 N9 R+ m* B$ I二、props配置
3 z& u, H. x) n' u. r; t三、mixin混合语法: R; ]2 T& S* Q
2 \# N0 F- N- V8 n/ p. \
1.简介- F# ^ `+ T. {0 D6 Y
2.使用方法8 m* d s" V8 Q7 Q& Y% A
3.注意点
+ y K' X1 W$ V4.结合实例使用
5 b0 G# g" Z O& |
: F" e/ u. O( L! ^, s- P& W; }①全局混入9 t' a O9 G2 k5 o. v
②局部混入1 G( c- e: P: |. E$ H; K
! Y4 @+ `1 V3 t 四、插件的使用$ w4 h( S7 \* z, P' g0 [' b& P
' S6 y: K6 T' h2 ]0 R
1.插件语法
1 V# f0 o8 O9 f" ?1 T
( ^" k! p4 C/ F$ P8 o; Y: r①定义插件
: `; F O; Y6 f# ^②引入插件并使用
6 F7 Q: E7 b' `" H: ?$ _& i! y 2.上手插件
3 O1 A y. b) a. ^' e 五、样式混合问题
2 W% b1 I3 L$ L& o7 L: j- z
1 q" d& L9 ]# T- `
# x; |7 t, G; A1 W前言 / `0 M# L8 d2 k3 L! P5 x% [. p
# X# q9 A" l3 \) D在前面介绍到了Vue的一些基本概念与如何使用Vue,并通过node中的npm 使用vue脚手架(vue-cli)搭建了一个简单的Vue应用,其实所有的Vue项目搭建的时候都是换汤不换药。今天将会介绍几个Vue中常用的配置,他们的大致功能如下:
$ P9 R5 x4 V, a9 _& U+ M( B/ @
# w7 r+ Q0 F5 h8 h+ C9 G9 }ref 作用是将dom元素选择出来,对普通标签来说与document.getElementById(“xxx”)是一回事,对自定义组件来说会将Vue Componentd对象选择出来,获取到VC对象也就可以获取到其中的dom元素了。
+ o: ]2 r7 l" M Eprops 作用是父组件向子组件传递数据(当父组件有更新的时候子组件也会有更新)" v" g+ c& J& N: n7 J m
mixin 将组件公共部分提取出来,哪里用到就在哪里引用
7 a+ ~; s5 w7 G' u) {插件 别人写好的js文件,我们只需引入并use即可(这里要区分好组件与插件)2 u+ c& \7 X& F- X
样式混合 如果给组件的style不加scoped将会导致样式的混乱 8 T+ s# U5 s4 @4 W) l
有了大概的预览之后就可以进行深一步的学习了,将会配合一些代码实例进行叙述。
V+ B* g" U( \5 n; V: V1 g
0 _6 z* P. f6 G9 M; U* F一、ref属性的使用
+ j' @& Z5 E8 Y1 ` [# o / E# y9 t: {* d( h
大家在学习css的时候学过各种选择器,也学过使用css选择器将dom元素选择出来,这个属性的话起到的作用就是将想要的dom元素选择出来,根据ref属性可以很轻松的找到dom元素。
' q; a( [" |! T) e) z( N 7 y8 t0 O; r* w6 U+ ~
. m( ?: l3 s E6 t[ol]被用来给元素或子组件注册引用信息(可以认为是id的替代者)8 U/ Z4 w0 c! U" V# ^5 ]; `
标记在html标签上可以获取真实DOM元素) i) ]$ s7 b; J7 V: y
标记在组件标签上可以获取组件实例对象(vc)
( q) h9 @6 L7 W' ~一句实例对象可以进行自己想要的操作
p; ?, N; H2 Z' _, s. U使用方式: + S4 `% ]4 ~ l& J
[ol]给元素打标识:
5 o, h) E: l z6 F ①. .....& K- n/ i: L: s0 b& l. a
②. / j) f; E8 [: E# {$ F* \
③. 获取元素:this.$refs.xxx[/ol] [/ol] 8 V: J y- Q# A7 o [
结合以下实例代码:6 V& w( Y' e" i- T5 n" {+ q% X( X
App.vue/ L: d- G! q4 B" [3 q. |% r/ ]
1 n+ y0 {+ V! Q
& Q/ X1 p: ?2 m8 v1 C4 X- i, n0 c # b$ M$ O3 C4 t/ t( Y
Hello World
; |/ Q a+ Q5 {3 d! ?
h% w$ I' o2 ~/ v 点我体验ref
1 P3 q- L" u. t9 q 4 ~5 F' I I3 [' `: c* A
& s+ D/ E" e8 R0 x& d! m |/ Y! B: [7 I
: ^1 o7 J: v) B* z! D' k' Z7 H
g( {8 M3 h$ j& |8 D6 t' n/ KStudent.vue2 p8 N+ d0 r4 [
" G$ E& }) ?- A
" K. a+ A$ ?9 ^ |6 S( U( f
我的名字是:{{name}}4 s% K5 I4 _( y8 [6 O2 r. s
我的年龄是:{{age}}! e# r7 l) y" y v
$ z4 a. ]( ?0 h/ H9 C8 w[img][/img]
2 @* O7 R( x1 ~2 j0 `, ?
# s5 r: X+ e6 h' [% G
1 h' p2 C$ K2 p9 G
8 U+ i8 s+ ]1 [( t% l ~& b2 K8 P3 @! B& i% N& F, {
.demo{' B. ~- ]4 E: L3 L$ g: ]* C; @7 l# v
background-color: rgb(173, 167, 167);
3 {8 m9 I" O2 o* ]) q) `}, {" e# S1 w1 ], j
- @, f+ `8 z4 G8 U/ o! z' v& o$ U" Z, D: N% w2 L, s8 }3 \& q: d
" Q5 A7 `$ Y* o' b3 o8 ^" l% e5 g3 ]
M8 ~: C9 y8 Q' B9 A. j# j ' E# c7 G7 E, y( `
二、props配置
' V* \- c& o1 b[ol]功能:让组件接收外部传过来的数据
$ j0 ]5 n% g) j' f6 p传递数据:
a7 {! @& I5 I' ?$ D. Q% [接收数据:
9 s* }, s" L( B: y" B# ]2 d [ol]第一种方式(只接收):props:['name']
5 L% s& \4 S5 ]第二种方式(限制类型):props:{name:String}4 \7 g: c% S! {! L( Z
第三种方式(限制类型、限制必要性、指定默认值):props:{$ v1 L- p. s. x0 g/ D
name:{: T, B% {8 y) X4 j5 v% {
type:String, //类型$ }5 Q, \6 ^' ~7 Y/ X. y" z6 M
required:true, //必要性
, B' v! b! }" z* e. x0 k' b3 I" h default:'老王' //默认值, S R! p) p! [0 _8 D& u# E$ T
}7 B% o+ {- S3 I$ i' U" E7 V
}2 l& G& O" o4 O% m& T
[/ol] " }5 u" I. {$ J2 @3 p# `
5 B! i- m, @1 I/ I, K- A 注意:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制(将数据复制到其他对象内)props的内容到data中一份,然后去修改data中的数据。props接收到的对象被替换掉会有waring 但是props对象内部的属性被替换掉编译器不会发现,但是我们一般不这么做。因为存在隐患。* i, V- b: B8 J: x3 ^4 f% ?* }# M
$ K2 N. f, M$ i, ?! n [/ol] 9 e/ y; S5 n6 ^5 c$ [
当父组件中传给子组件的属性发生改变时,会触发模板的重新解析,如图所示。改变的是父组件传过去的name,会引起子组件接受到的属性发生改变。
7 o' l. {, r2 `
4 S y" Y: ]1 r8 Y" X! _ F3 M$ C1 M1 k* v# R$ i
代码如下:
1 I1 t8 D: C( C + B* [7 f) @( k2 b$ B7 j
App.vue0 i3 G, k# `) T/ _" [! E }
5 {/ Z+ c7 W" `5 \4 T- R( t/ S
2 n9 o2 N) U7 _0 l* }
- }0 q3 ~9 N k: \' S 点我改变传过去的props
/ K0 V0 n7 I$ M* H 2 p* ~7 H6 U4 ?; k
0 _+ H/ M+ Y/ r7 Z
8 s6 P6 g* j( F8 ]- F. \" \5 f8 p k1 r; ~; x
$ _0 U. D1 J: R- k7 o/ T" m
Student.vue8 J' s5 G7 ^, m. _
C: L6 z! L( q& k5 Y. Z
. D) k( B3 Z* I- w8 R 我的名字是:{{name}} / {+ d6 }. j7 x o/ @
我的名字是:{{newAge}}岁了/ Y3 j% y$ `. _( k5 ]; t+ c
点击我进行年龄加1 3 q. h; e% ]6 w/ w
! U9 ]# E+ Q& D& Z- y! J
& p1 S! I. M. ?& U% g9 P% T4 t$ {8 S) o4 u3 Q* e
.data{, I- b3 x5 Z9 u% P% p
background-color: rgb(202, 190, 190);5 t- F! }. g( n g5 o7 X4 n: E
}
% x9 D" O. E5 d& B8 I
6 P3 L: t# t, z4 W3 _1 s三、mixin混合语法 $ R) P+ Z; i/ f3 t% I0 x. G
1.简介 8 v B' P* ]: R4 n2 P
1 M2 p& ~, M# v5 }+ S8 s
mixin可以大大的提升代码的利用率,把多个组件需要的功能提出到一个文件内
% N7 r% ?) b6 k4 S6 g 如果mixin限定在main.js上,那么这个程序所有组件都会有) x6 k+ j9 k, {2 b9 E7 W: w
1 P7 t$ o5 o S4 h! I$ P& j 3 y9 `$ ]" ?8 x( [, \3 T9 l4 K
2.使用方法 6 S( m; }2 ~+ g
[ol]在mixin.js中定义要混合的代码,组件中引入,并显示调用mixin属性mixins:[]其中mixin后面跟的必须是一个数组
6 {4 n& |2 W# X( O9 I在main.js中开启全局配置[/ol]
0 W" g6 ]; O+ d2 e0 H6 I3.注意点
+ Z9 Z! P$ F2 B# s如果你的组件中定义了与mixin中相关的代码,脚手架会以你定义的代码为基础(也就是组件中定义的代码优先级大)
D' s/ r- x" L* u6 L5 U; S5 Y但是一些特殊函数例外,比如mounted挂载函数。声明周期函数会先执行混入代码再执行自定义的代码8 B- H9 ]6 X- s7 A/ T4 U8 X
- |( E/ v2 n9 ^7 ]( w: x8 z4.结合实例使用 6 U$ c; o+ C5 O( B
混入的生命周期函数会先执行,然后执行组件内定义的生命周期函数,普通函数是以组件内定义的为基础,如果组件内没有定义会以混入的函数为基础,如果两个地方都没定义就会抛出异常。9 O3 q4 E8 _; K1 i, d
$ G6 D! b- Z2 \2 R. j/ j
. u' L8 \# Z. K+ C+ ^ : b+ |/ O& ]# W4 p
①全局混入
! o9 M) A9 a0 G& o1 g全局混入通常在main.js中进行定义,然后在所有的组件中均可以使用(不需要再定义属性mixin)" e2 J9 K3 Y! |+ j8 a( W: G) q- ^
语法如下:7 w7 I$ j% V- t* r |# R9 e
main.js# `( `% R9 ~4 ?
4 R7 }# P, A$ ]) ]5 g$ S( o
// 导入即将混合的代码) O5 ~! R( |% h8 I0 m2 R
import {mixin1,mixin2} from "./mixin"
* j' c+ F; `7 D+ u// 开启全局的混入(合)0 z' g8 Y3 z9 U& |6 b
Vue.mixin(mixin1)0 f* j8 O8 _# ~7 T# V$ i
Vue.mixin(mixin2)# h, @$ y+ c" K/ k M+ Y
% g* m! P8 q2 M* w' u; F9 Z- x- d
②局部混入 / F; y$ {* f/ n+ r! I
局部混入的代码需要先进行mixin的引入,然后将其写进Vue Component对象的属性内也就是前面使用方法中介绍到的mixins:[xxx,xxxx]。
1 U% ~. W4 T8 A. Y6 Q 下面是App.vue中的一部分代码:0 Q$ \' k. Y3 r6 G
3 _ J. M+ D5 P7 N8 w- S5 timport {mixin1,mixin2} from "./mixin"( ^! M; I) u, C& G# O1 R6 f# q5 O
export default {
& R. K. i* L% u6 o; l V# ^7 I name:"App",! p) I( ~8 y" u5 t; ~! L
components:{- I7 \- a& j* m+ q% }/ z5 y1 j
Student,- x* y9 E% x- x$ K
School6 d) i. Y- z8 u, x
},1 a6 }% r- S& ?4 e/ d5 q( ?
mixins:[mixin1,mixin2], j" s5 Q+ a% E6 A
}
% L! A+ R$ ?8 f( S2 [6 p 7 y+ a& s! ^& |3 S
当然在体验局部混入跟全局混入的区别时,也可以通过以下一个实例:* g7 g* K: J$ u
当打开全局混入时,不必使用mixins,即使使用了mixins,普通函数会以你定义的代码为基础。
" ?$ F: ~4 y* Z. k test.html
5 m! J% D7 l/ e% h6 A; C- u
: _4 R8 Y: H. w* v% I2 v' ~2 l
2 m2 w" b: u2 J; K" N7 a4 p6 f3 I) `% `. n; X1 k
Vue 测试实例 - 菜鸟教程(runoob.com)
2 p. E C. x% V# h2 ]3 u0 \3 W" M! [; }( `) w' p
! A0 G! U& J$ w% s
' s( q2 o5 G1 t4 S# P: ]" h9 v ^" e
四、插件的使用 * u4 f: v+ J+ Y" a
对vue的一种增强,包含一个install方法的对象,install方法第一个参数是vue,第二个以后的参数是使用者传递的参数
, p: P5 r; _# d) ]4 ~' x* Y L 8 h; r3 q( u: J6 q8 C# w8 n. _+ Y
1.插件语法 $ [6 u' ]; S. \$ ]4 m7 H* @& `
①定义插件 ) a8 a+ \: u7 i3 u' o. j A
```js) E6 X ?( Y: H% A6 @9 B6 Q$ B' b
const plugins={
3 X+ h7 [/ U9 A n+ t0 a; S0 j // 这里install其实是一个属性
; W3 c1 f1 @9 y; w% x1 _- j install(vue,x,y,z){1 [, F! h& n2 F% J
....
; I8 g+ w5 V3 R7 ?2 a }! t; D" {5 D% J, D1 k
}
0 A1 R$ V+ l) ]" \# ]7 Cexport plugins
7 Q: P$ E4 w/ D0 L) F, g```) f* R8 Y3 p! g4 J+ I6 k4 Z6 E
, _/ Z: R0 c% a; \7 v0 l②引入插件并使用 4 Y- r, W u: Z( O0 {5 K
import ... from ....4 U% v( O9 v3 a4 K, o
Vue.use(...,参数1,参数2....)$ `, h u1 L# s3 o7 [. W5 M6 T3 c
, g. H- g( Z, ^" O3 B/ R
2.上手插件
1 F) b) ]+ `7 V; C8 H' a) d: B自定义插件一般放在plugins目录下,网络上也有许多大牛定义的插件,只需引入使用即可;接下来带大家自定义一个插件,并导入Vue项目进行使用。0 D: w6 ]9 H" F: w* ]$ M
+ M3 J0 A9 x p$ Splugins.js
* y2 {7 r5 X/ F2 y
L, t! }1 X7 U3 l) g( nconst plugins={
7 F+ G( u5 _% n1 p O! ] Z- R install(Vue,x=0,y=0,z=0){
) M3 t. h) ^, W9 T1 h% p" L* H console.log(x,y,z)5 r$ R5 p' {) y$ u
//全局过滤器
: k; z6 b- z" h1 Q' ?* r // 使用到这个过滤器的地方将会只显示列表中的前四个元素
! [* i$ ?: J- J% A* U Vue.filter('mySlice',function(value){
9 V. R2 s8 N* I" y3 j* h return value.slice(0,4)
- q& m/ V3 f4 d! n5 h# N1 j })
7 y/ ^! F/ ]7 k. h8 o //定义全局指令# M3 \- Z g) y, `6 x) h
Vue.directive('fbind',{
6 \& I9 a K- p' X1 G+ U3 L" X& @ //指令与元素成功绑定时(一上来)
) d/ M) r- ] U! h- A; b, j bind(element,binding){- J$ |. N+ c' A
element.value = binding.value. W1 n+ X+ `( D. L0 v$ T7 Y% n
},
" i! ?, t1 c- v. L: U! L //指令所在元素被插入页面时6 Z% }* e9 E! F+ `' A
inserted(element){
: @: _3 y5 ]; c* G5 B. o. Z element.focus(). f7 T/ x0 ]4 } v4 ^- [! H
},. [, s9 K" J0 j6 @8 h
//指令所在的模板被重新解析时6 ^5 u$ b. S+ Q9 y2 m+ P
update(element,binding){% s1 Q3 w* U$ O1 X
element.value = binding.value
0 W8 L3 [3 T- L9 _; [+ a }
! M5 v, G" g2 ]3 A2 s })
& f$ @$ r: C# C( \0 S0 } //定义混入
) H J* }9 B2 B2 C Vue.mixin({
2 Q6 t7 ~' ?- a data() {0 {8 x) z- {4 J1 d2 w
return {
. c& F3 w4 p$ t x:100," N9 X N1 z W% y
y:200
$ i _6 q8 L. M# W }$ S! ~- H: `. W' w5 s0 S5 { K
},6 o# _) s; E& v. |: ]- C1 @7 \9 z t
})
+ K8 }8 p) K$ E/ M" F2 ^ //给Vue原型上添加一个方法(vm和vc就都能用了)4 Z) ^) P6 U" Y! @
Vue.prototype.Hello = ()=>{alert('你好啊')}
D. \2 H h- X1 y }' ]2 j1 P8 l8 ~# A. E0 z7 C D
}. \( U% K8 T7 u; J* P8 S. @2 p
//暴露出去; @ z) |2 G4 @; f
export default plugins- ^1 Y/ y; l J3 q' C
8 t9 {& B ^9 O9 K! ]/ ]引入并使用插件
) f, ?0 J8 B# T6 z2 G/ |: h0 q main.js/ `( q+ c9 f# w# b4 q4 F7 e4 M" o. H
( C/ a% Y+ T8 f; T
import App from "./App.vue"
- z8 r) ^: E8 \0 \import Vue from "vue"
8 C- X% r9 u( U//导入插件9 |5 F7 L7 T/ B2 ]& D- E
import plugins from "./plugins", C8 Y+ |. X; w/ H
//注册插件8 {: g0 q9 H/ W
Vue.use(plugins)
# Y( {! x( ]" |new Vue({" O; P6 [6 ^. Q! D+ P
el:"#App",
0 C J e% Z" o render:h=>h(App)( u, t! _$ c \( s/ u
})2 Z) q2 ~! D5 w* O& k$ k
, `& j% \* x* q: P
使用插件中的自定义指令
- H/ p" T/ C! v& y0 [ 6 j7 K! p. O! k8 A
+ C! h# K* w8 B) l) K" n
姓名:{{name}}
. |7 ]% C% d' w8 A( Y; a! `6 M 年龄:{{age}}! S9 N; O; l' I/ B$ B9 {/ S) p
<i>
! v6 ^& R* w* I: L ( O3 b( G! Y/ g1 n5 v. {+ L
" C. m6 E4 E. a8 ^, I0 }7 f
6 R# @8 F; y! k L0 Q
- O Y9 N* _+ P9 A0 q0 X" k7 L$ R
W' v$ H* b; u, h0 _6 d五、样式混合问题
0 \4 P8 S2 d/ q7 d描述:不同组件中如果使用相同的class,会导致出现样式覆盖的问题,覆盖规则是父组件覆盖子组件子组件根据导入顺序,新的覆盖旧的。可以使用不同的类名进行区分解决问题,也可以使用scoped属性,对style属性我们还可以使用lang进行指定,我们是用Less还是用css
T/ w; P- f5 V7 w( K 原理:scoped会根据经纬度、时间、使用电脑型号等生成一个唯一id,然后将这个id插入到对应的标签内* L# ^& S( U$ r) D, U
再将相应的样式转换为标签属性选择器,进行样式语言的限定。默认选择css样式语言" ?5 K' _) c8 ?0 R, @
& d: j5 j) u3 \8 o; {* g2 R+ Y1 {6 h
.demo{
4 C: S" Q: l g1 g1 q4 } background-color: red; \2 f7 x S+ s( R. i7 K
}
" A% L* e# }5 N3 I
( w. o) g& D3 a1 { n3 s) o
+ L9 b1 R: L2 w至此这几种属性或者使用语法就介绍完了,大家有啥疑问或者好的想法欢迎评论区留言。& I) D+ L, d/ ^: `3 ^) X. b' E7 h
& {6 e3 e. U' _: L
|
|