vue歸納

vue遵循的模型是m v vm

(1)v-cloak:可以解決在vue文件沒加載完全之前的閃爍問題(出現{{}})
在這裏插入圖片描述
在這裏插入圖片描述
(2)v-test=“msg” 作用跟插值表達式 {{}}一樣
好處是沒有閃爍問題 因爲沒有申明{{}}
壞處是會覆蓋元素中原本的內容 插值表達式只會覆蓋{{}} 其他的位置可以保留
v-cloak, v-test都無法渲染data中的html
(3) v-html 可以渲染data中的html
(4)v-bind 用來綁定原生的屬性和自己定義的data -----------簡寫 :
會把賦入的值當作一個表達式來做 也就可以定義傳入data後的操作(你傳入的data當作片一個變量)
也可以用來綁定自定義屬性—用來父子組件傳值使用
(5)v-on 綁定事件 配合vm層的methods方法 ------縮寫:@ 也可以用來在父子組件之間傳遞methods 在template實例的組件中methods中定義方法時調用this.$emit(‘父組件中傳給子組件綁定的方法名’,參數)
------------emit可以達到父子組件雙向傳遞data的作用

在函數的調用中 如果使用了setinterval這種函數 
使用() => {} 箭頭函數裏頭的this 指向的是setinterval外的this   就可以拿到vm層的數據了~    箭頭函數解決了內部this實例和外部this實例的指向問題

v-on:click.stop  阻止冒泡
			.prevent 阻止默認行爲
			 .capture 改冒泡爲捕獲機制 
			 .self 只有觸發當前元素纔會觸發 冒泡捕獲不會觸發
			 .once 只觸發一次     .once.prevent只觸發一個阻止默認行爲
@keyup .enter     在按鍵的時候觸發 並且是回車鍵的時候觸發 
Vue.config.Keycodes.變量名= 你要定義的按鍵在js中特定的值    定義全局按鍵修飾符

(6)雙向數據綁定:v-model 不需要寫成v-model:value之類的 只能用在表單元素中
v-bind只能綁定m 到 v
(7):class綁定css
:class=“[‘a’,‘b’]” 直接傳遞一個數組,可以在數組中使用三元表達式 也可以用對象 {'class類名 ':true}
:class="{a:true,b:false}" 這是使用對象的形式 所以可以在data中定義這個對象進行引用
(8) :style="{color:red,}"
:style="[對象1,對象2]“綁定data中定義的多個對象
(9)v-for=”(item,index) in data中定義的數組" 遍歷數組輸出
v-for="(value,key,index) in data中定義的對象" 遍歷對象輸出其中的健值對
可以放普通數組 對象數組 對象 數字(遍歷數字)
在for中利用 :key="item.id"來保證數據的唯一性 綁定id的checkbox跟內容

key利用的是diff算法:
		根據dom生成虛擬dom 虛擬dom某個節點數據改變後生成一個新的node 這個node和舊的node進行對比 發現不一樣的就在真是的dom上面修改 然後舊 的dom改成新的dom ,diff就是比較新舊節點的patch函數的調用過程 
		

(10)v-if 每次重新刪除或者創建元素 缺點是頻繁切換會有效率問題
v-show 切換display屬性 缺點是從不顯示元素也會渲染和加載
(11)過濾器 使用:{{msg| 你定義的過濾器(可傳參)}} 可以在最終輸出前用來過濾或者更改你的數據, 可以加多個 | 過濾器 一個一個執行
定義過濾器 : Vue.filter(過濾器的名字,function(){})
全局過濾器 所有的vm實例都可以共享
在vm實例中寫filters定義私有過濾器 私有過濾器優先級更高,就近
(12)Vue.directive 定義全局指令 通過v-調用 默認提供了幾個鉤子函數 在這些鉤子函數中進行你所要的方法的調用,例如定義了聚焦函數 在inserted裏調用focus 用v-focus進行調用(利用Vue.directive在鉤子函數上調用原生js的方法來自定義v-標籤 )
和行爲有關的定義在insetred中 和樣式有關的定義在bind中
兩個參數 : 1是js的原生對象 2是binding 可以獲取參數
在這裏插入圖片描述
如果直接 函數名:function 等同於把代碼寫到了bind和update中去
在這裏插入圖片描述
在vm中設置directives屬性定義私有指令

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
vue的生命週期

1創建一個vue實例對象
2init lifecycle
3beforecreate:  data和methods的函數都沒有初始化
4init reactivity此時data methods初始化好
5created
6在內存中渲染好dom模版 但是還沒有渲染到頁面上去
7beforemount    頁面中元素還沒有被替換成真實數據 只是模版
8將內存中編譯好的模版替換到瀏覽器中去
9mounted 可以看到渲染好的頁面了 即可以獲取到頁面上的數據     mounted過後表示實例完全創建好了 
			想通過dom操作頁面節點最早要在mounted
			-----創建階段結束  進入運行階段-----
