vue2全家桶(vue vuex vueRouter axios vee-validate element-ui)学习心(shen)得(keng)

一、直接引入`import vue from 'vue'` 报vue-warn错误

//如果直接使用import Vue from 'vue' 会对应引入dist/vue.runtime.common.js

// 因为package.json main对应dist/vue.runtime.common.js

解决办法是

`import vue from 'vue/dist/vue.runtime.common.js'`

或者webpack配置resolve

resolve:{

   alias:{

        'vue':'vue/dist/vue.js'

     }

}

2.webpack-dev-server热刷新失败

webpack-dev-server --progress  --colors --host 0.0.0.0 --port 8088 --content-base dist

module.exports={

....省略。。。

   devServer:{

   historyApiFallback:true,

   inline:true,

    hot:false //如果刷新不成功  就是用hot关掉

},

....省略。。。

}

以下为使用vue-cli中遇到的坑和解决办法

使用vue全家桶搭建项目 vue vuex vueRouter axios vee-validate

一 、eslint的使用

eslint配置技巧

这里只对vue-cli没有默认添加的部分规则配置进行说明,如下:

/**

* "off" 或 0 - 关闭规则

* "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出),

* "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

*/

在.eslintrc.js 文件的rules进行配置

"linebreak-style":0,//在 windows 操作系统中换行符通常是回车 (CR) 加换行分隔符 (LF),也就是回车换行(CRLF),然而在 Linux 和 Unix 中只使用简单的换行分隔符 (LF)。对应的控制字符为 "\n" (LF) 和 "\r\n"(CRLF)。

'indent':0//忽略缩进: 关闭tab和space造成的indent 缩进错误提示

1.出现Newline required at end of file but not found 即表示为每个js文件写完后 要多写一行的空白行

原因 eslint rules规则限制了:

/*eslint eol-last: ["error", "always"]*/

/*eslint eol-last: ["warn", "never"]*/

/*eslint eol-last:0*/关闭不限制即可

"always"(默认) 强制使用换行 (LF)

"never"强制文件末尾不要有换行符

2、出现

Missing space before value for key 'counter'

G:\fe\app\src\components\Hello.vue:29:15

counter:0,

原因是因为你的冒号:后面没有跟空格,这个限制书写的,还行就不要去掉了!

2、no-console  意思就是你不要写console在里面 不然就警告 

http://eslint.org/docs/rules/no-console          Unexpected console statement

G:\fe\app\src\components\Hello.vue:33:5

console.log(this.$store);

关闭方法还是:

no-console:0

3、space-before-blocks 表示括号和大括号之间要不要空间 默认就是必须要啊 这样看起来美观呀!

http://eslint.org/docs/rules/space-before-blocks  Missing space before opening brace

G:\fe\app\src\components\Hello.vue:32:12

