工作日记(十二):完整项目开发之完美解决测试时vue跨域与mounted不执行问题

2020.7.22

今日继续开发前端。

顺便一提,前端用的vue框架是:

vue-element-admin(elementUI)

今日前端需要与后端进行测试了(还不算正式联调,只在本地测试),因此解决了前后端分离时vue与本地项目端口不一致导致跨域无法访问的问题,具体如下:

一、完美解决测试时vue跨域问题(亲测可用):

1.修改vue.config.js文件

将【项目/vue.config.js】文件中的devServer标签的内容改为:

devServer:{
  port: port,
  open: true,
  overlay: {
    warnings: false,
    errors: true
  },
  //配置代理
  proxy: {
    "/": {
          target: "http://127.0.0.1:8089", //本地后台路径
          changeOrigin: true
    }
  }

},

2.修改.env.development文件

将【项目/.env.development】文件中的VUE_APP_BASE_API改为:

#VUE_APP_BASE_API = 'dev-api'
VUE_APP_BASE_API = 'http://127.0.0.1:8089'

3.修改article.js文件

(1)在【项目/src/api/article.js】文件中新增测试用的模板请求方法,例如:

export function getListPost(query){
  return request({
    url: 'http://127.0.0.1:8089/list',
    method: 'post',
    data: query
  })
}

*注意,这个方法是【post】方法,使用【data】字段,发送的是json格式的数据(似乎被封装好了,自带contentType,大概)

(2)如果要用键值对的形式传参,可以这样写:

export function getListGet(query){
  return request({
    url: 'http://127.0.0.1:8089/list',
    method: 'get',
    params: query
  })
}

*注意,这个方法是【get】方法,使用【params】字段,发送的是正常的键值对格式的数据。

4.在后台Controller.java类上加注解@CrossOrigin

这个注解可以加在整个类上,相应的其中的方法就都支持跨域了。(注意不要提交svn,只是自测用的,生产上不用这个注解,应该)

5.开始测试

在前端使用刚才写好的getListPost(getListGet)方法,即可获取到本地启动的不同端口的后端数据了。

二、使用dialog显示其它页面时mounted只执行一次的问题

本人想实现一个效果,在第一个页面使用el-dialog展示第二个页面;当第二个页面出现时,便自动执行某个方法;

于是在第二个页面的mounted标签中写了需要自动执行的方法;

但是出现了mounted方法只执行一次的问题,只有首次dialog出现时执行一次,之后关闭并重新打卡dialog,mounted方法都不执行了;

这不符合需求。

因此通过百度发现,第一个页面的dialog标签外需要再嵌套一个div才可以,如下:

<div v-if="isShowDialog">
  <el-dialog :visible.sync="isShowDialog" append-to-body>
    <mypage @close="myfunction" />
  </el-dialog>
</div>

三、其余vue问题与解决办法

1.如果希望el-input标签变为只读模式(不能写,但是可以复制),可以用这段代码:

<el-input v-model="this.id" readOnly></el-input>

只要在标签内直接加【readOnly】就可以了,不需要在data中声明相应的变量。

2.有一个需求,要完成数据的"编辑"页与"详情"页;因此本人将这两个页合并为一个页面.vue了;区别就是el-input是否有readOnly,以及加了一些【v-if】决定隐藏与展示的标签。

3.vue中冒号【:】的用法:

有些标签中有【label】字段,例如:

<el-form-item label="名称">
  <el-input v-model="this.name"></el-input>
</el-form-item>

此时页面中会出现"名称"的标签;

如果想让这个标签的名字按照变量内容显示,可以这样写:

<el-form-item  :label="this.name">
  <el-input v-model="this.name"></el-input>
</el-form-item>

增加了冒号,vue就会按照变量的值显示这个标签的名称,对应的变量如下:

data: function(){
  return{
    name: "abc"
  };
},

大概就在这个位置写变量(分号;与逗号,是否需要请根据实际情况测试,多了的话似乎会报错)。

不只是label,其它标签好像也可以使用【:】来实现标签内容从变量的值中获取;这应该就是vue的方便之处吧。

原文地址:https://www.cnblogs.com/codeToSuccess/p/13906198.html