10只有數據改變纔會觸發:
				beforeupdate     數據被更新了 但頁面還沒有被更新
				update  頁面已經重新渲染了
11beforedestroy   vue實例從運行階段進入銷燬階段  vue實例身上的所有data methods 過濾器 指令都處於可用狀態 還沒有真正銷燬
	destroy  組建完全銷燬 所有data methods 過濾器 指令不可用
	

**

使用axios發送ajax請求

**

發送get
 axios.get(url,{       // 還可以直接把參數拼接在url後邊
        params:{
          a:‘b’
        }
    }).then(function(res){
       
    }).catch(function (error) {
     
    });

發送post
axios.post(URL, {
  a:‘b,
  c:‘d’
}).then(function (response) {
  
}).catch(function (error) {
 
});


axios.all 執行多個併發請求
axios.interceptor.request  請求攔截器
axios.interceptor.response 響應攔截器

**

Vue-resource實現 get post jsonp

可以用node寫個服務器 然後用jsonp動態調用 jsonp通過script調用將返回值當作js執行 所以可以讓服務器調用本地的js方法(可以從服務器傳遞參數)
**

這個插件 掛載在vue實例上:
需要說一下 .then 就是promis

在這裏插入圖片描述

Vue.http.options.root=    配置全局相對路徑
						.emulateJSON = true   全局啓用emulate

**

vue組件

**

用不同的組件劃分不同的功能模塊 需要什麼功能調用響應組件即可 方便ui的重用
   區別模塊化:代碼邏輯角度進行劃分的 方便代碼分層開發 保證每個功能模塊職能單一

創建全局組件:
	var tm =	Vue.extend({
		template:  指定組件要展示的html
})

