vue_cli 安装卸载等

卸载旧版本

 npm uninstall vue-cli -g

查看vue_cli版本号

vue --version
或
vue -V

vue cli 的包名称由 vue-cli 改成了 @vue/cli。 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vue-cli -g 或 yarn global remove vue-cli 卸载它。

npm install -g @vue/cli

创建项目

vue create vue-webpack-demo

启动项目

npm run serve

webpack相关配置

https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F 默认vue-cli3没有配置文件,在根目录下新建一个 vue.config.js

遇到的问题 打包后 文件为空 js css 加载路径不正确 解决方法

vue.config.js

module.exports = {
    baseUrl: './',//输出的根路径  默认是/ 如果你的网站是app.com/vue 这更改此配置项
    /*outputDir:'dist',//构建输出目录
    assetsDir:'assets',//静态资源目录(js,css,img,fonts)
    lintOnSave:false,//是否开启eslint保存检测,有效值: true || false || 'error'
    devServer:{
        open:true,//是否自动弹出
        host:'localhost',
        port:8080,//端口
        https:false,
        hotOnly:false,//热更新
    }*/
}

vue-cli3设置文件夹别名 + 配置jquery为全局

const webpack = require('webpack');

const path = require('path');
function resolve(dir) {
  return path.join(__dirname, dir)
}

module.exports = {
    "publicPath": './',//输出的根路径  默认是/ 如果你的网站是app.com/vue 这更改此配置项
    /*outputDir:'dist',//构建输出目录
    assetsDir:'assets',//静态资源目录(js,css,img,fonts)
    lintOnSave:false,//是否开启eslint保存检测,有效值: true || false || 'error'
    devServer:{
        open:true,//是否自动弹出
        host:'localhost',
        port:8080,//端口
        https:false,
        hotOnly:false,//热更新
    }*/
    configureWebpack: {
      plugins: [
        new webpack.ProvidePlugin({
          $:"jquery",
          jQuery:"jquery",
          "windows.jQuery":"jquery"
        })
      ]
    },
    /*chainWebpack: config => {
        config.resolve.alias
            .set('@', resolve('src'))
            .set('assets', resolve('src/assets'));
    },*/
    chainWebpack: (config) => {
        config.resolve.alias
            .set('@$', resolve('src'))
            .set('components',resolve('src/components'))
            .set('common',resolve('src/common'))
            .set('base',resolve('src/base'))
            .set('static',resolve('src/static'))
    }
}

配置好后 在测试的时候 用console.log 报错error: Unexpected console statement (no-console)

解决办法 https://www.jianshu.com/p/bfc7e7329cff 关闭eslint 在package.json中添加设置 "no-console": "off"(json中部可以有注释 否则编译不通过)

  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {
      "no-console": "off"
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },

安装sass/scss(是sass的升级版本)

npm install node-sass --save-dev //安装node-sass 
npm install sass-loader --save-dev //安装sass-loade

初始化git本地项目并推送到远程

1 远程建立仓库 readme为空 并复制地址
2 进入项目目录

// 初始化
git init
// 关联地址
git remote add origin git@github.com:XXXX/XXXXX.git
// 重新设置地址
git remote set-url origin https://gitee.com/name/project.git 

//
git add .
git commit -m "msg"
// 首次推送到远程仓库 必须指明推送的分支
git push --set-upstream origin master

当路由开启history模式 vue-router 配置404报错 如果只配置一级路由的404 不会报错 如果输入二级路由 浏览器就会报错

https://forum.vuejs.org/t/uncaught-syntaxerror-unexpected-token/32862 开始history模式 需要后端配合

刷新页面出现空白 估计是后端路由识别不了 譬如https://www.youproject.com/main/1 刷新时后端没找到这个路径,配置一下后端 找不到的时候重定向到入口的index.html 前端路由就能正常使用了

参考官方文档https://router.vuejs.org/zh-cn/essentials/history-mode.html

vue-cli3 中在index.html中引入js css文件方法

把所有css js文件放入public文件夹下 引入方式

    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <script src='<%= BASE_URL %>selection.js'></script>

vue-cli3中如何引入bootstrap和jquery (也可以一次性安装 npm install jquery bootstrap@3 popper.js --save)

1 安装jQuery

bootstrap是基于jQuery的,在使用之前我们先安装一下jQuery包 又因为jquery以来popper.js,所以在安装jquery之前先安装popper

npm install popper.js --save
npm install jquery -S

然后在main.js中引入jquery作为全局变量

import $ from 'jquery'
/*
*Vue-CLI项目的核心配置文件
*/
const webpack = require("webpack");

