vue2指令的使用和自定義指令

前言

個人認為vue的指令,對比react來說,給開發者節省了很大的學習成本。比如在react中,你想渲染一個列表,需要用Array.map的方法return<div>,而在vue中,一個簡單的v-for就解決了問題。

在學習成本和入手體驗上,vue的作者確實后來者居上,能讓人更快的使用vue開發。不過也是老生常談的問題,各有特點,不做過多比較。

vue中的指令是用在標簽上或者組件上,是ui層和數據層的交互介質。這個官方沒有這么說,是我自己說的,比如你使用v-if,通過data去控制ui,使用v-model實現ui和data的雙向交互。

我這里并不是指令的具體教程,只是一些demo的測試效果。

示例

這里我將指令分為三塊

簡單指令:學習簡單,使用簡單

復雜指令:可以在組件上使用,或者有修飾符等

自定義指令:自定義一些指令去實現某些業務功能

簡單指令

v-text

用來回顯常規字符串的

 <h6>v-text使用</h6><p>使用v-text----<span v-text="textValue"></span></p><p>使用模板語法----<span>{{ textValue }}</span></p>//datatextValue: '這是一段常規文字',

?效果

v-html

用來回顯html的節點

<h6>v-html使用</h6>
<div v-html="htmlTemplate"></div>//data
htmlTemplate: `<div><input/><button>按鈕</button></div>`

效果

v-show

用來控制元素的樣式回顯

<h6>v-show使用</h6>
<el-checkbox v-model="checkedValue">開關</el-checkbox>
<p v-show="checkedValue">開啟</p>
<p v-show="!checkedValue">關閉</p>//data
checkedValue: true,

效果

?v-if & v-else-if & v-else

?用來控制元素的渲染

<h6>v-if && else-if && else的使用</h6>
<p>數字:{{ numValue }}</p>
<el-button @click="addNum">增加</el-button>
<el-button @click="deleteNum">減少</el-button>
<p v-if="numValue > 0">大于0</p>
<p v-else-if="numValue === 0">等于0</p>
<p v-else>小于0</p>//data
numValue: 0,//methods
addNum() {this.numValue++
},
deleteNum() {this.numValue--
},

?

?v-for

渲染數組類型

                    <h6>v-for使用</h6><ul><li v-for="(item, index) in listValue" :key="item.value">{{ item.label }}</li></ul>//datalistValue: [{label: '文字1',value: 'one'},{label: '文字2',value: 'two'},{label: '文字3',value: 'three'}],

v-pre

跳過對js等變量的編譯,渲染原始html

                    <h6>v-pre使用</h6><p v-pre>我是不需要編譯的<span>{{ textValue }}</span></p>//datatextValue: '這是一段常規文字',

v-cloak

渲染完成之前的一種替代(網速慢優化策略)

                    <h6>v-cloak使用</h6><p v-cloak>{{ textValue }}</p>

v-once

元素只會渲染一次,更新不會重新渲染

                    <h6>v-once使用</h6><el-button @click="changeNumberVal">修改值</el-button><p v-once>不變的:{{ numberVal }}</p><p>變化的的:{{ numberVal }}</p>//data
numberVal: 100,//methodschangeNumberVal() {this.numberVal++},

復雜指令

v-on

用來處理事件的

簡寫和動態事件
<h6>v-on使用(簡寫為@)</h6>
<el-button v-on:click="clickFun">常規點擊</el-button>
<el-button @click="clickFun">簡寫常規點擊</el-button>
<el-button v-on:[eventName]="clickFun">動態事件</el-button>
<el-button @[eventName]="clickFun">動態事件簡寫</el-button>
<el-button @click.once="clickFun">只生效一次</el-button>//methodsclickFun() {console.log('常規點擊')},

依次點擊按鈕,最后一個按鈕點擊只觸發依次

?