使用組件   組件模版只能有一個根元素
		Vue.component(你定義的名字,tm)        並且在html頁面中用標籤引用即可   駝峯變成小寫 - 
		Vue.component(你定義的名字,{template:html})
		推薦使用	Vue.component(你定義的名字,{template:‘#id’})   在vm實例引用的html元素外定義template 並定義id  就可以在vm實例引用的html元素中使用了
		也可以在vm實例中利用 components定義私有組件

在這裏插入圖片描述

組件可以定義data 如上圖 必須是一個返回對象的函數 這個data就可以在template的html中{{}}使用
組件中也可以有methonds   但是只能有一個data對象   
通過函數返回的目的: 組件可以多次引用  會有共享內存問題 更改一次就全部被引用的數據都更改了  通過函數返回就可以獨立變量  所以return的時候不要用在data外定義的全局變量對象 而是在data function中定義一個對象{}返回

也可以用 component標籤 :is = ""來引用       :is=可以放字符串 也可以放變量  就可以選擇任意一個component

組件傳值

子組件中默認訪問不到父組件中data上的數據和methods方法(即vm實例中的component無法訪問vm實例的 只能訪問自己的額)
	要想使用: 在組件標籤中利用v-bind自定義一個屬性傳遞值給子組件
						在子組件中的props屬性中定義:['自定義的值']來申明一下纔可以使用
									-----props中的數據是建議只讀的  data的是可讀可寫的

vm實例的$ref

在html元素上綁定ref		組件也可以通過ref進行引用
使用this.$.ref.綁定的值 可以獲取相對應的dom節點 (可調用.innerHTML之類的方法) 
		可以用來父子之間傳遞值和方法使用!~

**

單頁面應用程序路由hash(#)

實現不同頁面之間的切換
並且http請求中不會包含有hash的內容
路由 vue-router 用script引入自動安裝 window全局對象中就會有一個路由的構造函數
導入包後頁面自動出現#/
**

(1)new VueRouter({})創建路由對象 
		routes 路由匹配規則
(2)在vm實例中 通過 router屬性關聯	  可以直接寫router對象自動解析成健值對
(3)在頁面上放置router-view標籤 一個router-view就配置一個路由組件 多個就配置同樣的多個路由組件 不需要放模版的標籤-------在使用模版裏面也使用路由的時候 模版裏面也需要router-view  但是注意不可以把模版裏面的路由寫成平級的  在父路由的path裏面寫children屬性配置子路由(路由寫成平級的 切換一個路由 會清除子組件全部內容重新加載新的路由)
	用a標籤跳轉的時候記得相對地址加上#,也可以使用router-link to屬性來跳轉 不用加#   渲染出來的結果也是a標籤   利用tag屬性更改渲染出來的標籤 例如改成span
		****可以直接加?攜帶參數***
		可以用redirect修改hash值的指向 和後端的重定向不一樣
------------------------------------------
點擊的標籤默認會有.router-link-active  
可以在構造器中和routes並行的屬性 linkActiveCLass來重新自定義
---------------------------------------------
可以在template的html中{{$route.query.你要的屬性}}來拿到傳遞的參數 重點在於$route對象

在這裏插入圖片描述

可以更改path爲 /login/:屬性     通過this.$route.params.屬性 獲取  		這種傳遞方式類似restful風格
------------------------------------------
路由path裏面的component改成components可以配置多個
	然後需要在router-view中配置name屬性配置成你多個的component鍵 就可以一次性展現多個

**

watch

監視data中的數據 改變的時候觸發函數
缺點:每一個data需要定義一個方法
優點:可以監視路由(或者其他非dom元素)的事件
**

data中的屬性:function(第一個參數是新的值,第二個參數是舊的值){} 

監聽非dom元素 例如路由:
			對象鍵寫成 '$route.path'即可

**

computed

計算屬性 跟在data中定義的屬性一樣 只不過通過函數function進行返回
具有緩存
**

  不需要加()調用 當作普通屬性使用即可
  只要計算屬性內部的任何data數據發生變化 就會重新計算這個屬性

只計算一次 多次引用的部分使用的緩存
跟watch的區別:一定要return一個值

**

nrm

提供npm命令的淘寶鏡像 cnpm鏡像、
注意安裝nrm后里頭的只是提供了一個地址 而不是對應的工具
**

npm i nrm -g安裝    	安裝好後 默認就是cnpm鏡像		通過nrm ls查看
nrm use 切換	切換後使用npm的時候地址就會是相對應的地址而不是npm的地址(比較慢)

**

webpack

用來解決css和js在頁面中因爲script link引入而多次請求導致的效率問題-----默認只能打包js
基於node.js的前端項目構建工具
安裝jquery :npm init -y
npm i jquery -s 會產生一個node_modules
**

(1)全局安裝:
	npm i webpack -g 
(2)只需要一個main.js
		import $ from 'jquery'    	類似node的const $ = require('jquery') -------------jquery向外暴露了$模塊 所有纔可以  跟css不一樣
(3)瀏覽器解析不了es6 要用webpack打包(並沒有熱部署 改了代碼要重新打包)
webpack 源main.js的地址  目的地址      經過webpack進行打包處理  
																瀏覽器纔可以識別(可以處理兼容問題)  並且可以處理js文件間的互相依賴關係
---------------------------------------
在項目根目錄下配置webpack.config.js 
		利用node裏面路徑操作path模塊 對外暴露webpack打包路徑 就可以直接使用webpack命令不用加地址進行打包

在這裏插入圖片描述

熱部署自動打包:webpack-dev-server
		安裝: npm i webpack-dev-server -D 
					npm run dev
	就像nndemon可以無縫執行node一樣
	webpack-dev-server可以無縫執行		新生成的bundle.js 是在內存中的而不是磁盤上 默認在項目根目錄上
	

**

html-webpack-plugin插件

在內存中生成一個指定路徑頁面的內存頁面—效率
自動寫一個script引入經過webpack打包後生成的內存中的bundle.js
**

cnpm i html-webpack-plugin -D
用require("html-webpack-plugin") 導入插件
在plugins屬性中註冊 構造參數中使用templtae:path.join() 指定模版頁面
		----生成內存中的頁面
			生成的內存中的頁面會自動在底部script標籤引入內存中的bundle.js(htmlwebpackplugin幫我們追加的)

**

webpack處理css

因爲css沒有對外暴露模塊 所以直接import css路徑即可
webpack默認只能打包js 如果要處理非js文件 要安裝第三方loader加載器

**

css:  
		(1)  cnpm i  style-loader css-loader -D
		(2)在webpack.config.js文件中的module屬性中配置rules數組屬性{test:/\.css$/,use::['style-loader','css-loader']}  將指定路徑的css交給指定的loader來處理  按從右往左的順序loader執行 然後交給webpack打包處理最終也是輸出到bundle.js中

**

webpack處理less

**

cnpm i less -D
cnpm i less-loader -D
{test:/\.less$/,use::['style-loader','css-loader','less-loader']} 從右往左 先解析成普通樣式文件 再進行處理 最後交給webpack

**

webpack處理scss

**

cnpm i node-sass -D
cnpm i sass-loader -D
{test:/\.scss$/,use::['style-loader','css-loader','scss-loader']}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章