2017-08-17 66 views
1

我建立自定義的指令,它存儲在它自己的文件vuejs定製指令似乎沒有註冊

autosize.js,它看起來像這樣:

import Vue from 'vue' 
import autosize from 'autosize' 

Vue.directive('autosize', { 
    bind: function() { 
     console.log('autosize bind') 
     var self = this 
      Vue.nextTick(function() { 
      autosize(self.el) 
     }) 
    }, 

    update: function(value) { 
     console.log('autosize update') 
     var self = this 
     Vue.nextTick(function() { 
      self.el.value = value 
      autosize.update(self.el) 
     }) 
    }, 

    unbind: function() { 
     autosize.destroy(this.el) 
    } 
}) 

我使用它的文件組件內部並導入這樣的:

import Autosize from 'components/directives/autosize.js' 

註冊這樣的:

 directives: { 
      Autosize 
     } 

在我的文件組件我嘗試使用這樣的:

<textarea v-autosize="input" :value="input" @input="update" class="form-control">{{input}}</textarea> 

自動調整是應該使textarea的成長插件,當我測試增加更多的文字ofcourse沒有任何反應。但是似乎它不自動調整失敗的工作,但也許我錯過了一些東西,甚至沒有這些得到印刷:

console.log('autosize bind') 

console.log('autosize update') 

當我動態創建的組件。

任何人都有一個想法,我已經錯過了,使指令沒有約束力或更新?

+0

在Vue公司2,用類似這樣的代碼工作典型的方法是使用一個包裝組件。但是就這條指令而言,'el'作爲指令中的一個參數被傳入,它不可用'this'(或'this'重命名爲'self')。 – Bert

回答

2

您通常用Vue 2中的包裝器組件包裝這樣的庫。下面是一個示例autosize組件。

const AutoSize = { 
    props:["value"], 
    template: `<textarea v-model="internalValue"></textarea>`, 
    computed:{ 
    internalValue:{get(){return this.value}, set(v){this.$emit('input', v)}} 
    }, 
    mounted(){ autosize(this.$el)}, 
    beforeDestroy(){ autosize.destroy(this.$el) } 
} 

這是一個工作示例。

console.clear() 
 

 
const AutoSize = { 
 
    props:["value"], 
 
    template: `<textarea v-model="internalValue"></textarea>`, 
 
    computed:{ 
 
    internalValue:{get(){return this.value}, set(v){this.$emit('input', v)}} 
 
    }, 
 
    mounted(){ autosize(this.$el)}, 
 
    beforeDestroy(){ autosize.destroy(this.$el) } 
 
} 
 

 
new Vue({ 
 
    el: "#app", 
 
    components:{autosize: AutoSize} 
 
})
<script src="https://unpkg.com/[email protected]"></script> 
 
<script src="https://unpkg.com/[email protected]"></script> 
 
<div id="app"> 
 
    Paste a large amount of text: 
 
    <hr> 
 
    <autosize></autosize> 
 
</div>

但如果你真的想用一個指令,正如我在你的問題發表評論時提及,el是該指令掛鉤的參數。這是一個工作指令。

Vue.directive("autosize", { 
    bind(el){ autosize(el) }, 
    inserted(el) { autosize.update(el) }, 
    update(el){ autosize.update(el) }, 
    unbind(el){ autosize.destroy(el) } 
}) 

console.clear() 
 

 
Vue.directive("autosize", { 
 
    bind(el){ autosize(el) }, 
 
    inserted(el) { autosize.update(el) }, 
 
    update(el){ autosize.update(el) }, 
 
    unbind(el){ autosize.destroy(el) } 
 
}) 
 

 
new Vue({ 
 
    el: "#app", 
 
})
<script src="https://unpkg.com/[email protected]"></script> 
 
<script src="https://unpkg.com/[email protected]"></script> 
 
<div id="app"> 
 
    Paste a large amount of text: 
 
    <hr> 
 
    <textarea v-autosize cols="30" rows="10"></textarea> 
 
</div>

如果包括了該指令,因爲在你的components/directives/autosize.js文件,而不導出,我希望它在全球範圍內的工作,因爲Vue.directive寄存器指令。如果您想本地註冊它,則文件應該是這樣的:

import Vue from 'vue' 
import autosize from 'autosize' 

export default { 
    bind(el){ autosize(el) }, 
    inserted(el) { autosize.update(el) }, 
    update(el){ autosize.update(el) }, 
    unbind(el){ autosize.destroy(el) } 
} 
+0

Hi Bert,在你最後一個沒有使用Vue.directive的例子中導出的例子是正確的,還是忘了添加它?現在Vue如何知道它正在處理指令? –

+1

@maxit我沒有忘記它。在要使用它的組件中,您需要從components/directives/autosize.js中導入autosize,然後在組件中使用{autosize:autosize}指令。只有當你想在本地註冊指令時纔會這樣。 'Vue.directive' *全局*註冊它。 – Bert

相關問題