1.prop配置项
prop配置于子组件中,用于获取父组件传给他的属性。prop得到的属性是只读的,如果需要对其进行修改可以把他加到data中再进行操作;
运用prop配置项,除了可以实现父传子数据,也可以实现子传父数据,实现方法就是通过prop向子组件发送一个get函数,子组件在触发这个get函数时,父组件就可以拿到数组;
因此为什么说prop的属性是只读的,它本质上还是父组件的东西,子组件不可以去修改;
2.mixins配置项
可以获取外部的js混合入当前的vc中。记得import
3.插件plugin
需要有install()方法,该方法的参数是Vue,其中可以配置Vue原型属性,也可以写很多全局方法。
如何调用?
plugin.js中export,随后在vc或vm中调用时先import然后写Vue.use(plugin)。
4.mixin和prop的区别:
mixin混入的是Vue的一些配置,prop则是给vm或者vc加上一些属性。
5.scoped:
让样式在局部生效,防止冲突。写法:<style scoped>;
6.自定义事件:
区分js内置事件,内置事件是给HTML元素用的,自定义事件是给组件用的;
在给组件标签写js原生事件时需要加上.native,否则vue会误认为是自定义事件
6.1 自定义事件如何定义和调用?
第一种方法:
在父组件中定义触发自定义事件时候执行的函数
注意:...params这种写法是指传入多个参数,这些参数将会被打包成一个数组
随后在父组件的子组件标签中绑定自定义事件即配置成功
然后在子组件中编写触发的函数,函数调用后即可触发自定义事件
第二种方法:
通过ref,在子组件的组件标签中加入ref属性,可以使得父组件拿得到该组件标签的实例对象,然后给这个实例对象配置自定义事件;
7.全局事件总线
全局事件总线用于任意组件间的通信,它能实现在组件A绑定事件后其他组件可以随心所欲地调用该事件并且把数据传给组件A;
如何配置和使用?
首先在main.js中安装全局事件总线,$bus就是当前应用的vm;
然后如果组件A想要获得数据,只需要在他的代码中绑定事件即可,这其中‘hello’是事件名称,后边是回调函数;
其他组件要给组件A发送数据,需要触发该事件;
最好在beforeDestory钩子中用 $off去解绑当前组件所用到的事件。
8.消息订阅与发布
消息订阅与发布可以运用于任意组件间的通信,需要数据的组件订阅消息,提供数据的组件发布消息,他与全局事件总线功能相似,但是更加地具有可读性和便捷,只需要安装pubsub,然后引用即可,pubsub会将事件订阅与发布封装起来。
如何配置和调用?
首先安装
```npm i pubsub-js```
然后引入
随后订阅和发布即可,subcribe的回调函数会拿到两个参数,fName是订阅的名称,data才是数据;
这里的pubId指的是该订阅,pubsub会给每一个订阅提供一个id,当需要解绑该订阅时需要使用他
9.nextTick
nextTick可以在DOM元素更新之后执行回调函数,也就是说,当我们需要让更新后的DOM元素执行什么操作时就可以使用nextTick指定回调函数;
以上代码就是说当DOM更新之后再执行nextTick中的回调函数;
10.代理服务器解决跨域问题
通过在前端配置代理服务器,使得前端在向后端5000端口请求数据时变成向8080代理服务器请求数据,从而满足同源策略,解决跨域问题;(因为前端也是8080,属于同域)
如何配置代理服务器?
1. 在vue.config.js中添加如下配置:
devServer:{
proxy:"http://localhost:5000"
}
-
优点:配置简单,请求资源时直接发给前端(8080)即可。
-
缺点:不能配置多个代理(只能给一个服务器进行代理),不能灵活的控制请求是否走代理。
-
工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)
2. 编写vue.config.js配置具体代理规则:
注意:代理服务器转发请求到5000端口时也会加上/api
就是说如果我们要请求localhost:5000/students,我们在代理服务器上配置/school这个api来指示代理服务器转发请求到5000,这时候代理服务器转发的请求其实是 localhost:5000/school/students;
解决方法:配置pathRewrite属性: 下面图片的意思是匹配所有的atguigu,换成空。
module.exports = {
devServer: {
proxy: {
'/api1': {// 匹配所有以 '/api1'开头的请求路径
target: 'http://localhost:5000',// 代理目标的基础路径
changeOrigin: true,
pathRewrite: {'^/api1': ''}
},
'/api2': {// 匹配所有以 '/api2'开头的请求路径
target: 'http://localhost:5001',// 代理目标的基础路径
changeOrigin: true,
pathRewrite: {'^/api2': ''}
}
}
}
}
/*
changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080
changeOrigin默认值为true
*/
-
优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
-
缺点:配置略微繁琐,请求资源时必须加前缀。
11.扩展运算符
这个代码表示对比this.info和dataObj,二者取并集,并且相同的数据以dataObj为主。
12.插槽
插槽slot使得父组件可以传一段html结构给子组件,插入子组件的html结构中;
他可以分为默认插槽,具名插槽和作用域插槽;
默认插槽
父组件中:
<Category>
<div>html结构1</div>
</Category>
子组件中:
<template>
<div>
<!-- 定义插槽 -->
<slot>插槽默认内容...</slot>
</div>
</template>
具名插槽
父组件中:
<Category>
<template slot="center">
<div>html结构1</div>
</template>
<template v-slot:footer>
<div>html结构2</div>
</template>
</Category>
子组件中:
<template>
<div>
<!-- 定义插槽 -->
<slot name="center">插槽默认内容...</slot>
<slot name="footer">插槽默认内容...</slot>
</div>
</template>
作用域插槽
理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
就像prop一样,但是slot中写:games是子组件传给父组件供父组件使用插槽使用;
父组件记得使用scope或者slot-scope接收数据对象;
父组件中:
<Category>
<template scope="scopeData">
<!-- 生成的是ul列表 -->
<ul>
<li v-for="g in scopeData.games" :key="g">{{g}}</li>
</ul>
</template>
</Category>
<Category>
<template slot-scope="scopeData">
<!-- 生成的是h4标题 -->
<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
</template>
</Category>
子组件中:
<template>
<div>
<slot :games="games"></slot>
</div>
</template>
<script>
export default {
name:'Category',
props:['title'],
//数据在子组件自身
data() {
return {
games:['红色警戒','穿越火线','劲舞团','超级玛丽']
}
},
}
</script>