聊聊vue踩的那些坑

7/30/2019 vue

【项目进行中,没写完】

# 项目基本情况

项目是一个业务经理的服务网站,运行于微信平台内。项目主要实现经理查看和添加业务的功能。

项目采用 vue-cli v3.9.3 初始化环境,使用 vm 方式做移动端适配,使用 axios 来做前后交互。

# 踩到的那些坑

# 1. axios跨域

在开发环境可以配置vue-cli的 devServer.proxy(官方文档点这儿) (opens new window) 实现跨域。

我看过不少博主写的解决方案,其中提到的 proxyTable 配置在vue-cli新版本构建出的项目里已经不可用了。

现在是在vue.config.js中配置devServer的proxy:

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {                                     // 将www.xxx.com映射为/apis
        target: 'http://xxx.com/user', // 接口域名
        // secure: false,                    // 如果是https接口,需要配置这个参数
        changeOrigin: true,              // 是否跨域
        ws: true,
        pathRewrite: {
          '^/api': ''                            // 需要rewrite的,
        }
     }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

在接口配置中就这么用:

/**
 * 经理信息
 * @param data
 */
export function fetchManagerInfo(data) {
  return request({
    url: '/api/manager/index',       //  会被映射为 http://xxx.com/user/manager/index
    methods: 'post',
    params: data
  });
}
1
2
3
4
5
6
7
8
9
10
11

在调试工具中看到的请求的地址会类似 http://localhost:8080/api/manager/index,不要怀疑,这就是代理(proxy)。

需要注意的是:仅开发环境可用。

# 2. 移动端的vm适配方式

vm 是什么就不需要介绍了吧,只说说怎么做。

首先安装 postcss-px-to-viewport 插件

$ yarn add postcss-px-to-viewport
1

在项目根目录的 postcss.config.js 中配置:

// postcss.config.js
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      viewportWidth: 750, // 视窗的宽度,对应的是我们设计稿的宽度,一般是750
      viewportHeight: 1206, // 视窗的高度,根据750设备的宽度来指定,一般指定1334,也可以不配置
      unitPrecision: 3, // 指定`px`转换为视窗单位值的小数位数(很多时候无法整除)
      viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用vw
      selectorBlackList: ['.ignore', '.hairlines'], // 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名
      minPixelValue: 1, // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值
      mediaQuery: false, // 允许在媒体查询中转换`px`
    },
  },
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14

配置之后,在项目中到的所有 px 单位都为自动转换为 vm

image.png

然后在项目中就放心大胆地按照设计图来使用px吧。

# 3. vue-router的 queryparams 传参的区别

  1. query传参

通过 path 参数切换路由,

<router-link :to="{path: '/detail', query: { id: 1 }}">前往detail页面</router-link>
1

参数的展现形式是直接在地址中添加,类似 /detail?name=hello&password=hello, 在页面内通过 this.$route.query 接受参数,刷新依然可以获取数据。

  const id = this.$route.query.id;
1
  1. params 传参

通过路由的 name 属性切换路由

<router-link :to="{name: 'Detail', params: { id: 1 }}">前往detail页面</router-link>
1

需要在路由中设置参数,这样通过 this.$route.params 接受参数,并且允许用户刷新页面。

{      
    path: '/detail/:id',      
    name: 'Detail',      
    component: Detail    
},
1
2
3
4
5

感谢掘金社区的 @愣锤 的文章 (opens new window)

Last Updated: 10/23/2021, 4:31:30 PM