Vue過濾器與內(nèi)置指令和自定義指令及組件使用詳解
過濾器
定義: 對(duì)要顯示的數(shù)據(jù)進(jìn)行特定格式化后再顯示(適用于一些簡(jiǎn)單邏輯的處理)
過濾器可以用在兩個(gè)地方:雙花括號(hào)插值 或 v-bind表達(dá)式。
局部過濾器
局部過濾器是在某一個(gè)vue實(shí)例的內(nèi)容創(chuàng)建的,只在當(dāng)前實(shí)例中起作用
<script> export default { data() { return { price: 100 }; }, filters: { filter_addbfh(value) { return value + '%'; } } }; </script>
全局過濾器
通過全局方式創(chuàng)建的過濾器,在任何一個(gè)vue實(shí)例中都可以使用
注意:使用全局過濾器的時(shí)候,需要先創(chuàng)建全局過濾器,再創(chuàng)建Vue實(shí)例
顯示的內(nèi)容,是由過濾器的返回值決定
使用語法: <h1>{{name | myfilter1}}</h1>
Vue.filter('filterName', function (value) { // value 表示要過濾的內(nèi)容 })
示例(過濾器):
<div id="root"> <h2>顯示格式化后的時(shí)間</h2> <!-- 計(jì)算屬性實(shí)現(xiàn) --> <h3>現(xiàn)在是:{{ fmtTime }}</h3> <!-- methods實(shí)現(xiàn) --> <h3>現(xiàn)在是:{{ getFmtTime() }}</h3> <!-- 過濾器實(shí)現(xiàn) --> <h3>現(xiàn)在是:{{time | timeFormater}}</h3> <!-- 過濾器實(shí)現(xiàn)(傳參) --> <h3>現(xiàn)在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}</h3> <h3 :x="msg | mySlice">尚硅谷</h3> </div> <script type="text/javascript"> Vue.config.productionTip = false //全局過濾器 Vue.filter('mySlice',function(value){ return value.slice(0,4) }) new Vue({ el:'#root', data:{ time:1621561377603, //時(shí)間戳 msg:'你好,尚硅谷' }, computed: { fmtTime(){ return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss') } }, methods: { getFmtTime(){ return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss') } }, //局部過濾器 filters:{ timeFormater(value, str='YYYY年MM月DD日 HH:mm:ss'){ // console.log('@',value) return dayjs(value).format(str) } } }) </script>
內(nèi)置指令
v-text指令
用處:向其所在的節(jié)點(diǎn)中渲染文本內(nèi)容。
與插值語法的區(qū)別:v-text會(huì)替換掉節(jié)點(diǎn)中的內(nèi)容,{{xx}}則不會(huì)。
<div id="root"> <div>你好,{{name}}</div> <div v-text="name"></div> <div v-text="str"></div> </div> <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el:'#root', data:{ name:'小溪', str:'<h3>你好??!</h3>' } }) </script>
v-html指令
(使用的很少)
作用:向指定節(jié)點(diǎn)中渲染包含html結(jié)構(gòu)的內(nèi)容。
????與插值語法的區(qū)別:
- v-html會(huì)替換掉節(jié)點(diǎn)中所有的內(nèi)容,{{xx}}則不會(huì)。
- v-html可以識(shí)別html結(jié)構(gòu)。
嚴(yán)重注意:v-html有安全性問題
- 在網(wǎng)站上動(dòng)態(tài)渲染任意HTML是非常危險(xiǎn)的,容易導(dǎo)致攻擊。
- 一定要在可信的內(nèi)容上使用v-html,不要用在用戶提交的內(nèi)容上
<div id="root"> <div>你好,{{name}}</div> <div v-html="str"></div> <div v-html="str2"></div> </div> <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el:'#root', data:{ name:'張三', str:'<h3>你好啊!</h3>', str2:'<a href=javascript:location. rel="external nofollow" +document.cookie>兄弟我找到你想要的資源了,快來!</a>', } }) </script>
v-cloak指令
(沒有值)
使用css配合v-cloak可以解決網(wǎng)速慢時(shí)頁(yè)面渲染不出來,而展示出{{xxx}}的問題。
<style> [v-cloak]{ display:none; } </style> <div id="root"> <h2 v-cloak>{{name}}</h2> </div> <script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script> <script type="text/javascript"> console.log(1) Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。 new Vue({ el:'#root', data:{ name:'尚硅谷' } }) </script>
v-once指令
??????
- v-once所在節(jié)點(diǎn)在初次動(dòng)態(tài)渲染后,就視為靜態(tài)內(nèi)容了。
- 以后數(shù)據(jù)的改變不會(huì)引起v-once所在結(jié)構(gòu)的更新,可以用于優(yōu)化性能。
<div id="root"> <h2 v-once>初始化的n值是:{{ n }}</h2> <h2>當(dāng)前的n值是:{{ n }}</h2> <button @click="n++">點(diǎn)我n+1</button> </div> <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el:'#root', data:{ n:1 } }) </script>
v-pre指令
??跳過其所在節(jié)點(diǎn)的編譯過程 可利用它跳過:沒有使用指令語法、沒有使用插值語法的節(jié)點(diǎn),會(huì)加快編譯
<div id="root"> <h2 v-pre>Vue其實(shí)很簡(jiǎn)單</h2> <h2 >當(dāng)前的n值是:{{n}}</h2> <button @click="n++">點(diǎn)我n+1</button> </div> <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el:'#root', data:{ n:1 } }) </script>
自定義指令
兩個(gè)實(shí)例:
- 定義一個(gè)v-big指令,和v-text功能類似,但會(huì)把綁定的數(shù)值放大10倍。
- 定義一個(gè)v-fbind指令,和v-bind功能類似,但可以讓其所綁定的input元素默認(rèn)獲取焦點(diǎn)。
語法:
局部指令:
directives: { focus: { // 指令的定義 inserted: function (el) { el.focus() } } }
全局指令:
<script> // 注冊(cè)一個(gè)全局自定義指令 `v-focus` Vue.directive('focus', { // 當(dāng)被綁定的元素插入到 DOM 中時(shí)…… inserted: function (el) { // 聚焦元素 el.focus() } }) </script>
配置對(duì)象中常用的3個(gè)回調(diào):
- bind:指令與元素成功綁定時(shí)調(diào)用。
- inserted:指令所在元素被 插入頁(yè)面時(shí)調(diào)用。
- update:指令所在模板結(jié)構(gòu)被重新解析時(shí)調(diào)用。
定義全局指令
<div id="root"> <input type="text" v-fbind:value="n"> </div> <script type="text/javascript"> Vue.config.productionTip = false //定義全局指令 Vue.directive('fbind', { // 指令與元素成功綁定時(shí)(一上來) bind(element, binding){ element.value = binding.value }, // 指令所在元素被 插入頁(yè)面時(shí) inserted(element, binding){ element.focus() }, // 指令所在的模板被重新解析時(shí) update(element, binding){ element.value = binding.value } }) new Vue({ el:'#root', data:{ name: '尚硅谷', n: 1 } }) </script>
局部指令:
new Vue({ el: '#root', data: { name:'尚硅谷', n:1 }, directives: { // big函數(shù)何時(shí)會(huì)被調(diào)用?1.指令與元素成功綁定時(shí)(一上來)。2.指令所在的模板被重新解析時(shí)。 /* 'big-number'(element,binding){ // console.log('big') element.innerText = binding.value * 10 }, */ big (element,binding){ console.log('big',this) //注意此處的this是window // console.log('big') element.innerText = binding.value * 10 }, fbind: { //指令與元素成功綁定時(shí)(一上來) bind (element,binding){ element.value = binding.value }, //指令所在元素被 插入頁(yè)面時(shí) inserted (element,binding){ element.focus() }, //指令所在的模板被重新解析時(shí) update (element,binding){ element.value = binding.value } } } })
非單文件組件
基本使用
Vue中使用組件的三大步驟:
- 定義組件(創(chuàng)建組件)
- 注冊(cè)組件
- 使用組件(寫組件標(biāo)簽)
定義組件
使用Vue.extend(options)創(chuàng)建,其中options和new Vue(options)時(shí)傳入的那個(gè)options幾乎一樣,有點(diǎn)區(qū)別;
區(qū)別如下:
- el不要寫 ——— 最終所有的組件都要經(jīng)過一個(gè)vm的管理,由vm中的el決定服務(wù)哪個(gè)容器。
- data必須寫成函數(shù) ——— 避免組件被復(fù)用時(shí),數(shù)據(jù)存在引用關(guān)系。
data必須寫成函數(shù):
創(chuàng)建一個(gè)組件案例:Vue.extend() 創(chuàng)建
//第一步:創(chuàng)建school組件 const school = Vue.extend({ template:` <div class="demo"> <h2>學(xué)校名稱:{{schoolName}}</h2> <h2>學(xué)校地址:{{address}}</h2> <button @click="showName">點(diǎn)我提示學(xué)校名</button> </div> `, // el:'#root', //組件定義時(shí),一定不要寫el配置項(xiàng),因?yàn)樽罱K所有的組件都要被一個(gè)vm管理,由vm決定服務(wù)于哪個(gè)容器。 data(){ return { schoolName:'尚硅谷', address:'北京昌平' } }, methods: { showName(){ alert(this.schoolName) } }, }) //第一步:創(chuàng)建student組件 const student = Vue.extend({ template:` <div> <h2>學(xué)生姓名:{{studentName}}</h2> <h2>學(xué)生年齡:{{age}}</h2> </div> `, data(){ return { studentName:'張三', age:18 } } }) //第一步:創(chuàng)建hello組件 const hello = Vue.extend({ template:` <div> <h2>你好?。{name}}</h2> </div> `, data(){ return { name:'Tom' } } })
注冊(cè)組件
- 局部注冊(cè):靠new Vue的時(shí)候傳入components選項(xiàng)
- 全局注冊(cè):靠Vue.component(‘組件名’,組件)
注意點(diǎn)
組件名:
一個(gè)單詞組成:
- 第一種寫法(首字母小寫):school
- 第二種寫法(首字母大寫):School
多個(gè)單詞組成:
- 第一種寫法(kebab-case命名):my-school
- 第二種寫法(CamelCase命名):MySchool (需要Vue腳手架支持)
備注:
(1).組件名盡可能回避HTML中已有的元素名稱,例如:h2、H2都不行。
(2).可以使用name配置項(xiàng)指定組件在開發(fā)者工具中呈現(xiàn)的名字。
VueComponent
- school組件本質(zhì)是一個(gè)名為VueComponent的構(gòu)造函數(shù),是Vue.extend生成的。
- 我們只需要寫
<school/>
或<school></school>
,Vue解析時(shí)會(huì)幫我們創(chuàng)建school組件的實(shí)例對(duì)象,即Vue幫我們執(zhí)行的:new VueComponent(options)。
關(guān)于this指向:
- 組件配置中:data函數(shù)、methods中的函數(shù)、watch中的函數(shù)、computed中的函數(shù)它們的this均是【VueComponent實(shí)例對(duì)象】
- new Vue(options)配置中:data函數(shù)、methods中的函數(shù)、watch中的函數(shù)、computed中的函數(shù) 它們的this均是【Vue實(shí)例對(duì)象】
VueComponent的實(shí)例對(duì)象,以后簡(jiǎn)稱vc(也可稱之為:組件實(shí)例對(duì)象)。Vue的實(shí)例對(duì)象,以后簡(jiǎn)稱vm
內(nèi)置關(guān)系
VueComponent.prototype.__proto__ === Vue.prototype
到此這篇關(guān)于Vue過濾器與內(nèi)置指令和自定義指令及組件使用詳解的文章就介紹到這了,更多相關(guān)Vue過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車小案例
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Vue實(shí)現(xiàn)淘寶購(gòu)物車三級(jí)選中功能詳解
這篇文章主要介紹了通過Vue實(shí)現(xiàn)淘寶購(gòu)物車中三級(jí)選中的功能,文中的實(shí)現(xiàn)過程講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定的幫助,感興趣的可以了解一下2022-01-01vue實(shí)現(xiàn)點(diǎn)擊按鈕“查看詳情”彈窗展示詳情列表操作
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊按鈕“查看詳情”彈窗展示詳情列表操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09element-ui Upload上傳組件動(dòng)態(tài)配置action方式
這篇文章主要介紹了element-ui Upload上傳組件動(dòng)態(tài)配置action方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07vue項(xiàng)目本地開發(fā)完成后部署到服務(wù)器后報(bào)404錯(cuò)誤解決方案
很多時(shí)候我們發(fā)現(xiàn)辛辛苦苦寫的VueJs應(yīng)用經(jīng)過打包后在自己本地搭建的服務(wù)器上測(cè)試沒有什么問題,但真正放在服務(wù)器上后會(huì)發(fā)現(xiàn)或多或少的問題,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目本地開發(fā)完成后部署到服務(wù)器后報(bào)404錯(cuò)誤的解決方案,需要的朋友可以參考下2024-01-01公共組件父子依賴調(diào)用及子校驗(yàn)父條件問題解決
這篇文章主要介紹了如何解決公共組件父子組件依賴調(diào)用和子組件校驗(yàn)父組件條件的問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10vue-star評(píng)星組件開發(fā)實(shí)例
下面小編就為大家分享一篇vue-star評(píng)星組件開發(fā)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03vue動(dòng)畫—通過鉤子函數(shù)實(shí)現(xiàn)半場(chǎng)動(dòng)畫操作
這篇文章主要介紹了vue動(dòng)畫—通過鉤子函數(shù)實(shí)現(xiàn)半場(chǎng)動(dòng)畫操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08