Ví dụ về Data và Method
Demo ví dụ minh họa Data Method.
V-BIND
Trong VueJS thường sử dụng những directive hay còn gọi là các thành phần trong VueJS những thành phần này bắt đầu bằng v-
Cú pháp mustache không dùng được bên trong các thuộc tính HTML. Thay vào đó, bạn hãy dùng directive v-bind:
Một số v-bind thông dụng
Thuộc tính v-bind:href
cho phép ta thêm đường dẫn URL
Thuộc tính v-bind:style
Cho phép ta định dạng style bằng VueJS
Thuộc tính v-bind:id
cho phép sử dụng thuộc tính id trong VueJS
Tác dụng của việc sử dụng của những thẻ này cho phép ta sử dụng thuộc tính dynamic (thuộc tính động)
Computed property và watcher
ComputedĐược sinh ra sau thực hiện một hàm. Thường thì viết trực tiếp trong template bằng cách gọi
trực tiếp trong cặp dấu {{}}
, Computed không có tham số truyền vào
BÀI TOÁN CON GIÁP - (COMPUTED)
TÍNH CAN CHI TỪ MỘT NĂM NHẬP TỪ BÀN PHÍM
Con người sinh ra thuộc 12 con giáp: Tý, Sửu, Dần, Mẹo, Thìn, Tị, Ngọ, Mùi, Thân, Dậu, Tuất, Hợi
Đồng thời chúng ta còn 10 thiên can như sau: Canh, Tân, Nhâm, Quý, Giáp, Ất, Bính, Đinh, Mậu và Kỷ
Bài toán nhập vào một năm đưa ra năm đó là nằm gì. Ví dụ như năm 2020 là năm Canh Tý
Năm vừa nhập là năm: {{tinhcan}}
So sánh Computed và Methods
Computed | Methods |
---|---|
- KHÔNG có tham số đầu vào. Gọi trong temple chỉ cần ghi - Khi nào có sự thay đổi của data thì Ví dụKhi gọi tinhTong+2 thì computed đã được tính lúc trước là kết quả là 3 rồi nên không cần tính lại kết quả ra 4 |
- CÓ có tham số đầu vào. Gọi trong temple phải có dấu
() - Sử dụng Ví dụKhi gọi tinhTong2()+2 thì methods sẽ thực hiện hàm tính tổng trước để ra kết quả là 2 sau đó + 2 tiếp tục kết quả ra là 4 |
ỨNG DỤNG ĐẶT CÂU HỎI VÀ TRẢ LỜI YES/NO - (WATHCER)
Đặt câu hỏi có dấu "?" sao đó API sẽ trả về kết quả YES/NO
Câu hỏi phải đặt phải có dấu "?""
API trả về kết quả YES/NO
Tôi là Laravel? NO
Câu trả lời: {{answer}}
So sánh Computed và Watcher
Computed | Watcher |
---|---|
Muốn giảm tên một thuộc tính phức tạp, lồng nhau thành 1 tên dễ đọc và dễ sử dụng Được cập nhật khi thuộc tính dữ liệu ban đầu bị thay đổi Thuộc tính dữ liệu đạt đến 1 giá trị cụ thể, sau đó được sử dụng vào một việc cụ thể 🡪Cần tham chiếu 1 giá trị từ template |
Tạo dữ liệu mới từ dữ liệu hiện có Sắp xếp hoặc thao tác 1 nhóm dữ liệu lớn 🡪Sử dụng các giá trị trực tiếp trong template |
Other Directive
Phần này trình bày một số directive thông dụng, thường sử dụng nhất.
# V-IF, V-ELSE
Dùng để kiểm tra điều kiện của một câu lệnh
TRÒ CHƠI TÀI XỈU - (V-IF, V-ELSE)
TRÒ CHƠI THỬ THÁCH VẬN MAY BẰNG GAME TÀI XỈU
Luật chơi: Bạn có 5000 đồng. Nếu số tiền của bạn đạt 20000 đồng bạn thắng, số tiền của bạn bằng 0 bạn thua. CHẴN: [2,4,6], LẺ: [1,3,5]
Bạn có thể đặt cược số tiền Bé hơn hoặc bằng số tiền bạn đang có.
Nếu bạn đặt đúng tài hoặc xỉu thì tỉ lệ trả thưởng là 1:1 Ví dụ: Đặt 5000 đồng ĐƯỢC 5000 đồng.
Số tiền của bạn: {{tienhientai}} {{tienhientai}} đồng
KẾT QUẢ:{{ketqua}}
# V-FOR
Dùng để render danh sách, một số tài tiếng anh gọi là map danh sách.
v-for
mapping danh sách dựa trên một mảng
Cú pháp duyệt mảng v-for
như sau item in items
NHỮNG CÔNG VIỆC CẦN LÀM HÔM NAY
(V-FOR và V-FOR component)
SẮP XẾP CÔNG VIỆC CẦN LÀM CHO NGÀY HÔM NAY
# V-TEXT
Có hai cách để lấy data dạng string
cách 1 dùng trực tiếp
<p> {{msg}} </p>
Cách thứ 2: gán msg vào trong v-text
<p v-text="msg"></p>
# V-PRE
Directive V-PRE
Cho phép ta ngừng thực thi code js. Lấy ví dụ chúng ta có msg:abc. Giả
sử thường ta sử dụng sẽ xuất ra abc. Nhưng trường hợp sử dụng
<p>{{msg}}</p>
kết quả sẽ trả về {{msg}}
# V-SHOW
v-show
cách dùng tương tự như v-if
tuy nhiên v-if luôn luôn được render và
chứa trong DOM; v-show chỉ bật tắt thuộc tính display của phần tử này.
v-show
không hỗ trợ thẻ <template>
và không hỗ trợ
v-else
COMPONENT BASIC
Component là thành phần của khá quan trọng trong VueJS, nó cho phép ta tạo ra một thẻ
<tag>
mới của chính mình
Ví dụ 11. Tạo một button mang tên
'lp-button'
Tạo một button có background mã màu ngẫu nhiên khi click. Nếu màu sáng thì chữ màu đen, nếu màu tối thì chữ màu trắng
Giải thuật xác định màu sáng tối
Ví dụ 12. Tái sử dụng Component
'lp-button'
Tái sử dụng component lp-button
đã tạo ở
ví dụ 1
Giải thuật xác định màu sáng tối
THÀNH PHẦN TRONG VUEJS
Một ứng dụng thường tổ chức dưới dạng cây lồng nhau thường có cấu trúc như sau:
Ví dụ: Trong khu vực chứa các bài blog có danh sách các bài blog là component con -> trong mỗi blog con lại có các component con khác như là hình ảnh, tiêu đề, button,....
Ví dụ 14. Truyền dữ liệu động vào Component
'lp-header'
Nhập mã màu và chuỗi kí tự từ bàn phím
KẾT QUẢ
Ví dụ 18. v-model
trong component
Sử dụng v-model trong component. Giả sử ta sử dụng <input v-model="searchText">
thì chúng ta sử dụng bình thường, tuy nhiên việc này đối với component
cần phải được
custom gửi đến đối tượng cha thì chúng ta mới được thay đổi
{{msg}}
Thẻ input bình thường
Cách 2 của thẻ input
Thẻ input dùng component
Ví dụ 19. Phân phối nội dung với <slot>
Trong trường hợp có nhiều slot
, ta sẽ dùng name
đề xác định vị trí bổ
xung.
This is success alert
This is danger alert
Ví dụ 20. Phạm vi truy xuất trong <slot>
Có thể truy xuất dữ liệu trong component chứa slot bằng cách khai báo v-bind
trong
component cha và dùng v-slot
khi muốn sử dụng
Ví dụ 11. Mixins
Để có thể thêm Data và Methods từ bên ngoài ta sử dụng mixins
{{ msg }}
Với những tuỳ chọn trùng nhau, những tuỳ chọn này sẽ được merge và ưu tiên những tuỳ chọn trong component
{{ dt }}
Những hàm hook có tên trùng sẽ được merge vào trong một mảng để tất cả đều được gọi. Những hook trong mixin sẽ được gọi trước những hook trong component.
"This is created() method in mixin !"
"This is created() method in component !"
Local Mixins | Global Mixins |
---|---|
Nó bao gồm thành phần mà nó được khai báo và đăng ký. Quyền hạn của mixin cục bộ bị ràng buộc bởi thành phần mà nó được khai báo.
|
Nó ảnh hưởng đến tất cả đối tượng Vue được khởi tạo, kể cả những component của bên thứ ba.
|
Enter/Leave & List Transitions
# Overview
- Nó cung cấp đa dạng hiệu ứng giao diện khi thêm, xóa, sửa từ DOM
- Tự động áp dụng lớp cho CSS transition và CSS animation
- Tích hợp thư viện bên thứ 3 như
Animate.css
- Tích hợp các thư viện hoạt ảnh JavaScript của bên thứ 3, chẳng hạn như
Velocity.js
# Chuyển đổi Component/Element đơn lẻ
VueJS cung cấp một component wrapper
cho phép xử lý giao diện trong các trường hợp sau
-
Render có điều kiện sử dụng
v-if
-
Display có điều kiện sử dụng
v-show
- Component động
- Các nút gốc thành phần components
Ví dụ 25:
HELLO LAMPART
# CHÚ Ý
Khi một phần tử chứa trong component transition
được thêm vào hoặc gỡ
bỏ khỏi DOM, các bước sau đây sẽ diễn ra:
-
Vue sẽ tự phát hiện ra nếu phần tử đang nhắc đến có
CSS transition
hoặcanimation
và thêm/bớt các class CSS transition vào đúng thời điểm. - Nếu component cung cấp hook JavaScript, các hook này sẽ được gọi vào đúng thời điểm.
- Trong trường hợp không tìm thấy transition hoặc animation nào trong CSS và cũng không có hook JavaScript nào, việc thêm vào hoặc gỡ bỏ khỏi DOM sẽ được thực thi ngay trong frame tiếp theo
Mỗi class trên đây sẽ có prefix (tiếp đầu ngữ) là tên của transition
.
Ở đây prefix v-
là mặc định khi bạn dùng một thẻ <transition>
không có
tên. Nếu chẳng hạn bạn dùng <transition name="my-transition">
thì class
v-enter
sẽ trở thành my-transition-enter
.
v-enter-active
và v-leave-active
cho phép bạn dùng các
hàm easing khác nhau cho các enter/leave transition
Sự khác nhau giữa CSS-Transition và CSS-Animation
CSS-Transition | CSS-Animation |
---|---|
Xin chào |
Cân đẩu vân |
# CÁC CLASS TRONG TRANSITION - VÀ MÔ HÌNH THỰC HIỆN
VueJS cung cấp các class trong Transitions gồm những 6 class cho enter/leave transition
-
v-enter
: Trạng thái bắt đầu củaenter
. Được áp dụng trước khi phần tử được thêm vào DOM và gỡ bỏ đi một frame sau đó.
Tham khảo về Frame -
v-enter-active
Trạng thái active của enter. Được áp dụng trong suốt quá trình enter, từ ngay sau khi phần tử được thêm vào DOM cho đến khi transition/animation kết thúc. Class này có thể được dùng để định nghĩaduration
,delay
, và hàmeasing
cho transition enter. -
v-enter-to
: 2.1.8+. Trạng thái kết thúc của enter. Áp dụng một frame sau khi element được thêm vào DOM (cùng lúc với việc v-enter được gỡ bỏ), gỡ bỏ đi khi transition/animation kết thúc -
v-leave
: Trạng thái bắt đầu củaleave
. Được áp dụng ngay khi một leave transition được kích hoạt và gỡ bỏ đi một frame sau đó. -
v-leave-active
: Trạng thái active củaleave
. Được áp dụng trong suốt quá trình leave, từ khi transition được kích hoạt cho đến khi transition/animation kết thúc. Class này có thể được dùng để định nghĩa duration, delay, và hàm easing cho leave transition. -
v-leave-to
: 2.1.8+. Trạng thái kết thúc của leave. Áp dụng một frame sau khi leave transition được kích hoạt (cùng lúc với việc v-leave được gỡ bỏ), gỡ bỏ đi khi transition/animation kết thúc.
# SỬ DỤNG CLASS TÙY BIẾN - GIỐNG STYLE TRONG CSS
Chúng ta cũng có thể tùy biến transition trong trực tiếp tag transition thay vì định nghĩa trong class qua các thuộc tính sau đây:
-
enter-class
-
enter-active-class
-
enter-to-class
(2.1.8+) -
leave-class
-
leave-active-class
-
leave-to-class
(2.1.8+)
Các thuộc tính này sẽ override những tên class theo thông lệ của Vue. Điều này đặc biệt có ích khi bạn muốn kết hợp giữa hệ thống transition của Vue và một thư viện CSS animation có sẵn như Animate.css.
Ví dụ
Thú nhún
COMPONENT ADVANCED
Component Advanced chứa những kiến thức component nâng cao hơn như Routing, Render Function, Virtual Dom, Reactive Interface
Tất tần tật về Routing
Bản thân VueJS không cung cấp tính năng tự xây dựng route
tuy nhiên để
làm được việc này chúng ta cần cài đặt thêm một package vue-router
# CÀI ĐẶT BẰNG NPM
npm install vue-router
# Copy đoạn script này vào vị trí chứa script đối với project VueJS
import {router} from './router'
/*Phải thêm router vào*/
new Vue({
...
router,
render: h => h(App)
}).$mount('#app')
# Thêm đoạn code về router trong thư mục router/index.js
giống như code minh họa:
import Vue from 'vue'
import Router from 'vue-router'
import Overview from '@/components/Overview'
import Feature from '@/components/Feature'
import Theme from '@/components/Theme'
Vue.use(Router)
export const router = new Router({
mode: 'history',
routes: [
{
path: '/overview',
name: 'Overview',
component: Overview
},
{
path:'/feature',
name:'feature',
component: Feature
},
{
path:'/theme',
name:'theme',
component: Theme
},
]
})
# Sử dụng Router - Định nghĩa Routing trong HTML
<div>
<router-link to="/overview"><v-btn rounded style="margin:10px; box-shadow: 0px 0px;" color="#fff0"><span
style="color:white"> Overview - Setting </span></v-btn></router-link>
</div>
<div>
<router-link to="/feature"><v-btn rounded style="margin:10px; box-shadow: 0px 0px;" color="#fff0"><span
style="color:white"> Feature </span></v-btn></router-link>
</div>
<div>
<router-link to="/theme"><v-btn rounded style="margin:10px; box-shadow: 0px 0px;" color="#fff0"><span
style="color:white"> Style & animations </span></v-btn></router-link>
</div>
<div>
<router-link to="/UI"><v-btn rounded style="margin:10px; box-shadow: 0px 0px;" color="#fff0"><span
style="color:white">UI Comoponent </span></v-btn></router-link>
</div>
# Thêm Router View sau khi định nghĩa các đường link là nơi chứa các component router
<router-view></router-view>
Ví dụ 29. Hiển thị tiêu đề có kích thước khác nhau với một component
Node và Trees
Code HTML được hiển thị động bằng việc render một cây các đối tượng được gọi là DOM tree.
Mọi phần tử trên DOM tree là một Node. Mỗi Node là một phần hiển thị trên trình duyệt.
Ví dụ đoạn HTML:
<div>
Bài đồng dao
Năm mới năm me
<!-- TODO: Hoàn thành bài đồng dao -->
</div>
Cấu trúc cây đoạn HTML trên:
Virtual DOM
Vue sẽ tự động giữ cho trang web được cập nhật nhờ vào việc xây dựng một virtual DOM để theo dõi tất cả những thay đổi cần thực hiện đối với DOM thật.
Ta có thể tạo ra một virtual DOM bằng createElement
JFX
Thay vì phải cực nhọc khi dùng nhiều hàm render:
createElement(
'anchored-heading', {
props: {
level: 1
}
}, [
createElement('span', 'Hello'),
' world!'
]
)
Vue cung cấp một plugin dành cho Babel để dùng JSX với Vue, giúp chúng ta sử dụng một cú pháp gần gũi hơn với template:
import AnchoredHeading from './AnchoredHeading.vue'
new Vue({
el: '#demo',
render: function (h) {
return (
<AnchoredHeading level={1}>
<span>Hello</span> world!
</AnchoredHeading>
)
}
}))
Dùng h
thay cho createElement
là bắt buộc đối với JSX.
Reactive Interface
Vue không cho phép thêm hay xoá trực tiếp các thuộc tính:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` is now reactive
vm.b = 2
// `vm.b` is NOT reactive
Để có thể thực hiện điều đó Vue.set
và Vue.delete
để thêm, sửa đổi hoặc xoá.
LIÊN HỆ VỚI CHÚNG TÔI
QMPP+W3 Quận 3, Thành phố Hồ Chí Minh, Việt Nam
(+84 0) 28-3990-3296 (+84 0) 28-3990-3297
HTML
{{ codeHTML }}
JS
{{ codeJS }}
CSS
{{ codeCSS }}