?阻止默認事件
<a href="http://www.baidu.com" @click="clickFun"><el-button>無限制跳轉</el-button></a>
<a href="http://www.baidu.com" @click.prevent="clickFun"><el-button>阻止默認事件</el-button></a>//methodsclickFun() {console.log('常規點擊')},

第一個按鈕會先觸發函數,再跳往至百度頁面。

第二個按鈕只會觸發函數,不會跳轉頁面。

阻止事件冒泡
<span @click="clickSpanFun"><el-button @click="clickFun">節點嵌套事件冒泡</el-button></span>
<span @click="clickSpanFun"><el-button @click.stop="clickFun">阻止事件冒泡</el-button></span>//methodsclickFun() {console.log('常規點擊')},clickSpanFun() {console.log('點擊span標簽')},

點擊按鈕1

點擊按鈕2

?其他事件和點擊組件的修飾符
<input v-model="inputValue" @keyup.enter="inputEventFun" type="text">
<el-input v-model="inputValue" @keyup.native.enter="inputEventFun"></el-input>
<Child @click.native="componentClick"></Child>
v-bind

動態渲染值

<h6>v-bind使用</h6>
<p v-bind:class="className">動態class</p>
<p :style="styleName">動態樣式加簡寫</p>
<el-button :name1="name1" :name2="name2" name3="屬性3" ref="btn1" @click="checkBtn1">查看element按鈕組件的自定義屬性</el-button>
<button :name1="name1" :name2="name2" name3="屬性3" ref="btn2" @click="checkBtn2">查看原生dom的自定義屬性</button>//dataname1: '屬性1',name2: JSON.stringify({value: '屬性3'}),

?

依次點擊兩個按鈕

v-model

輸入框類型數據視圖雙向綁定

<h6>v-model使用</h6>
<p>常規v-model<el-input v-model="InputVal"></el-input></p>
<p>lazy修飾符<input v-model.lazy="InputLazyVal" @input="inputLazyFun" /></p>
<p>number修飾符<el-input v-model.number="InputNumberVal"></el-input></p>
<p>trim修飾符<el-input v-model.trim="InputTrimVal"></el-input></p>

v-slot

插槽,這里不說了,看插槽相關的文檔吧

自定義指令

語法

全局注冊和局部注冊

局部注冊

局部注冊就是在當前組件里面寫

