Directives, Mixins, Plugins === --- ### 1. Directives #### Vue Directives là một đoạn lệnh nhỏ mà có thể chèn chúng vào các phần tử DOM. Tên của các đoạn lệnh đó được bắt đầu bằng tiền tố v- --- - Directives mặc định: - v-bind - v-if - v-else - v-model - v-on - v-for --- ### Cách khai báo directives - Directive toàn cục ```javascript= Vue.directive('focus', { // Khi phần tử liên quan được thêm vào DOM... inserted: function (el) { // Ta gán focus vào phần tử đó el.focus() } }) ``` - Directive cục bộ ```javascript= directives: { focus: { // định nghĩa cho directive inserted: function (el) { el.focus() } } } ``` --- ### Các hàm hook - bind: được gọi khi directives được gắn vào element. - inserted: được gọi khi element đã được chèn (insert) vào phần tử cha nhưng chưa được đưa vào DOM. - updated: được gọi khi các thành phần của component/element có directives đã được cập nhật, nhưng nhiều khả năng là sẽ xảy ra trước khi các component/element con của chúng. --- - componentUpdated: được gọi khi các thành phần của component/element có directives và con của chúng đã được cập nhật. - unbind: được gọi khi directives bị huỷ bỏ. --- ### Tham số các hàm hook - el: Phần tử được directive bind vào. Tham số này có thể được dùng để thay đổi DOM một cách trực tiếp. - vnode: Vnode được trình biên dịch của Vue tạo ra. - oldvNode: chỉ tồn tại trong các hook update và componentUpdated --- - bindind: Object chứa các thuộc tính - name: tên của directive - value: giá trị của directive - expression: Biểu thức của binding dưới dạng chuỗi - arg: Tham số được truyền vào directive - modifiers: Một object chứa các modifier --- ```javascript= <div id="hook-arguments-example" v-demo:foo.a.b="message"></div> ``` ```javascript= Vue.directive('demo', { bind: function (el, binding, vnode) { var s = JSON.stringify el.innerHTML = 'name: ' + s(binding.name) + '<br>' + 'value: ' + s(binding.value) + '<br>' + 'expression: ' + s(binding.expression) + '<br>' + 'argument: ' + s(binding.arg) + '<br>' + 'modifiers: ' + s(binding.modifiers) + '<br>' + 'vnode keys: ' + Object.keys(vnode).join(', ') } }) new Vue({ el: '#hook-arguments-example', data: { message: 'Cà rốt' } }) ``` --- ### 2. Mixins #### Khi dự án VueJS ngày càng lớn, thì việc lặp lại code ở data, methods, watchers, ... trong các components xảy ra rất thường xuyên #### => Mixins sinh ra để giải quyết vấn đề tái sử dụng --- ### Mixins là gì? #### Mixin là 1 Obj có thể chứa toàn bộ các options của 1 component (data,methods,hooks…) ```javascript= var myMixin = { data: function () { return { message: 'hello', foo: 'abc' } }, created: function () { this.hello() }, methods: { hello: function () { console.log('hello from mixin!') } } } ``` --- ### Cách khai báo - Global ```javascript= Vue.mixin({ created: function () { var myOption = this.$options.myOption if (myOption) { console.log(myOption) } } }) new Vue({ myOption: 'hello!' }) ``` --- - Local ```javascript= var myMixin = { created: function () { this.hello() }, methods: { hello: function () { console.log('hello from mixin!') } } } // define a component that uses this mixin new Vue({ mixins: [myMixin] }) ``` --- ### Option merging ![](https://images.viblo.asia/7249469b-48d2-4d54-8990-8a04487eb1ad.jpg) --- ### 3.Plugin #### Các Plugin được dùng để bổ sung tính năng cho Vue ở cấp toàn cục. --- ### Viết plugin #### Chúng ta có thể phân loại plugin như sau - Thêm một số phương thức hoặc thuộc tính toàn cục, ví dụ như vue-custom-element - Thêm một hoặc nhiều directive/filter/transition vân vân, ví dụ như vue-touch --- - Thêm tùy chọn cho component thông qua mixin cấp toàn cục, ví dụ như vue-router - Thêm một số phương thức đối tượng bằng cách đính kèm vào Vue.prototype. - Một thư viện cung cấp API riêng và cùng lúc đó thêm một hoặc vài tính năng được liệt kê trên đây, ví dụ vue-router --- ### Sử dụng plugin #### Sử dụng một plugin bằng cách gọi phương thức toàn cục Vue.use() ```javascript= Vue.use(MyPlugin) ``` ---
{"metaMigratedAt":"2023-06-15T12:05:41.326Z","metaMigratedFrom":"Content","title":"Directives, Mixins, Plugins","breaks":true,"contributors":"[{\"id\":\"cabd3103-7ae1-4094-ac03-f9183a83df74\",\"add\":7040,\"del\":2655}]"}
    254 views