這篇文章主要是宏觀總結,若是有哪部分知識須要另外單獨講解,根據留言會另外發布。javascript
歡迎來個人Vue技術羣交流:887516034html
固然是尤大的官網入手了,許多剛學框架的新手都喜歡從網上找視頻教程,例如慕課網這種,本人不建議這種學習方法,由於視頻的做者會讓你跟着他的思惟去寫一套他的風格的代碼,這是一個細思極恐的事情。vue
其實vuejs官網的東西是很是豐富的,而且我認爲須要加入瀏覽器書籤,是須要不間斷的重複看的,由於會更新新的文檔,不常常留意官網,可能就會漏掉新的語法糖,開發體驗應該是每一個開發者都須要的。java
建議直接上vue-cli
腳手架,從一開始就進入模塊化編程的思想。node
雖然我也說不出什麼是模塊化編程,好像就是那麼回事吧。mysql
vue-cli@2+
老掉牙的操做我就不提了,全局安裝腳手架,再用腳手架的cmd命令去拉取webpack模板。jquery
這裏提一下,能夠本身去官方的github去fork下來,而後本身定義一個喜歡的模板,好比加入
vuex
等等,具體操做自行搜索。webpack
我在上個禮拜也體驗了vue-cli@3.0
,目前還沒正式發佈,不過已經可使用了,這個我也很少講了,我們掘金也有相關文章。ios
友情連接
vue.config.js
相關配置 config.md
vue
的語法很少說了,無非就是template
,script
,style
,建議根據尤大的語法規範去書寫。
eslint
一個強制規範編碼的插件,不建議使用,常常出現莫名其妙的錯誤,公司內部能夠本身定義一套規範,而且文檔整理,也是個不錯的選擇。
<template>
<div :style="{color:$options.filters.txtToColor(msg)}"></div>
<!-- 行內filter -->
</template>
複製代碼
import { txtToColor } from '/path/to/filters.js'
export default {
name:'a',
data(){
return{
msg:123,
obj:{
msg:321
}
}
},
filters:{
txtToColor
},
watch:{
'obj.msg'(newV,oldV){ //監聽對象裏的屬性
}
}
}
複製代碼
<style lang="less/sass/stylus...">
</style>
複製代碼
router
第一次接觸這個詞的小萌新可能一臉懵逼,由於jquery
已經寫習慣了。
由於vue
是單頁面應用,router
其實就是把之前的domain.com/a.html
,domain.com/b.html
多頁面整合爲多路徑管理多個模塊。
//router.js
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
const router = new Router({
//此處能夠利用node環境變量來設置打包後項目放在服務器某個目錄後,路由的根路徑配置
base: process.env.NODE_ENV==='development'?'/':'/some/dir/',
//...routes
});
//不少人把beforeEach寫到main.js
router.beforeEach((from,to,next)=>{
//...某些攔截操做,是否登陸權限等
next()
});
export default router
複製代碼
每一層子路由,就須要多一層router-view
,若是隻是但願瀏覽器的url做爲語義,可使用alias
//router.js
const router = new Router({
routes:[
{
path:'/b',
component:B,
alias:'/a/c'//這樣當路徑爲/a/c時 頁面顯示爲B,router-view也會對應根路由
//別名只能經過path跳轉
},
{
path:'/a',
component:A,
children:[
{
path:'c',//這裏要注意 空配置要寫在後面。
//由於路由匹配到規則後就不會繼續匹配了
}
]
}
]
})
複製代碼
原理就是將須要懶加載的路由經過webpack
分開打包,切換至對應路由時,纔開始加載js文件,能夠實現首頁加載速度,可是總體項目體積會變大。
//router.js
const router = new Router({
routes:[
{
path:'/a',
component:()=>import('path/to/A.vue')
}
]
})
複製代碼
//package.json
"devDependencies":{
//...
"babel-plugin-syntax-dynamic-import": "^6.18.0"
//...
}
複製代碼
//.babelrc
"plugins":["syntax-dynamic-import"]
複製代碼
vuex
一個狀態(數據)管理官方插件,高效管理全局數據,而且注入vue實例,讓全部組件能夠輕鬆讀寫全局數據,讓全部組件直接共享狀態完成通訊。
//store.js
import Vue from 'vue';
import Vuex from 'vuex';
import moduleA from '/path/to/moduleA.js'
Vue.use(Vuex);
const store = new Vuex.Store({
strict:process.env.NODE_ENV==="development",//開發環境開啓嚴格模式
state:{
test:666
},
getters:{
},
mutations:{
testCommit(state,opt){
}
},
actions:{
testAction({commit}){
}
},
modules:{
moduleA
}
})
複製代碼
//moduleA.js
export default {
namespaced:true,//vuex模塊化 模塊名前綴
state:{
test:666
},
getters:{
},
mutations:{
testCommit(state,opt){
}
},
actions:{
testAction({commit,state,rootState,rootGetter}){
}
}
}
複製代碼
//***.vue
import {mapState,mapAction,mapMutation} from 'vuex'
//將vuex的方法注入到組件中,使用更方便
export default {
computed:{
...mapState('moduleA',{
test1:'test'
}),
...mapState({//vuex的根狀態
test2:'test'
})
},
method:{
...mapMutation('moduleA',{
testCommit1:"testCommit"
}),
...mapMutation({
testCommit2:"testCommit"
})
...mapAction('moduleA',{
testAction1:"testAction"
}),
...mapAction({
testAction2:"testAction"
})
},
mounted(){
this.testCommit1();//===this.$store.commit('moduleA/testCommit')
this.testCommit2();//===this.$store.commit('testCommit')
this.testAction1();//===this.$store.dispatch('moduleA/testAction')
this.testAction2();//===this.$store.dispatch('testAction')
}
}
複製代碼
這一段講一講父子組件那些事
假設手寫了個custom-btn組件,在父組件如何監聽這個子組件的點擊。這裏不講slot
了
<!--parent.vue-->
<template>
<custom-btn @click="some-fn"/>
</template>
<script> import custom-btn from 'path/to/custom-btn.vue'; export default{ components:{ custom-btn } } </script>
複製代碼
<!--custom-btn.vue-->
<template>
<button @click="$emit('click')"></button>
</template>
<script> export default{ name:'custom-btn' } </script>
複製代碼
只有在子組件emit
了click
,在父組件才能響應click
,這個click
能夠自定義名字。 也能夠在emit時,攜帶參數,實現父子組件傳值。
router-link是個內置組件,因爲沒有emit,因此是不能響應click的,可是能夠經過@click.native來爲組件內的dom元素綁定click。
一部分組件,包括路由,在業務需求上是須要緩存的,例如某個彈窗組件打開時,裏面有選項已經勾選了,須要臨時關閉彈窗可是又不但願再次打開從新渲染,這個時候就須要使用keep-alive
<template>
<keep-alive>
<custom-dialog></custom-dialog>
</keep-alive>
</template>
複製代碼
這個時候組件已經不會從新渲染,內部的經常使用鉤子函數也不會執行,只有利用專用的2個鉤子去處理緩存的組件邏輯。
<!--custom-dialog.vue -->
<script> export default{ activated(){ //喚醒時 }, deactivated(){ //睡眠時 } } </script>
複製代碼
這個屬於小場景,固然也有可能出現大場景,就是某個路由頁面所有緩存下來,這裏就有丶東西了,由於路由的渲染都是在router-view
,他是個動態的,同級的路由都會渲染在這個位置,這裏就要動態緩存了。
<template>
<keep-alive :include="[]"><!-- 這個數組裏寫須要緩存路由的.vue文件的name -->
<router-view />
</keep-alive>
</template>
複製代碼
請保持每一個文件的
name
惟一
推薦你們能夠刷幾遍vue的api, 不少人看官方文檔會漏掉這一頁
前面講到router
的base
能夠配置部署服務器後,非根目錄的狀況,一樣webpack也須要配置項目資源的根路徑
//config/index.js
module.exports = {
build:{
assetsPublicPath:'some/dir/',
productionSourceMap:false
//打包不生成map文件,有效減少打包體積,而且別人看不到你的源碼
}
}
複製代碼
默認的dev配置爲localhost:8080
,能夠利用ip
這個node包,讓同事能夠訪問你正在跑的項目
//config/index.js
const ip = require('ip').address();
//...
module.exports = {
dev:{
host: ip,
}
}
複製代碼
這裏還涉及到一個配置,能夠經過代理進行跨域
,僅限開發環境,生產環境能夠經過nginx實現,自行搜索。
//config/index.js
module.exports = {
proxyTable:{
'/api':{//當有/api/...路徑時,解析爲下面的域名
target: 'https://domain.com',//代理此域名
changeOrigin: true,
pathRewrite: { //當前解析爲domain.com/api/...
'^/api': '' //若有需求,能夠將api/去掉,此處爲domain.com/...
}
}
}
}
複製代碼
less等其餘語言自行搜索
經過webpack實現.vue
單文件可訪問全局scss變量,須要安裝sass-resources-loader
包
// build/utils.js 60行左右
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
//...
scss: generateLoaders('sass').concat({
loader: 'sass-resources-loader',
options: {
resources: path.resolve(__dirname,'../src/assets/theme/index.scss')
//這裏按照你的文件路徑填寫
//這裏能夠理解爲將此文件的變量廣播全局,.vue文件可使用這個文件中的變量
//多個文件能夠寫成數組
//詳細文檔可看 https://github.com/shakacode/sass-resources-loader
}
}),
//...
}
複製代碼
其他配置文件不建議修改,若是對webpack很是熟練,能夠隨意玩耍。
@tweenjs/tween.js
一個js動畫庫axios
支持promise的http庫qs
數據格式轉換插件,配合axios使用crypto-js
各類加密,沒什麼實際安全做用prismjs
語法高亮插件vue-lazyload
圖片懶加載,功能很全vue-meta
組件中動態修改head標籤裏面的內容babel-plugin-equire
echarts按需加載插件,優化寫法,默認會攜帶指定版本的echarts,建議自行安裝須要的版本覆蓋webpack-bundle-analyzer
打包完成後顯示體積相關信息,能夠了解是否重複加載,哪些文件過大等//package.json
"scripts": {
"dev": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --progress --config build/webpack.dev.conf.js",
"build": "node --max_old_space_size=4096 build/build.js"
},
複製代碼
其實這篇文章分享的東西並很少,由於我寫文章並無什麼準備,隨性寫寫,歡迎指正錯誤, 有不懂得能夠留言,會發布更詳細的講解。(感受本身很裝b啊,其實我也是菜鳥)
分享幾個連接
tips: 懂得分享,纔會走的愈來愈遠。
歡迎來個人Vue技術羣交流:887516034
若是以爲對你有用,就打賞一下吧。