<template><div><h6>固定顏色指令</h6><p v-color>固定紅色的指令效果</p></div>
</template><script>export default{data(){return{
}
},directives: {color: {// 指令的定義inserted: function (el) {el.style.color = 'red'}}},
}</script>

全局注冊

創建一個js文件并在main.js中引入?

import Vue from 'vue'Vue.directive('setColor',{//初始化鉤子inserted:function(el,val,vnode){console.log(el,val,vnode,'???自定義函數')el.style.color = val.value || '#000'},//更新鉤子update:function(el,val,vnode){console.log(el,val,vnode,'???自定義函數')el.style.color = val.value || '#000'},
})

引入后,任意組件內都可以使用

<h6>自定義顏色</h6>選擇一個顏色吧:<el-color-picker v-model="colorValue"></el-color-picker><p v-setColor="colorValue">我是一段可選擇顏色的字段</p>//data
colorValue:'#000'

?定義一個可拖拽的指令

vue組件

<h6>可拖拽指令</h6>
<div class="dragBox"><div class="dragContent" v-draggable></div>
</div><style lang="less">.dragBox {position: relative;width: 800px;height: 200px;border: 1px solid #000;.dragContent {position: absolute;width: 50px;height: 50px;background: red;cursor: move;left: 10px;top: 10px;}
}
</style>

定義指令

Vue.directive('draggable',{inserted: function (el) {el.onmousedown = function (e) {var disx = e.pageX - el.offsetLeft;var disy = e.pageY - el.offsetTop;document.onmousemove = function (e) {el.style.left = e.pageX - disx + 'px';el.style.top = e.pageY - disy + 'px';}document.onmouseup = function () {document.onmousemove = document.onmouseup = null;}}},
})

?

自定義指令在實際的項目中還是很重要的,可以實現很多的業務場景。

比如我個人就用指令完成過水印效果,拖拽,按鈕權限的控制等,學會自定義指令,也是多少需要復習一下很多人拋棄已久的dom基礎知識。

全部代碼

vue組件

<template><div class="box"><el-tabs v-model="activeName"><el-tab-pane label="簡單指令(不需要修飾符)" name="first"><div class="content1"><h6>v-text使用</h6><p>使用v-text----<span v-text="textValue"></span></p><p>使用模板語法----<span>{{ textValue }}</span></p></div><div class="content1"><h6>v-html使用</h6><div v-html="htmlTemplate"></div></div><div class="content1"><h6>v-show使用</h6><el-checkbox v-model="checkedValue">開關</el-checkbox><p v-show="checkedValue">開啟</p><p v-show="!checkedValue">關閉</p></div><div class="content1"><h6>v-if && else-if && else的使用</h6><p>數字:{{ numValue }}</p><el-button @click="addNum">增加</el-button><el-button @click="deleteNum">減少</el-button><p v-if="numValue > 0">大于0</p><p v-else-if="numValue === 0">等于0</p><p v-else>小于0</p></div><div class="content1"><h6>v-for使用</h6><ul><li v-for="(item, index) in listValue" :key="item.value">{{ item.label }}</li></ul></div><div class="content1"><h6>v-pre使用</h6><p v-pre>我是不需要編譯的<span>{{ textValue }}</span></p></div><div class="content1"><h6>v-cloak使用</h6><p v-cloak>{{ textValue }}</p></div><div class="content1"><h6>v-once使用</h6><el-button @click="changeNumberVal">修改值</el-button><p v-once>不變的:{{ numberVal }}</p><p>變化的的:{{ numberVal }}</p></div></el-tab-pane><el-tab-pane label="復雜指令" name="second"><div class="content2"><h6>v-on使用(簡寫為@)</h6><el-button v-on:click="clickFun">常規點擊</el-button><el-button @click="clickFun">簡寫常規點擊</el-button><el-button v-on:[eventName]="clickFun">動態事件</el-button><el-button @[eventName]="clickFun">動態事件簡寫</el-button><el-button @click.once="clickFun">只生效一次</el-button><br><a href="http://www.baidu.com" @click="clickFun"><el-button>無限制跳轉</el-button></a><a href="http://www.baidu.com" @click.prevent="clickFun"><el-button>阻止默認事件</el-button></a><br><p @click="clickPFun"><span @click="clickSpanFun"><el-button @click="clickFun">節點嵌套事件冒泡</el-button></span><span @click="clickSpanFun"><el-button @click.stop="clickFun">阻止事件冒泡</el-button></span></p><br><input v-model="inputValue" @keyup.enter="inputEventFun" type="text"><el-input v-model="inputValue" @keyup.native.enter="inputEventFun"></el-input><Child @click.native="componentClick"></Child><br><button v-on="{ mousedown: mousedownFun, mouseup: mouseUpFun }">對象語法</button></div><div class="content2"><h6>v-bind使用</h6><p v-bind:class="className">動態class</p><p :style="styleName">動態樣式加簡寫</p><el-button :name1="name1" :name2="name2" name3="屬性3" ref="btn1"@click="checkBtn1">查看element按鈕組件的自定義屬性</el-button><button :name1="name1" :name2="name2" name3="屬性3" ref="btn2" @click="checkBtn2">查看原生dom的自定義屬性</button></div><div class="content2"><h6>v-model使用</h6><p>常規v-model<el-input v-model="InputVal"></el-input></p><p>lazy修飾符<input v-model.lazy="InputLazyVal" @input="inputLazyFun" /></p><p>number修飾符<el-input v-model.number="InputNumberVal"></el-input></p><p>trim修飾符<el-input v-model.trim="InputTrimVal"></el-input></p></div><div class="content2"><h6>v-slot使用</h6>具體參考插槽吧,這里不做演示了</div></el-tab-pane><el-tab-pane label="自定義指令" name="third"><h6>固定顏色指令</h6><p v-color>固定紅色的指令效果</p><hr><h6>自定義顏色</h6>選擇一個顏色吧:<el-color-picker v-model="colorValue"></el-color-picker><p v-setColor="colorValue">我是一段可選擇顏色的字段</p><hr><h6>可拖拽指令</h6><div class="dragBox"><div class="dragContent" v-draggable></div></div></el-tab-pane></el-tabs></div>
</template>
<script>
import Child from './child.vue'
export default {name: 'instructions',data() {return {activeName: 'first',textValue: '這是一段常規文字',htmlTemplate: `<div><input/><button>按鈕</button></div>`,checkedValue: true,numValue: 0,numberVal: 100,inputValue: '輸入框的值',listValue: [{label: '文字1',value: 'one'},{label: '文字2',value: 'two'},{label: '文字3',value: 'three'}],eventName: 'click',className: 'classP',styleName: {color: 'green'},name1: '屬性1',name2: JSON.stringify({value: '屬性3'}),InputVal: '常規輸入框的值',InputLazyVal: 'lazy輸入框的值',InputNumberVal: 1,InputTrimVal: '去空輸入框的值',colorValue: '#000',}},directives: {color: {// 指令的定義inserted: function (el) {el.style.color = 'red'}}},components: {Child},methods: {addNum() {this.numValue++},deleteNum() {this.numValue--},changeNumberVal() {this.numberVal++},clickFun() {console.log('常規點擊')},clickPFun() {console.log('點擊p標簽')},clickSpanFun() {console.log('點擊span標簽')},inputEventFun() {console.log(this.inputValue, '輸入框的值')},componentClick(e) {console.log(e, '點擊了組件')},mousedownFun() {console.log('鼠標按下')},mouseUpFun() {console.log('鼠標抬起')},checkBtn1() {let btn1 = this.$refs.btn1console.log(btn1, 'element組件按鈕')console.log(btn1.$attrs['name1'], JSON.parse(btn1.$attrs['name2']), btn1.$attrs['name3'], '按鈕的屬性')},checkBtn2() {let btn2 = this.$refs.btn2console.log(btn2, 'btn的節點')console.log(btn2.getAttribute('name1'), JSON.parse(btn2.getAttribute('name2')), btn2.getAttribute('name3'), '按鈕的屬性')},inputLazyFun() {console.log(this.InputLazyVal, 'lazy值')},},
}
</script>
<style lang="less" scoped>
.box {padding: 14px;.content1 {float: left;width: 30%;height: 200px;margin: 10px;padding: 8px;box-shadow: 1px 1px 1px 1px #837e7e;h6 {font-size: 14px;font-weight: 600;}}.content2 {float: left;width: 40%;height: 350px;margin: 10px;padding: 8px;box-shadow: 1px 1px 1px 1px #837e7e;h6 {font-size: 14px;font-weight: 600;}}}[v-cloak] {display: none;
}.classP {color: red;
}.dragBox {position: relative;width: 800px;height: 200px;border: 1px solid #000;.dragContent {position: absolute;width: 50px;height: 50px;background: red;cursor: move;left: 10px;top: 10px;}
}
</style>

自定義指令文件

import Vue from 'vue'
import _ from 'lodash'
Vue.directive('setColor',{inserted:function(el,val,vnode){console.log(el,val,vnode,'???自定義函數')el.style.color = val.value || '#000'},update:function(el,val,vnode){console.log(el,val,vnode,'???自定義函數')el.style.color = val.value || '#000'},
})Vue.directive('draggable',{inserted: function (el) {el.onmousedown = function (e) {var disx = e.pageX - el.offsetLeft;var disy = e.pageY - el.offsetTop;document.onmousemove = function (e) {el.style.left = e.pageX - disx + 'px';el.style.top = e.pageY - disy + 'px';}document.onmouseup = function () {document.onmousemove = document.onmouseup = null;}}},
})

那個child組件我沒有寫,隨便定義一個就行,這些代碼可以直接復制測試

感覺有用就給個贊吧!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無邊界電視點播TVbox殼+源

TBBox可以是個盒子也可以是軟件 視頻播放的困局新的改變TVBox apk更成熟的熊貓寶盒_3.10還有這個沒測試恒星TV 寫在最后 視頻播放的困局 現在電視上幾大平臺看劇集都要充會員&#xff0c;而電腦上網頁端有很多可以看的網頁&#xff0c;只有 隨便一搜就測出來&#xff0c;只是經…

數據安全第一:應對[[MyFile@waifu.club]].wis勒索病毒的實用建議與技巧

引言&#xff1a; 在當今數字化時代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一種惡意軟件&#xff0c;其危害用戶數據安全&#xff0c;通過加密文件并勒索贖金來獲取經濟利益。以下是對[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

進入PyTorch的官網&#xff1a; pytorch GitHub 點擊GitHub&#xff1a; 進入PyTorch的主目錄&#xff1a; 進入Vision reference&#xff1a; detection&#xff1a; 這就是我們在訓練過程中會使用到的文件了&#xff1a;

objdump反匯編文件解析

命令使用 objdump可以對可執行文件進行反匯編 其常用參數為: objdump -d <file(s)>: 將代碼段反匯編&#xff1b;objdump -S <file(s)>: 將代碼段反匯編的同時&#xff0c;將反匯編代碼與源代碼交替顯示&#xff0c;編譯時需要使用-g參數&#xff0c;即需要調試信…

Hadoop技術與應用的習題

第一章測驗 1、下面哪個選項不屬于Google的三駕馬車&#xff1f; A.HDFS B.MapReduce C.BigTable D.GFS 2、下面哪個思想是為了解決PageRank&#xff08;網頁排名&#xff09;的問題&#xff1f; A.GFS B.BigTable C.MapReduce D.YARN 3、GFS 存儲的文件都被分割成固定大小的…

CAN基礎知識

CAN 簡介 CAN 是 Controller Area Network 的縮寫&#xff08;以下稱為 CAN&#xff09;&#xff0c;是 ISO 國際標準化的串行通信 協議。在當前的汽車產業中&#xff0c;出于對安全性、舒適性、方便性、低公害、低成本的要求&#xff0c;各種 各樣的電子控制系統被開發了出來…

簡單的用Python采集股票數據,保存表格后分析歷史數據

前言 字節跳動如果上市&#xff0c;那么鐘老板將成為我國第一個世界首富 趁著現在還沒上市&#xff0c;咱們提前學習一下用Python分析股票歷史數據&#xff0c;抱住粗大腿坐等起飛~ 好了話不多說&#xff0c;我們直接開始正文 準備工作 環境使用 Python 3.10 解釋器Pychar…

如何應用ChatGPT撰寫、修改論文及工作報告,提供寫作能力及優化工作??

如果我想讓gpt從pdf文檔中提取相關關鍵詞的內容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我們評論區討論 ChatGPT 在論文寫作與編程方面也具備強大的能力。無論是進行代碼生成、錯誤調試還是解決編程難題&#xff0c;ChatGPT都能為您提供實用且高質量的建議和指導&am…

愛上C語言:scanf、gets以及getchar輸入字符串你真的懂了嗎

&#x1f680; 作者&#xff1a;阿輝不一般 &#x1f680; 你說呢&#xff1a;不服輸的你&#xff0c;他們拿什么贏 &#x1f680; 專欄&#xff1a;愛上C語言 &#x1f680;作圖工具&#xff1a;draw.io(免費開源的作圖網站) 如果覺得文章對你有幫助的話&#xff0c;還請點贊…

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

spring 是如何開啟事務的, 核心原理是什么

文章目錄 spring 是如何開啟事務的核心原理1 基于注解開啟事務2 基于代碼來開啟事務 spring 是如何開啟事務的 核心原理 Spring事務管理的實現有許多細節&#xff0c;如果對整個接口框架有個大體了解會非常有利于我們理解事務&#xff0c;下面通過講解Spring的事務接口來了解…

建行廣東省江門市分行走進農村地區開展反假貨幣宣傳

人民對美好生活的向往&#xff0c;涉及方方面面&#xff0c;小至“錢袋子”安全。建行廣東省江門市分行落實當地監管部門部署&#xff0c;積極扛起維護國家金融安全的重要政治責任&#xff0c;深入農村地區開展反假貨幣宣傳工作&#xff0c;助力構建農村反假貨幣工作長效機制。…

Hyper-V系列:windows11開啟系統自帶安卓虛擬機并安裝apk包

本文記錄了Windows11系統下開啟系統自帶的安卓虛擬機,并通過安裝包安裝自定義應用的過程。開啟系統自帶的安卓虛擬機流程為:開啟Hyper-V、安裝Windows11子系統;安裝apk安裝包的流程為:安裝adb調試工具、開啟子系統的開發者模式、安裝apk應用包。 一. 開啟Hyper-V Hyper-V…

[BJDCTF2020]The mystery of ip1

提示 ssti模板注入head頭x-forwarded-for 每一次做題的最開始流程都大致因該是 信息收集找可以操控的地方 查看hint頁面的源代碼又發現它提示說 ####你知道為什么會知道你的ip嗎 查看flag頁面 從剛才給我的提示以及他這里顯示的我的ip&#xff0c;大概找到了我可操作的可控點 …

【Vue】創建第一個實例

步驟&#xff1a; 1.創建容器 2.引包 3.創建實例 4.添加配置項 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--準備容器 --> <di…

【C語言:深入理解指針二】

文章目錄 1. 二級指針2. 指針數組3. 字符指針變量4. 數組指針變量5. 二維數組傳參的本質6. 函數指針變量7. 函數指針數組8. 轉移表9. 回調函數10. qsort函數的使用與模擬實現 1. 二級指針 我們知道&#xff0c;指針變量也是變量&#xff0c;它也有自己的地址&#xff0c;使用什…

【面試】jvm中堆是分配對象存儲的唯一選擇嗎

目錄 一、說明二、逃逸分析2.1 說明2.2 參數設置 一、說明 1.在《深入理解Java虛擬機》中關于Java堆內存有這樣一段描述:隨著JIT編譯期的發展與逃逸分析技術逐漸成熟&#xff0c;棧上分配、標量替換優化技術將會導致一些微妙的變化&#xff0c;所有的對象都分配到堆上也漸漸變得…

牛客 最小公配數 golang版實現

題目請參考: HJ108 求最小公倍數 題解: 在大的數的倍數里面去找最小的能整除另外一個數的數&#xff0c;就是最小公倍數&#xff0c;按照大的來找&#xff0c;循環次數能夠降到很少&#xff0c;提升效率 golang實現: package mainimport ("fmt" )func main() {a : …

CSDN最新最全python+pytest接口自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試腳本)

經過之前的學習鋪墊&#xff0c;我們嘗試著利用pytest框架編寫一條接口自動化測試用例&#xff0c;來厘清接口自動化用例編寫的思路。 我們在百度搜索天氣查詢&#xff0c;會出現如下圖所示結果&#xff1a; 接下來&#xff0c;我們以該天氣查詢接口為例&#xff0c;編寫接口測…

JVM 之 class文件詳解

目錄 一. 前言 二. class文件結構 2.1. 文件格式 2.2. 魔數與版本號 2.3. 常量池 2.4. 訪問標志 2.5. 類索引、父類索引和接口索引集合 2.6. 字段表集合 2.7. 方法表集合 2.8. 屬性表集合 2.8.1. Code 屬性表 2.8.2. Exceptions 屬性 2.8.3. LineNumberTable 屬性…