摘要:如果全部鉤子執(zhí)行完了,則導(dǎo)航的狀態(tài)就是確認(rèn)的。中斷當(dāng)前的導(dǎo)航。如果瀏覽器的改變了可能是用戶手動(dòng)或者瀏覽器后退按鈕,那么地址會(huì)重置到或者跳轉(zhuǎn)到一個(gè)不同的地址。
githubhttps://github.com/cd-dongzi/vue-example
1. 解決css背景圖片打包路徑錯(cuò)誤的問題在utils.js 文件中 找到 generateLoaders 方法
把以下代碼進(jìn)行更換
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: "vue-style-loader" }) } else { return ["vue-style-loader"].concat(loaders) }
更換成
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: "vue-style-loader", publicPath: "../../" }) } else { return ["vue-style-loader"].concat(loaders) }
打包就可以看到效果咯!
2. Vue引入全局less變量用vue-cli初始化的vue項(xiàng)目
再build文件夾下創(chuàng)建一個(gè)globalLessVars.js文件
在globalLessVars.js文件中 放入如下代碼
const fs = require("fs"); module.exports = function getLessVariables(file) { var themeContent = fs.readFileSync(file, "utf-8") var variables = {} themeContent.split(" ").forEach(function(item) { if (item.indexOf("http://") > -1 || item.indexOf("/*") > -1) { return } var _pair = item.split(":") if (_pair.length < 2) return; var key = _pair[0].replace(" ", "").replace("@", "") if (!key) return; var value = _pair[1].replace(";", "").replace(" ", "").replace(/^s+|s+$/g, "") variables[key] = value }) return variables }
在utils.js 引入 globalLessVars.js文件
const globalLessVars = require("./globalLessVars");
在static文件中創(chuàng)建 color.less 文件
在 color.less 文件中 放入如下代碼
@theme-color: #c1866a; @vice-color: rgba(186,164,119,0.99); @blue-color: #2e90fe;
在util.js文件中如下解析 color.less 文件
const colorsLess = globalLessVars(path.join(__dirname, "../static/color.less"));
再把util.js 文件中 cssLoaders方法中返回值改成以下代碼
return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders("less", { globalVars: colorsLess }), sass: generateLoaders("sass", { indentedSyntax: true }), scss: generateLoaders("sass"), stylus: generateLoaders("stylus"), styl: generateLoaders("stylus") }
大功告成
引用多個(gè)文件的話 就這可以這樣
const colorsLess = getLessVariables(path.join(__dirname, "../static/color.less")); const stylesLess = getLessVariables(path.join(__dirname, "../static/style.less")); const allLess = Object.assign(colorsLess, stylesLess); less: generateLoaders("less", { globalVars: allLess })
具體詳情可以查看使用webpack+vue+less開發(fā),使用less-loader,配置全局less變量3. 去除vue項(xiàng)目中的 # --- History模式
export default new Router({ mode: "history", routes: [ ... ] })
如果后臺(tái)沒給前端的 history 模式 匹配路徑的話, history 只適合在本地開發(fā)使用, 打包記得改回 hash 模式4. 自定義路徑名
import HelloWorld from "@/components/HelloWorld"
制定像 @ 這樣的自定義名稱
可以前往 webpack.base.conf.js 中如下設(shè)置:
resolve: { extensions: [".js", ".vue", ".json"], alias: { "vue$": "vue/dist/vue.esm.js", "@": resolve("src"), "components": resolve("src/components"), "views": resolve("src/views") } }5. 不符合規(guī)范導(dǎo)致eslint代碼檢測(cè)工具報(bào)錯(cuò)
如果出現(xiàn)類似以上的錯(cuò)誤 , 前往 build 文件下 webpack.base.conf.js 中注釋調(diào) eslint-loader 這個(gè)loader 就行了
如果你不想使用eslint 代碼檢測(cè) 你可以在用vue-cli直接在創(chuàng)建vue項(xiàng)目的時(shí)候就選擇不生成代碼檢測(cè)這個(gè)eslint-loader6. 本地開發(fā)解決跨域請(qǐng)求的問題
在 config 文件下的 index.js 文件中修改以下代碼
proxyTable: {}
設(shè)置成
proxyTable: { "/api": { target: "http://www.mytest.com", //這里放需要請(qǐng)求的接口 changeOrigin: true, pathRewrite: { "^/api": "" } } } // 請(qǐng)求接口的時(shí)候 http://www.mytest.com/login 可以寫成 /api/login
可以發(fā)起多個(gè)代理 (如下):
proxyTable: { "/api": { target: "http://www.mytest.com", changeOrigin: true, pathRewrite: { "^/api": "" } }, "/a": { target: "http://www.test.com", changeOrigin: true, pathRewrite: { "^/a": "" } } }7. babel-polyfill 讓ie上使用新語法的內(nèi)置對(duì)象和API
npm i babel-polyfill --save 下載 babel-polyfill 模塊
在webpack.base.conf.js 中做以下修改
module.exports = { entry: { app: ["babel-polyfill", "./src/main.js"] }, ...... }8. 前臺(tái)攔截器
一般在我們請(qǐng)求后臺(tái)數(shù)據(jù)時(shí),都會(huì)在請(qǐng)求過程中執(zhí)行動(dòng)畫, 和統(tǒng)一管理請(qǐng)求錯(cuò)誤,驗(yàn)證TOKEN 等等的情況;
當(dāng)你使用 axios 做請(qǐng)求時(shí), 你可以做如下設(shè)置來解決以上問題
npm i axios qs --save 來下載這兩個(gè)模塊
創(chuàng)建fetch.js 文件,內(nèi)容如下:
import axios from "axios" import qs from "qs" // 直接post請(qǐng)求后臺(tái)取不到參數(shù),() // 發(fā)起請(qǐng)求時(shí),會(huì)執(zhí)行該方法 axios.interceptors.request.use(config => { //你可以在這里開始加載動(dòng)畫, 查詢token 等等之類 return config }, err => { return Promise.reject(err) }) //接收到后臺(tái)的數(shù)據(jù)時(shí)執(zhí)行的方法 axios.interceptors.response.use(response => response, err => Promise.resolve(err.response)) //檢查狀態(tài)碼 status function checkStatus(res) { if (res.status === 200 || res.status === 304) { //當(dāng)狀態(tài)正常是返回原樣的數(shù)據(jù) return res } return { // 狀態(tài)不正常時(shí)可以返回自己自定義的一些格式或者狀態(tài)什么的 .... } } //檢查后臺(tái)的code 值 function checkCode(res) { if (res.data.code === 0) { //code值錯(cuò)誤時(shí) alert("出錯(cuò)了") } return res } export default { get(url, params) { //返回封裝后的 get 方法 if (!url) return return axios({ method: "get", url, params, timeout: 10000 }).then(checkStatus).then(checkCode) }, post(url, data) { //返回封裝后的 post 方法 if (!url) return return axios({ method: "post", url, data: qs.stringify(data), timeout: 10000 }).then(checkStatus).then(checkCode) } }
//在main.js中引入封裝后的axios import http from "./utils/fetch" Vue.prototype.http = http;
post請(qǐng)求直接放參數(shù), 為何后臺(tái)接收不到前端的參數(shù) axios發(fā)送post請(qǐng)求,springMVC接收不到數(shù)據(jù)問題9. Vue數(shù)組更新, 卻無法渲染問題
可以使用Vue.$set(object, key, value)來解決這個(gè)問題
具體可以參考這里 變化檢測(cè)問題(數(shù)組相關(guān))10. 路由懶加載
export default new Router({ routes: [ { path: "/lazy", name: "lazy-loading", component: (resolve) => { //這里加載了 記得上面就不需要在import 這個(gè)組件了 require(["../components/lazy-loading"], resolve) } } ] })11.自定義組件
先創(chuàng)建一個(gè)vue的 loading 結(jié)構(gòu)
loading.vue
2.在創(chuàng)建一個(gè)JS 文件引入這個(gè)loading.vue
index.js
import Vue from "vue" import LoadingComponent from "./loading.vue" //extend 是構(gòu)造一個(gè)組件的語法器.傳入?yún)?shù),返回一個(gè)組件 let LoadingConstructor = Vue.extend(LoadingComponent); let initComponent; //導(dǎo)出 顯示loading組件 export const showLoading = (option={}) => { initComponent = new LoadingConstructor(); initComponent.$mount(); document.querySelector(option.container || "body").appendChild(initComponent.$el); } //導(dǎo)出 移除loading組件 export const hideLoading = () => { initComponent.$el.parentNode.removeChild(initComponent.$el) }
3.最后創(chuàng)建一個(gè)js文件統(tǒng)一掛載所有自定義組件到vue原型上
output.js
import Alert from "./alert/index.js" //alert組件 import { showLoading, hideLoading } from "./loading/index.js" //loading組件 const install = function(Vue) { //通過install方法掛載到Vue原型上去 Vue.prototype.$alert = Alert; Vue.prototype.$showLoading = showLoading; Vue.prototype.$hideLoading = hideLoading; } export default install
4.最后在main.js中引入 output.js
import globalComponents from "./components/output" Vue.use(globalComponents);
在別的組件中通過如下直接調(diào)用就行了
created () { this.$showLoading() setTimeout( () => { this.$hideLoading() }, 2000); }12.路由之間的切換動(dòng)畫
1.用transition元素來做動(dòng)畫, 通過綁定name元素來切換不同的動(dòng)畫
返回
2.動(dòng)畫樣式
.view { padding: 50px 300px; position: absolute; left: 0; top: 0; width: 100%; transition: all 0.3s linear; } .slide-left-enter, .slide-right-leave-active { opacity: 0; transform: translate(100%, 0); } .slide-left-leave-active, .slide-right-enter { opacity: 0; transform: translate(-100%, 0); }
3.給路由添加返回的狀態(tài)
import Vue from "vue" import Router from "vue-router" Router.prototype.back = false; Router.prototype.goBack = function () { this.back = true; this.go(-1) }
4.檢測(cè)路由的改變來切換狀態(tài),
export default { name: "app", data() { return { transition: "slide-left" }; }, watch: { $route (to, from ) { var back = this.$router.back; if (back) { //點(diǎn)擊了返回 this.transition = "slide-right" }else{ this.transition = "slide-left" } this.$router.back = false; } } }13.生命周期的鉤子函數(shù)
beforeCreate () { console.log("--------------beforeCreate-------------------") console.log("在實(shí)例創(chuàng)建之后同步調(diào)用。此時(shí)實(shí)例已經(jīng)結(jié)束解析選項(xiàng),這意味著已建立:數(shù)據(jù)綁定,計(jì)算屬性,方法,watcher/事件回") console.log("但是還沒有開始 DOM 編譯,$el 還不存在,但是實(shí)例存在") }, created () { console.log("--------------created-------------------") console.log("在實(shí)例創(chuàng)建完成后被立即調(diào)用,掛載階段還沒開始,$el屬性目前不可見") }, beforeMount () { console.log("--------------beforeMount-------------------") console.log("模板編譯掛載之前") }, mounted () { console.log("--------------mounted-------------------") console.log("模板編譯掛載之后") }, beforeUpdate () { console.log("--------------beforeUpdate-------------------") console.log("組件更新之前") }, updated () { console.log("--------------updated-------------------") console.log("組件更新之后") }, activated () { console.log("--------------activated-------------------") console.log("keep-alive 組件激活時(shí)調(diào)用") }, deactivated () { console.log("--------------deactivated-------------------") console.log("keep-alive 組件停用時(shí)調(diào)用") }, beforeDestroy () { console.log("--------------beforeDestroy-------------------") console.log("組件銷毀之前") }, destroyed () { console.log("--------------destroyed-------------------") console.log("組件銷毀之后") }14. 路由鉤子函數(shù)
//全局鉤子函數(shù) const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // do something 可以檢測(cè)用戶是否登錄啥的 next(); }); router.afterEach((to, from, next) => { console.log(to.path); }); to: 即將要進(jìn)入的目標(biāo) [路由對(duì)象] from: 當(dāng)前導(dǎo)航正要離開的路由 next(): 進(jìn)行管道中的下一個(gè)鉤子。如果全部鉤子執(zhí)行完了,則導(dǎo)航的狀態(tài)就是confirmed (確認(rèn)的)。 next(false): 中斷當(dāng)前的導(dǎo)航。如果瀏覽器的 URL 改變了(可能是用戶手動(dòng)或者瀏覽器后退按鈕),那么 URL 地址會(huì)重置到 from next("/") 或者 next({ path: "/" }): 跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷,然后進(jìn)行一個(gè)新的導(dǎo)航 //組件內(nèi)的鉤子 beforeRouteEnter (to, from, next) { // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用 // 相對(duì)于組件來說的,而且應(yīng)該是在路由進(jìn)入之前開始準(zhǔn)備的 所以beforeRouteEnter是調(diào)用ajax的時(shí)機(jī) // 不能獲取組件實(shí)例 `this` // 因?yàn)楫?dāng)鉤子執(zhí)行前,組件實(shí)例還沒被創(chuàng)建 next(); }, beforeRouteLeave (to, from, next) { //在組件的生命周期完成后,且舊路由即將切換走,新路由beforeEach的時(shí)機(jī)執(zhí)行 }15. 打包事項(xiàng)
在config 文件下的 index.js 中 修改以下屬性 (如果你想在本地打包能看到頁面效果, 此步驟不要忘記哦)
assetsPublicPath: "/"
更改成
assetsPublicPath: "./"
在構(gòu)建生產(chǎn)環(huán)境版本時(shí)是否開啟source map
productionSourceMap: true
當(dāng)把這個(gè)設(shè)置 置為 false 時(shí), 文件體積會(huì)變得很小 JavaScript Source Map 詳解
16. 簡單文件介紹.babelrc { // 此項(xiàng)指明,轉(zhuǎn)碼的規(guī)則 "presets": [ // env項(xiàng)是借助插件babel-preset-env,下面這個(gè)配置說的是babel對(duì)es6,es7,es8進(jìn)行轉(zhuǎn)碼,并且設(shè)置amd,commonjs這樣的模塊化文件,不進(jìn)行轉(zhuǎn)碼 ["env", { "modules": false, "targets": { "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] } }], // 下面這個(gè)是不同階段出現(xiàn)的es語法,包含不同的轉(zhuǎn)碼插件 "stage-2" ], // 下面這個(gè)選項(xiàng)是引用插件來處理代碼的轉(zhuǎn)換,transform-runtime用來處理全局函數(shù)和優(yōu)化babel編譯 "plugins": ["transform-runtime"], // 下面這段是在特定的環(huán)境中所執(zhí)行的轉(zhuǎn)碼規(guī)則,當(dāng)環(huán)境變量是下面的test就會(huì)覆蓋上面的設(shè)置 "env": { // test 是提前設(shè)置的環(huán)境變量,如果沒有設(shè)置BABEL_ENV則使用NODE_ENV,如果都沒有設(shè)置默認(rèn)就是development "test": { "presets": ["env", "stage-2"], // instanbul是一個(gè)用來測(cè)試轉(zhuǎn)碼后代碼的工具 "plugins": ["istanbul"] } } }
.editorconfig charset = utf-8 //編碼 indent_style = space //縮進(jìn)風(fēng)格,基于空格做縮進(jìn) indent_size = 2 //縮進(jìn)大小是2格 end_of_line = lf //換行符的風(fēng)格 insert_final_newline = true //當(dāng)你創(chuàng)建一個(gè)文件,會(huì)自動(dòng)在文件末尾插入新行 trim_trailing_whitespace = true //自動(dòng)移除行尾多余空格
package.json "name": "example", "version": "1.0.0", "description": "A Vue.js project", "author": "", "private": true, "scripts": { // 例: "dev": "node build/dev-server.js" // "dev"就相當(dāng)于需要在命令行執(zhí)行 npm run dev 所有我們執(zhí)行的npm run dev 相當(dāng)于執(zhí)行了 "node build/dev-server.js" // 基本所有腳本命令 都需要 加上前綴 npm run ... ,但是 "start" 這個(gè)腳本命令只需要執(zhí)行 npm start 就行, 不需要中間的 run; "dev": "node build/dev-server.js", "start": "npm run dev", "build": "node build/build.js" }, "dependencies": { // 生產(chǎn)環(huán)境所需要的依賴 "vue": "^2.5.2", "vue-router": "^3.0.1" ...... }, "devDependencies": { // 開發(fā)環(huán)境所需要的依賴 "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", ....... }, "engines": { "node": ">= 4.0.0", "npm": ">= 3.0.0" }, "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ] }
更多的文件配置可以參考 vue-cli#2.0 webpack 配置分析
小結(jié)希望能跟大家一起進(jìn)步, O(∩_∩)O謝謝
github地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89541.html
摘要:菜鳥教程這是一個(gè)屬性其值是字符串菜鳥教程同上這是一個(gè)屬性其值是字符串用于定義的函數(shù),可以通過來返回函數(shù)值。它們都有前綴,以便與用戶定義的屬性區(qū)分開來。 開篇語 我最近學(xué)習(xí)了js,取得進(jìn)步,現(xiàn)在學(xué)習(xí)vue.js.建議新手學(xué)習(xí),請(qǐng)不要用npm的方式(vue-cli,vue腳手架),太復(fù)雜了. 請(qǐng)直接下載vue.js文件本地引入,就上手學(xué)習(xí)吧參照菜鳥教程網(wǎng)站的vue.js教程http://...
摘要:有興趣的同學(xué)可以查看之前發(fā)布的文章學(xué)習(xí)系列一學(xué)習(xí)實(shí)踐筆記附學(xué)習(xí)系列二學(xué)習(xí)實(shí)踐筆記附學(xué)習(xí)系列三和網(wǎng)絡(luò)傳輸相關(guān)知識(shí)的學(xué)習(xí)實(shí)踐學(xué)習(xí)系列四打包工具的使用學(xué)習(xí)系列五從來聊聊學(xué)習(xí)系列項(xiàng)目地址項(xiàng)目暫時(shí)有點(diǎn)亂,之后會(huì)進(jìn)行整理優(yōu)化。 上次學(xué)習(xí)了vue-router的使用,讓我能夠在各個(gè)頁面間切換,將頁面搭建了起來。這次則要學(xué)習(xí)vue的狀態(tài)管理模式——vuex。它類似于redux來應(yīng)用的全局狀態(tài)。 注:本...
1.vue的開始 var vm = new Vue({ el: #app, // el: 用來掛載 Vue 實(shí)例的元素 data: {}, // data: 要綁定的資料 props: {}, // props: 用來接收外部資料的屬性 methods: {}, ...
摘要:聲明式渲染的引入初步使用錯(cuò)誤筆記中的忘記大寫,的忘了加引號(hào)以及忘了在末尾加逗號(hào)指令鼠標(biāo)懸停幾秒鐘查看此處動(dòng)態(tài)綁定的提示信息特性被稱為指令。指令帶有前綴,以表示它們是提供的特殊特性。 聲明式渲染 vue的引入 初步使用vue {{message}} var app=new Vue({ el: #app, data:{ me...
摘要:聲明式渲染的引入初步使用錯(cuò)誤筆記中的忘記大寫,的忘了加引號(hào)以及忘了在末尾加逗號(hào)指令鼠標(biāo)懸停幾秒鐘查看此處動(dòng)態(tài)綁定的提示信息特性被稱為指令。指令帶有前綴,以表示它們是提供的特殊特性。 聲明式渲染 vue的引入 初步使用vue {{message}} var app=new Vue({ el: #app, data:{ me...
閱讀 3301·2021-10-11 11:08
閱讀 4441·2021-09-22 15:54
閱讀 922·2019-08-30 15:56
閱讀 877·2019-08-30 15:55
閱讀 3550·2019-08-30 15:52
閱讀 1360·2019-08-30 15:43
閱讀 1944·2019-08-30 11:14
閱讀 2514·2019-08-29 16:11