- vừa được xem lúc

Vuejs và những kiến thức cần biết (P2)

0 0 33

Người đăng: Lê Xuân Quang

Theo Viblo Asia

1. Giới thiệu

Trong của bài viết Vuejs và những kiến thức cần biết chúng ta đã tìm hiểu về Vue Instance, Template Synxtax, Methods, Computed, Watcher. Nếu các bạn chưa đọc thì có thể đọc bài viết tại đây. Trong phần này chúng ta sẽ tìm hiểu thêm về Vue Component và Mixins trong Vuejs, chúng ta cùng bắt đầu ngay thôi nào.

2. Vue Component

Component là một khái niệm quen thuộc nếu các bạn đã từng sử dụng framework khác như Reactjs. Hiểu đơn giản thì component trong Vuejs là một đối tượng có thể được tái sử dụng. Việc tái sử dụng code giúp

// Define a new component called button-counter
Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

Sử dụng component <button-counter>

<div id="components-demo"> <button-counter></button-counter>
</div>

Một ứng dụng Vuejs thường được tổ chức theo dạng cây với các component cha và component con. image.png

Component Registration

Các component muốn sử dụng được thì phải được đăng ký. Có hai cách đăng ký component là toàn cục và cục bộ. Ngoài cách đăng ký thì cũng cần để ý tới quy tắc đặt tên cho component. Bạn có hai lựa chọn cho việc đặt tên compoent là kebab-casePascalCase.

  • Global Registration

Các component sau khi được đăng ký toàn cục thì có thể sử dụng trong template của bất cứ Vue Instance gốc nào. Ngoài ra thì các component con có thể sử dụng lẫn nhau.

Vue.component('my-component-name', { // ... options ...
})
new Vue({ el: '#app' })
<div id="app"> <my-component-name></my-component-name>
</div>
  • Local Registration

Đối với các component được đăng ký cục bộ thì khi sử dụng thì phải khai báo trong thuộc tính components .

var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
new Vue({ el: '#app' components: { 'component-a': ComponentA, 'component-b': ComponentB }
})

Props

Ở trên chúng ta đã nói một ứng dụng Vuejs thường được xây dựng trên các cây component gồm các component cha và component con. Một cây component thì việc nhu cầu truyền dữ liệu từ component cha xuống component con là điều không thể thiếu, và props là công cụ giúp giải quyết vấn đề này.

Vue.component('blog-post', { props: ['title'], template: '<h3>{{ title }}</h3>'
})
<blog-post :title="post.title"></blog-post>

Ở trên chúng ta sử dụng một directive là v-bind ở dạng rút gọn : để truyền dữ liệu xuống component con.

Props nhận vào các kiểu dữ liệu Object, String, Number, Array, Function, Boolean, Date, Symbol và số lượng props trong một component là không giới hạn. Ngoài kiểu dữ liệu thì khi khai báo props còn có thêm hai option là requỉed, defaultvalidattor.

Slots

Slots được sử dụng để tạo ra các khung component, khi đó chúng ta có thể truyền nội dung vào các component tại vị trí của slot.

<div class="demo-alert-box"> <strong>Lỗi!</strong> <slot></slot>
</div>
  • Name Slots

Đôi khi trong một component có nhiều slot, khi đó chúng ta sẽ không biết nên hiển thị như nào theo đúng ý. Khi đó chúng ta sử dụng thuộc tính name cho slot Chúng ta có một ví dụ layout như dưới đây:

<div class="container"> <header> <slot name="header"></slot> </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer>
</div>

và để hiển thị đúng vị trí các slot đã được đặt tên thì chúng ta sử dụng thuộc tính slot cho các thẻ template (có thể sử dụng các thẻ bình thường khác). Ngoài ra thì chúng ta có một vị trí slot chưa được đặt tên, đó là default slot, nó dùng để hiển thị các nội dung không ghép được với các slot khác.

<base-layout> <template slot="header"> <h1>Here might be a page title</h1> </template> <p>A paragraph for the main content.</p> <p>And another one.</p> <template slot="footer"> <p>Here's some contact info</p> </template>
</base-layout>

