目录
本案例需要下载axios库:npm install axios
1.配置类方式(实现WebMvcConfigurer)
2.使用@CrossOrigin注解
3.使用nginx反向代理解决跨域
4.Vue中配置代理服务器
代理服务器怎么开启?
1.ngnix 2.vue-cli
如何配置代理服务器?
方法一:
在vue.config.js中添加如下配置:
- devServer:{
-
- proxy:"http://localhost:5000"
重启脚手架开启代理
说明:
1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)
方法二:
编写vue.config.js配置具体代理规则:
- 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
- */
说明:
1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
2. 缺点:配置略微繁琐,请求资源时必须加前缀。
vue.config.js
- module.exports = {
- pages: {
- index: {
- //入口
- entry: 'src/main.js',
- },
- },
- lintOnSave:false, //关闭语法检查
- //开启代理服务器(方式一)
- /* devServer: {
- proxy: 'http://localhost:5000'
- }, */
- //开启代理服务器(方式二)
- devServer: {
- proxy: {
- '/atguigu': {
- target: 'http://localhost:5000',
- pathRewrite:{'^/atguigu':''}, // 正则匹配/atguigu变为空字符串,这样真正请求5000的就是/student
- // ws: true, //用于支持websocket
- // changeOrigin: true //用于控制请求头中的host值
- },
- '/demo': {
- target: 'http://localhost:5001',
- pathRewrite:{'^/demo':''},
- // ws: true, //用于支持websocket
- // changeOrigin: true //用于控制请求头中的host值
- }
- }
- }
- }
作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于父组件 ===> 子组件。
现在修改需求如下:
普通解决方案:
正确解决方案:
图片写在App的category标签体中
此时vue并不知道这个img放在template的哪个位置,所以此时需要用到solt插槽。
效果:
Category.vue
- <template>
- <div class="category">
- <h3>{{title}}分类h3>
-
- <slot>我是一些默认值,当使用者没有传递具体结构时,我会出现slot>
- div>
- template>
-
- <script>
- export default {
- name:'Category',
- props:['title']
- }
- script>
-
- <style scoped>
- .category{
- background-color: skyblue;
- width: 200px;
- height: 300px;
- }
- h3{
- text-align: center;
- background-color: orange;
- }
- video{
- width: 100%;
- }
- img{
- width: 100%;
- }
- style>
App.vue
- <template>
- <div class="container">
- <Category title="美食" >
- <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">
- Category>
-
- <Category title="游戏" >
- <ul>
- <li v-for="(g,index) in games" :key="index">{{g}}li>
- ul>
- Category>
-
- <Category title="电影">
- <video controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4">video>
- Category>
- div>
- template>
-
- <script>
- import Category from './components/Category'
- export default {
- name:'App',
- components:{Category},
- data() {
- return {
- foods:['火锅','烧烤','小龙虾','牛排'],
- games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
- films:['《教父》','《拆弹专家》','《你好,李焕英》','《尚硅谷》']
- }
- },
- }
- script>
-
- <style scoped>
- .container{
- display: flex;
- justify-content: space-around;
- }
- style>
父组件中:
<Category> <div>html结构1div> Category>子组件中:
<template> <div> <slot>插槽默认内容...slot> div> template>
出现多个插槽时。需要给每个插槽命名。
需求如下:红色框一个插槽,蓝色框一个插槽
此时需要给红色框和蓝色框的元素标签添加solt属性:
注意如果使用template标签,则写成v-slot
Catrgory.vue
- <template>
- <div class="category">
- <h3>{{title}}分类h3>
-
- <slot name="center">我是一些默认值,当使用者没有传递具体结构时,我会出现1slot>
- <slot name="footer">我是一些默认值,当使用者没有传递具体结构时,我会出现2slot>
- div>
- template>
-
- <script>
- export default {
- name:'Category',
- props:['title']
- }
- script>
-
- <style scoped>
- .category{
- background-color: skyblue;
- width: 200px;
- height: 300px;
- }
- h3{
- text-align: center;
- background-color: orange;
- }
- video{
- width: 100%;
- }
- img{
- width: 100%;
- }
- style>
App.vue
- <template>
- <div class="container">
- <Category title="美食" >
- <img slot="center" src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">
- <a slot="footer" href="http://www.atguigu.com">更多美食a>
- Category>
-
- <Category title="游戏" >
- <ul slot="center">
- <li v-for="(g,index) in games" :key="index">{{g}}li>
- ul>
- <div class="foot" slot="footer">
- <a href="http://www.atguigu.com">单机游戏a>
- <a href="http://www.atguigu.com">网络游戏a>
- div>
- Category>
-
- <Category title="电影">
- <video slot="center" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4">video>
- <template v-slot:footer>
- <div class="foot">
- <a href="http://www.atguigu.com">经典a>
- <a href="http://www.atguigu.com">热门a>
- <a href="http://www.atguigu.com">推荐a>
- div>
- <h4>欢迎前来观影h4>
- template>
- Category>
- div>
- template>
-
- <script>
- import Category from './components/Category'
- export default {
- name:'App',
- components:{Category},
- data() {
- return {
- foods:['火锅','烧烤','小龙虾','牛排'],
- games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
- films:['《教父》','《拆弹专家》','《你好,李焕英》','《尚硅谷》']
- }
- },
- }
- script>
-
- <style scoped>
- .container,.foot{
- display: flex;
- justify-content: space-around;
- }
- h4{
- text-align: center;
- }
- style>
父组件中:
<Category> <template slot="center"> <div>html结构1div> template> <template v-slot:footer> <div>html结构2div> template> Category>子组件中:
<template> <div> <slot name="center">插槽默认内容...slot> <slot name="footer">插槽默认内容...slot> div> template>
理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
提出需求:
作用域插槽把Category里的games传给App
谁往插槽里塞结构,那这个games就传给了谁。那App里怎么接收到?要求就是得在要传入的结构的外侧包含template标签,并添加scope属性,其中这个scope属性的值就是所传过来的对象。
Category.vue
- <template>
- <div class="category">
- <h3>{{title}}分类h3>
- <slot :games="games" msg="hello">我是默认的一些内容slot>
- div>
- template>
-
- <script>
- export default {
- name:'Category',
- props:['title'],
- data() {
- return {
- games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
- }
- },
- }
- script>
-
- <style scoped>
- .category{
- background-color: skyblue;
- width: 200px;
- height: 300px;
- }
- h3{
- text-align: center;
- background-color: orange;
- }
- video{
- width: 100%;
- }
- img{
- width: 100%;
- }
- style>
App.vue
- <template>
- <div class="container">
-
- <Category title="游戏">
- <template scope="atguigu">
- <ul>
- <li v-for="(g,index) in atguigu.games" :key="index">{{g}}li>
- ul>
- template>
- Category>
-
- <Category title="游戏">
- <template scope="{games}">
- <ol>
- <li style="color:red" v-for="(g,index) in games" :key="index">{{g}}li>
- ol>
- template>
- Category>
-
- <Category title="游戏">
- <template slot-scope="{games}">
- <h4 v-for="(g,index) in games" :key="index">{{g}}h4>
- template>
- Category>
-
- div>
- template>
-
- <script>
- import Category from './components/Category'
- export default {
- name:'App',
- components:{Category},
- }
- script>
-
- <style scoped>
- .container,.foot{
- display: flex;
- justify-content: space-around;
- }
- h4{
- text-align: center;
- }
- style>
父组件:
<Category> <template scope="scopeData"> <ul> <li v-for="g in scopeData.games" :key="g">{{g}}li> ul> template> Category> <Category> <template slot-scope="scopeData"> <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>