module.exports = {
 configureWebpack: {
   plugins: [
     new webpack.ProvidePlugin({
       $: "jquery",
       jQuery: "jquery",
       "window.jQuery": "jquery",
       Popper: ["popper.js", "default"]
     })
   ]
 }
};

2 安装bootstrap

接下来我们安装bootstrap依赖,这里的@3是安装bootstrap3.x版本,不喜欢这个版本的小伙伴也可以安装最新版。

npm install bootstrap@4 -S

在main.js中导入bootstrap

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 导入bootstrap
import "bootstrap"
import "bootstrap/dist/css/bootstrap.css"


Vue.config.productionTip = false

new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')

解决vue-cli3打包代码后,上线服务器后白屏问题及路由跳转错误问题

路由模式为mode: 'history', 打包后路由 /helloworld 变为http://localhost:3000/helloworld 如果直接从D盘打开 会出现路径错误。所以,如果用history模式,必须要配合服务器设置。否则,就不要用history模式。

vue-router对mode的说明:
mode

类型: string

默认值: "hash" (浏览器环境) | "abstract" (Node.js 环境)

可选值: "hash" | "history" | "abstract"

配置路由模式:

hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。

history: 依赖 HTML5 History API 和服务器配置。附上链接查看 HTML5 History 模式配置.

abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式。

解决办法
终于弄明白了,如果使用history模式上线,必须要服务端在服务器上有对应的模式才能使用history(看上面链接),如果服务器上没有配置,可以先使用默认的hash;
当然个人建议还是使用history模式,因为这样链接看起来要美观些

在vue-cli中使用vuex

 import store from '@/store/index'

 // 获取state的某个属性
 store.getters.token

 // 调用actions中的方法
 store.dispatch('setToken', 'abc');

解决点击相同路由地址报错的问题

vue-router.esm.js?8c4f:2007 Uncaught (in promise) NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}

解决方方法 在定义router的时候 增加一段

import Router from 'vue-router'

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

axios跨域问题

Vue使用Axios实现http请求以及解决跨域问题 https://www.jianshu.com/p/0fbaf45340e4

请问我用vue做的分页,点击当前页跳转路由,然后返回如何记住当前页?

https://segmentfault.com/q/1010000010215881

<keep-alive>
  <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
然后在路由上,需要keep-alive的地方加一个
meta: {
keepAlive: true
}

路由变化页面数据不刷新问题

https://www.jianshu.com/p/a0ee62659201

 watch: {
// 方法1      
'$route'(to, from) { //监听路由是否变化        
   if(this.$route.params.articleId){// 判断条件1  判断传递值的变化         
//获取文章数据
    }
 }      
//方法2     
'$route'(to, from) {        
  if(to.path == "/page") {    /// 判断条件2  监听路由名 监听你从什么路由跳转过来的           
    this.message = this.$route.query.msg     
   }
 }      
}

监听路由变化后出现执行2次的情况

原因在于 在路由上添加了keep-alive 需要用排除或添加的方法 把不需要路由缓存的地方 排除掉 https://www.jianshu.com/p/4b55d312d297

vue项目安装汇总

// jquery
npm install popper.js --save
npm install jquery --save

// vue-router
npm install vue-router --save

// vue-x
npm install vuex --save

// 安装sass
npm install sass-loader --save-dev 
npm install node-sass --save-dev

vue2修改浏览器显示title

一、配置路由器的时候添加如下项 meta

routes: [
    {
      path: '/',
      name: 'login',
      component: Login,
      meta: {
        title: '登录'
      }
    },
    {
      path: '/home',
      name: 'home',
      component: Home,
      meta: {
        title: '首页'
      }
    }
  ]  

二、在main.js中写全局路由钩子 // 路由钩子

router.beforeEach((to, from, next) => {
  if (to.meta.title) {
    document.title = to.meta.title
  }
  next()
})

使用vue+typescript构建项目,引入weixin-js-sdk后,不能用里面的方法?

1 安装

1、npm install --save-dev weixin-js-sdk

2、import wx from 'weixin-js-sdk';

2 console.log(wx) 值为undefined 解决

const wx = window['wx']

内网穿透访问Vue项目的时候出现Invalid Host header解决办法

vue-cli3中:

// vue.config.js文件中
module.exports = {
  devServer: {
    disableHostCheck: true
  }
}

swiper刷新页面异常

在Swiper的配置项里加上这2个就可以
observer: true,
observeParents: true,

我也是参考别人的,但大家都是转载来转载去,出处不详了 = = 具体可以看下这2个api的官方文档