3. Mixins

Mixins là một giải pháp mà Vuejs cung cấp cho chúng ta để có thể tái sử dụng các chức năng cho các component. Một object mixin có thể chứa bất kì những tùy chọn nào của component. Khi một component sử dụng một mixin, tất cả những tùy chọn trong mixin sẽ được “hòa trộn” (mixed) vào trong tùy chọn của component đó.

// define a mixin object
var myMixin = { created: function () { this.hello() }, methods: { hello: function () { console.log('hello from mixin!') } }
} // define a component that uses this mixin
var Component = Vue.extend({ mixins: [myMixin]
}) var component = new Component() // => "hello from mixin!"

Vậy điều gì xảy ra nếu như cả component và mixin đều chưa các tùy chọn giống nhau? Chúng sẽ được merge lại và có thứ tự ưu tiên riêng cho từng tùy chọn nếu như có sự xung đột. Ví dụ như các tùy chọn data, methods, components, directives có xảy ra xung đột thì component sẽ được ưu tiên so với mixins.

var mixin = { data: function () { return { message: 'hello', foo: 'abc' } }, methods: { foo: function () { console.log('foo') }, conflicting: function () { console.log('from mixin') } }
} new Vue({ mixins: [mixin], data: function () { return { message: 'goodbye', bar: 'def' } }, methods: { bar: function () { console.log('bar') }, conflicting: function () { console.log('from self') } }
})
// data => { message: "goodbye", foo: "abc", bar: "def" }
// conflicting() => "from self" 

Ngoài ra thì còn có các lifecycle hooks trùng tên nhau thì được merge lại với nhau thành một mảng và được gọi theo thứ tự mixins ưu tiên trước component.

var mixin = { created: function () { console.log('mixin hook called') }
} new Vue({ mixins: [mixin], created: function () { console.log('component hook called') }
}) // => "mixin hook called"
// => "component hook called"

4. Tổng kết

Trong bài này chúng ta đã tìm hiểu thêm về component và mixins trong Vuejs và cũng là phần cuối về chủ đề tìm hiểu Vuejs cơ bản. Mong nó có thể đem lại thêm phần nào kiến thức cho các bạn. Cảm ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong bài viết tiếp theo.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tôi đã tạo một custom hook trong Vue 3 thế nào?

Xin chào mọi nguời , mình là một coder vô danh kinh nghiệm chưa nhiều lần đầu viết bài nên bố cục , từ ngữ, kiến thức có chỗ chưa được đúng mong mọi người góp ý nhẹ tay ạ. . . .

0 0 239

- vừa được xem lúc

asyncData và fetch trong Nuxt JS khác nhau như nào?

Mở đầu. Khi làm việc với NuxtJS chắc hẳn chúng ta đều sẽ nghe thấy đâu đó hai khái niệm này là fetch và asyncData. Vậy hai phương thức này nó giống nhau và khác nhau như nào? Khi nào nên sử dụng từng phương thức cho phù hợp. .

0 0 65

- vừa được xem lúc

Tìm hiểu cơ bản về Props trong VueJS

1. Props là gì. . Props are custom attributes you can register on a component.

0 0 255

- vừa được xem lúc

Tạo contact form đơn giản bằng VueJS và Firebase

1.Seting up Firebase. Truy cập vào firebase cloud console và tiến hành thiết lập project và đây sẽ là nơi lưu trữ database project của bạn. npm install firebase --save.

0 0 186

- vừa được xem lúc

Tìm hiểu cơ bản về Vuex Store

1. Creating a Store.

0 0 63

- vừa được xem lúc

Những kiến thức VueJs cơ bản [P1]

Xin chào mọi người. Trước mình cũng viết một số bài với chủ đề về VueJs rồi nhưng chưa đầy đủ, nay mình bắt đầu viết trọn bộ series kiến thức cơ bản về VueJs mong mọi người cùng đón đọc.

0 0 126