Vuejs進階知識(二十四)【自定義Directive】
Vuejs除了自身提供的 v-if
, v-model
等標準的Directive
之外, 還提供了非常強大的自定義功能。 使用這個功能,我們就可以定義屬於我們自己的Directive
.
例子
我們看下面例子:
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id='app'>
下面是使用了自定義的Directive的input, 可以自動聚焦( 呼叫 focus() 方法) : <br/>
<br/>
<input v-myinput/>
</div>
<script>
var app = new Vue({
el: '#app',
directives: {
"myinput": {
inserted: function(element){
element.focus()
}
}
}
})
</script>
</body>
</html>
上面的程式碼中, 先是在 Vue中,定義了一個 directives
程式碼段:
directives: {
myinput: {
inserted: function(element){
element.focus()
}
}
}
myinput
就是自定義Directive
的名字。 使用的時候就是v-myinput
.inserted
: 這是一個定義好的方法(鉤子方法),表示在頁面被Vuejs渲染的過程中, 在該DOM被 “insert”(插入)到頁面中的時候,被觸發。
觸發的內容是element.focus()
用瀏覽器開啟後,可以看到<input/>
標籤是會自動聚焦的。 這個時候使用者就可以直接輸入內容了。 如下圖所示:
如果在 “webpack” 等可以修改 “全域性Vue例項”的時候,也可以使用這樣的方法:
Vue.directive('myinput', {
inserted: function (elemenet) {
element.focus()
}
})
自定義Directive
的命名方法
如果您希望把 v-myinput
的呼叫,寫成 v-my-input
, 那麼在定義的時候,就應該:
directives: {
// 注意下面的寫法. 使用雙引號括起來
"my-input": {
inserted: function(element){
element.focus()
}
}
}
那麼我們就可以在View中這樣使用了:
<input v-my-input />
鉤子方法 (Hook Functions
)
我們在上面的例子中,知道了 inserted
是一個鉤子方法。 下面是一個完整的列表:
bind
只執行一次。 當該元素首次被渲染的時候。(繫結到頁面的時候)inserted
該元素被插入到父節點的時候(也可以認為是該元素被Vue渲染的時候)update
該元素被更新的時候。componentUpdated
包含的component
被更新的時候。unbind
只會執行一次。 當該元素被Vuejs
從頁面解除繫結的時候。
自定義Directive
可以接收到的引數
Vuejs 為自定義Directive
實現了強大了功能, 可以接收很多個引數。 下面是個例子:
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id='app'>
下面是一個非常全面的自定義Directive的例子: <br/>
<br/>
<input v-my-input:foo.click="say_hi" />
</div>
<script>
var a
var app = new Vue({
el: '#app',
data: {
say_hi: '你好啊,我是個value'
},
directives: {
"my-input": {
inserted: function(element, binding, vnode){
element.focus()
console.info("binding.name: " + binding.name)
console.info("binding.value: " + binding.value)
console.info("binding.expression: " + binding.expression)
console.info("binding.argument: " + binding.arg)
console.info("binding.modifiers: ")
console.info(binding.modifiers)
console.info("vnode keys:")
console.info(vnode)
}
}
}
})
</script>
</body>
</html>
先看執行結果:
在上圖中,可以看到, 自定義Directive
在宣告的時候,接收了3個引數: function(element, binding, vnode)
通過這三個引數,就可以看到很多對應的內容,包括 binding.name
, binding.value
, binding.expression
. 他們的含義都是字面的意思。
藉助這些內容,我們可以實現我們自己想要的Directive
.
實戰經驗
1.優先考慮使用Component
.
考慮到維護成本。 它的作用跟 JSP
中的自定義標籤是一樣的。 與其使用 Directive
, 不如使用 Component
.
2.如果一定要用,把它實現的儘量簡單。
如果接手的新人水平不如你,那他很可能讀不懂這塊程式碼。
相關文章
- Vuejs進階知識(十八)【component 進階知識】VueJS
- Vuejs進階知識(十六)【mixin】VueJS
- Vuejs進階知識(十九)【slot】VueJS
- Vuejs進階知識(十七)【computed properties】VueJS
- Vuejs進階知識(二十一)【生命週期,最佳實踐】VueJS
- Vue 自定義元件directive使用總結Vue元件
- 深入解析Vue.directive 自定義指令Vue
- Vuejs進階知識(二十三)【與CSS前處理器結合使用】VueJSCSS
- js 進階知識JS
- Vuejs基本知識(九)【路由】VueJS路由
- Android進階知識:ThreadLocalAndroidthread
- Android 自定義 View 最少必要知識AndroidView
- 自定義View事件之進階篇(四)-自定義Behavior實戰View事件
- 自定義View事件篇進階篇(二)-自定義NestedScrolling實戰View事件
- Angular 自定義結構型指令 structural directive 的使用AngularStruct
- 前端進階知識彙總前端
- Redis進階知識一覽Redis
- gRPC(七)進階:自定義身份驗證RPC
- Vuejs基本知識(十)【使用樣式】VueJS
- Android進階知識:Handler相關Android
- Android知識進階樹——Window & ViewRootImplAndroidView
- Python進階:自定義物件實現切片功能Python物件
- Vuejs基本知識(十三)【表單的提交】VueJS
- 利用vuejs+element-ui+Parcel搭建自定義後臺VueJSUI
- 有關自定義View的學習知識點View
- 前端進階必備知識彙總前端
- AcWing 進階課知識點模板梳理
- CoreText進階(七) 新增自定義View和對其View
- [iOS] [OC] NSNotificationCenter 進階及自定義(附原始碼)iOS原始碼
- Vuejs基本知識(四)【頁面渲染過程 】VueJS
- Vuejs基本知識(五)【檢視中的渲染】VueJS
- Vuejs基本知識(十二)【表單的繫結】VueJS
- Android進階——自定義View之雙向選擇SeekbarAndroidView
- WordPress主題製作進階#10自定義主頁
- react-native-vector-icons進階教程(自定義iconfont使用)React
- 自定義View事件篇進階篇(三)-CoordinatorLayout與BehaviorView事件
- Android進階:十、自定義視訊播放器 1Android播放器
- Android進階:九、自定義View之手寫Loading動效AndroidView