每次用axios发送请求 就失败,但是用ajax发送 就成功

原因 https://www.cnblogs.com/yiyi17/p/9409249.html axios发送请求 默认会把参数转成json的格式,ajax就以fomdata的形式发的 解决办法
网上有很多方案说使用 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 或者 {headers:{'Content-Type':'application/x-www-form-urlencoded'}} 我试了一下,其实这样还是不行的 【还需要额外的操作,(我们要将参数转换为query参数)】 引入 qs ,这个库是 axios 里面包含的,不需要再下载了。

import Qs from 'qs'
let data = {
    "username": "admin",
    "pwd": "admin"
}

axios({
    headers: {
        'deviceCode': 'A95ZEF1-47B5-AC90BF3'
    },
    method: 'post',
    url: '/api/lockServer/search',
    data: Qs.stringify(data)
})

vue-axios中post和get携带参数和token

this.$axios({
    method:'GET',
    url:`/scihua/webapp/designs/delete?id=${id}`,        //利用了字符串模板来携带id
    headers:{
            'token':window.localStorage.getItem('token')    //由于是多页面应用所以token存储在本地localStorage中
        }
},

).then(res=>{
    console.log(res)
    this.inlist()
}).catch(req=>{
    console.log(req)
})

vue axios拦截器 配合elementUI loading 讲解 很详细

https://www.cnblogs.com/zhoulifeng/p/9858605.html

Vue项目中实现用户登录及token验证

https://www.cnblogs.com/web-record/p/9876916.html

前后端分离的,不可避免的就产生了跨域问题,导致Authorization始终无法添加到请求头中去

https://blog.csdn.net/why15732625998/article/details/79348718

设置headers 报错Request header field Content-Type is not allowed by Access-Control-Allow-Headers

我要自定义一些参数放在headers里面,试了好多方法都不行 比如:http://ask.dcloud.net.cn/question/8596这里的很多个方式 http://ask.dcloud.net.cn/article/13026的方式 后来比较明确的报错Request header field “我自定义的key” is not allowed by Access-Control-Allow-Headers in preflight response. 又去搜了一下找到https://www.cnblogs.com/caimuqing/p/6733405.html,结果发现是后端需要把要传到后端的headers里面的key加入到response

// TODO 支持跨域访问  
        response.setHeader("Access-Control-Allow-Origin", "*");  
        response.setHeader("Access-Control-Allow-Credentials", "true");  
        response.setHeader("Access-Control-Allow-Methods", "*");  
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");//这里“Access-Token”是我要传到后台的内容key  
        response.setHeader("Access-Control-Expose-Headers", "*");  

        if (request.getMethod().equals("OPTIONS")) {  
            HttpUtil.setResponse(response, HttpStatus.OK.value(), null);  
            return;  
        }

localStorage - 本地存储(添加、读取、修改、删除、JSON格式存储)

https://blog.csdn.net/Janus_lian/article/details/83412964

window.localStorage.setItem('a','123456')
//存入的是number类型,实际存储在localStorage的是string类型,因为localStorage只支持string类型存储


window.localStorage.getItem("a");
console.log(typeof(window.localStorage.getItem("a"))); //String

window.localStorage.setItem('a','新的值')

//清除所有localStorage
window.localStorage.clear();
 
//清除某个键值对
window.localStorage.removeItem("a");

let storage = window.localStorage;
for(let i = 0 ; i < storage.length; i++){
    console.log(storage.key(i));
}


//json格式存取

// 存储 json -》 字符串
var storage=window.localStorage;
var data={
    name:'tom',
    hobby:'program'
};
var nameData = JSON.stringify(data);
storage.setItem("nameData",nameData);

// 读取 string -> json
let getNameData = window.localStorage.getItem("nameData");
console.log(typeof(getNameData)); //sting类型
let getNameDataJSON = JSON.parse(getNameData);
console.log(typeof(getNameDataJSON));  //object类型

 

vue打包的时候报错

Vue-cli3 WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB) https://www.cnblogs.com/tonnytong/p/10764454.html

vue main.js设置全局变量

https://www.cnblogs.com/kewenxin/p/8619240.html

理解 vue-router的beforeEach无限循环的问题

调用 next()方法才能进入下一个路由,否则的如果写了beforeEach方法,但是没有调用next()方法的话,页面会空白,不会跳转到任何页面的。 如果已经手动跳转页面,就无需调用next了 否则 就出现重复刷新页面的问题 https://www.cnblogs.com/tugenhua0707/p/10125535.html