mounted(){

^

关闭方法:

space-before-blocks:0

4、Absolute imports should come before relative imports出错(原因是相对import 在绝对的import之前 你需要把下面两行换一下就行了)

import router from './router';

import { sync } from 'vuex-router-sync';

使用eslint进行代码检查开发的过程中出现报错 如果您能够找到对应的错误可以进行修改,如果找不到只能使用一招就是禁用eslint

在代码前面加上

/* eslint-disable */

二、使用vee-validate的用法

1、使用v-validate=="'required|email'"/v-validate.initial="'required|email'" /data-rules="required|mobile" 报错问题

改为

v-model="regObj.createPW"  name="createPW" v-validate data-vv-rules="required|min:6"

v-model name v-validate data-vv-rules 都是必填项

2、在页面上使用fields.fields.name.dirty[clean/failed/passed/valid] 的时候需要加入前面的fields.fields.name

 eg:

fields.fields.createPW&&fields.fields.createPW.dirty

3、当使用了element-ui之后 还是强行加载了vee-validate 报出  The computed property "fields" is already defined in data.错误

原因是因为 element-ui  自带表单验证 已经把fields注入了

解决办法  在veeValidate配置的时候使用如下配置

const config={   

          fieldsBagName:'vee-fields',//默认为 fields

};

Vue.use(VeeValidate, config);

其实感觉还是直接 用element-ui的表单验证吧  要么 就直接写成原始的form表单 使用veevalidate

三、axios的使用

import axios from 'axios'

import VueAxios from 'vue-axios'

Vue.use(VueAxios,axios)   

这样就可以使用 this.axios.get[post,delete,put]()的方法了

但是遇到跨域请求的时候总是会出现莫名的问题!

1、出现不容许跨域问题

后端使用Access-control-allow-origin:* 或者指定你的跨域Referer

2、出现只会发送potions方法,不会发送具体的get/post

axios 发送请求时的数据默认是 JSON 格式的。这是导致用 axios POST 跨域出错的主要原因。

根据 CORS 的标准,当浏览器发送跨域请求时,如果请求不是GET或者特定POST(Content-Type只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain的一种)时,强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获知服务器端对跨源请求所支持 HTTP 方法。所以,使用 axios 直接发送 POST 的跨域请求,如果web后端对 OPTIONS 的响应有问题,就会报错。不过是先把 params 转换为字符串格式了,见末尾的官方用x-www-form-urlencoded格式的说明

import qs from 'qs';

import axios from 'axios';

let reqUrl ='http://xxx.com';

letreqParams = {name:'aaa'};

axios.post(url, qs.stringify({params: reqParams}),{

   headers:{

        'Content-Type': 'application/x-www-form-urlencoded'

    }

})

          .then(response=>{console.log(response);})



3.出现The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://127.0.0.1:8082' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

原因摘自MDN:

XMLHttpRequest。withCredentials属性是一个布尔值,指示是否跨站点访问控制请求应使用凭证如cookie,授权标头或TLS客户端证书。使用凭证设置对相同的站点请求没有影响。

此外,该标志还用于指示在响应中何时将忽略cookie。默认是假的。来自不同域的XMLHttpRequest不能为自己的域设置cookie值,除非在发出请求之前将凭据设置为true。第三方cookie将withCredentials设置为true仍将获得的荣誉同源策略,因此不能通过文件访问请求的脚本。cookie或响应头信息。

解决办法:

服务器端:add_header Access-Control-Allow-Credentia :true;

或者请求头:withCredentials:true

4.创建请求实力后 可以进行截断处理

//Add a request interceptor 请求截断

axios.interceptors.request.use(function(config){

//Do something before request is sent

returnconfig;

},function(error){

//Do something with request error

return Promise.reject(error);

});

//Add a response interceptor//返回截断

axios.interceptors.response.use(function(response){

//Do something with response data

returnresponse;

},function(error){

//Do something with response error

return Promise.reject(error);

});

var instance=axios.create(); //创建实力 的截断  

instance.interceptors.request.use(function(){/*...*/});

instance.interceptors.response.use(function(){/*...*/});

四、vue常见问题

1.对于数组对象修改,新增属性的 dom视图不能更新的情况

vm .someObject.b=2 不起作用的情况

全局使用Vue.set(vm.someObject,'b', 2)

组件使用this.$set(this.someObject,'b',2)

2.vue中数组的操作总结:

一、根据索引设置元素:

1、调用$set方法:

this.arr.$set(index, val);

2、调用splice方法:

this.arr.splice(index,1, val);

二、合并数组:

this.arr= this.arr.concat(anotherArr);

三、清空数组:

this.arr=[];

四、主要的数组方法:

1、变异方法(修改了原始数组),vue为触发视图更新,包装了以下变异方法:

push()pop()shift()unshift()splice()//无论何时,使用该方法删除元素时注意数组长度有变化,bug可能就是因为她sort()reverse()

2、非变异方法(不会修改原始数组而是返回一个新数组),如concat()、filter(),使用时直接用新数组替换旧数组,如上面的合并数组例子。

3.click事件作用于<a></a> 的问题

@click事件 先于href跳转触发,对于原生a标签跳转,部分网站出现

Error 400--Bad Request

From RFC 2068Hypertext Transfer Protocol -- HTTP/1.1:

10.4.1 400 Bad Request

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

解决办法就是 

基于HTML标准,可以在a标签内使用rel="noreferrer"来达到这一目的。

目前大部分基于Webkit的浏览器已经支持

提供跨浏览器支持的更好的办法是使用一个第三方的库noreferrer.js,它可以自动识别浏览器并选择最优方案。

补充

Opera并没有提供可以实现不发送referrer的方法,noreferrer.js的解决方案是利用google的url中转。在国内的网络环境下,你懂的。。。

可以自己搭建一个跳转的页面,或者用其他站点的url跳转接口。

或者使用js实现(如果是新窗口打开,可以使用如下代码:)

html:

<a @click.prevent="target($event)"></a>

method:

//

target(e){       

    this.open_new_window('http://www.miitbeian.gov.cn/state/outPortal/loginPortal.action')    

  },      

open_new_window(full_link){        

     window.open('javascript:window.name;', 'location.replace("'+full_link+'")<\/script>');

}

五、webpack2.0的配置问题

1.全局使用jquery

plugins: [

       new webpack.ProvidePlugin({

                 $:"jquery",

                jQuery:"jquery",

                "window.jQuery":"jquery"

       })

]

如何 只在webpack.base.conf.js里配置依然没用,就需要在webpack.dev.conf.js和webpack.prod.conf.js 里一起配置

2.修改vue-cli里发布版本的控制

首先vue-cli 已经很好的将我们写的代码进行懒加载设置和chunk处理了,但是他对于静态文件的处理只是将静态资源的名称+该资源的hash值作为后缀名,我们希望我们的版本同样能加上我们在package.json里设置的Version号 这样方便我们发布的时候能够与后端同步!


我们找到webpack.prod.conf.js

在webpack.prod.conf.js里引入package.json

var packageConfig = require('../package.json');

output: {

     path: config.build.assetsRoot,

    filename: utils.assetsPath('js/[name].[chunkhash:6].'+packageConfig.version+'.js'),//此处重点 [name]为文件名称 [chunkhash]为文件哈希值 这里取6位 packageConfig.version为我们发布的版本 即可

    chunkFilename: utils.assetsPath('js/[id].[chunkhash:6].'+packageConfig.version+'.js')

},

3.生产环境下的index.html里资源的绝对路径引入的问题

出现这个的原因是在webpack的output里publicPath是'/' 

需要在config/index.js里找到assetsPublicPath改成 './' 即变成相对引入  但是里面的文件资源的打包路径的引入也要相应的修改,因为他也是从当前文件下相对路径引入的资源

4.用vue官方脚手架vue-cli做项目一段时间了,今天突然热刷新失效了,手动刷新页面都不行,只能重启服务页面才刷新。在网上找到一个解决办法分享一下,经验证可以解决问题。(欢迎评论补充)

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf

&& sudo sysctl -p

六、element-ui 一些莫名其妙的问题

Error in render function: "TypeError: Converting circular structure to JSON"

1、在使用Message提醒框的时候 想使用vnode 而不是纯文本!会出现这个问题

原因是element-ui @1.4.2  对Message中添加vnode 而@1.3.7以前不支持vnode功能 会报错!

Uncaught TypeError: Cannot read property 'style' of undefined  在el-table 里出现 handlerMouseEnter出现error

2、一般是element-ui版本的问题 ,element-ui更新为最新版本 @1.4.2 

如果是之前@1.3.7版本,此时的Switch开关的取值 刚好相反 需要处理

3、切记在npm install 或者uninstall的时候 需要把npm run dev 的服务停掉,因为如果不停掉,原始的版本会删除不掉,这样就只是简单的覆盖原文件,这样就会造成 依赖文件不同版本的混乱 ,尤其在使用npm和cnpm同时存在两种node_moudles的依赖包的时候

4、MessageBox里点击取消按钮时出现

Uncaught (in promise) cancel

报此种错误的愿意是 promise没有收到resolve或者reject 

解决办法:1.不使用.then()的语法 使用callback的回调方法解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 来源:github.com Vue.js开源项目速查表:https://www.ctolib.com/cheats...
    zhangtaiwei阅读 11,524评论 1 159
  • 我心中有千军万马,说出口就变得语无伦次。我暗自努力,不让初恋这辆疾驰的列车无疾而终。 这个深夜里,...
    訁坞阅读 699评论 0 2
  • 习练瑜伽,如同舞蹈,跆拳道,书法等一样,坚持每天练习基本功很重要,俗话说一日练一日功,一日不练百日空。而基本功是需...
    可乐别加冰阅读 1,081评论 0 0
  • 本人91年,身在福州这个苦逼指数能排到全国第七的城市。教育专业13年毕业,那时候挺迷茫的,因为本职专业如果就业太过...
    行梦者阅读 896评论 6 3
  • 上一章《三年十一班》(29) 三个人沿着梧桐大道往校门外走,学校里的人都走得差不多了,保安大爷拿着手电筒,开始做最...
    彼得周阅读 388评论 0 2