Phương thức Vue
Các phương thức Vue là các hàm thuộc về thể hiện Vue trong thuộc tính 'methods'.
Các phương thức Vue rất tuyệt khi sử dụng với xử lý sự kiện ( v-on
) để thực hiện những việc phức tạp hơn.
Các phương thức Vue cũng có thể được sử dụng để làm những việc khác ngoài việc xử lý sự kiện.
Thuộc tính 'phương thức' của Vue
Chúng ta đã sử dụng một thuộc tính Vue trong hướng dẫn này, thuộc tính 'data', nơi chúng ta có thể lưu trữ các giá trị.
Có một thuộc tính Vue khác gọi là 'phương thức' nơi chúng ta có thể lưu trữ các hàm thuộc về phiên bản Vue. Một phương thức có thể được lưu trữ trong phiên bản Vue như thế này:
const app = Vue.createApp({
data() {
return {
text: ''
}
},
methods: {
writeText() {
this.text = 'Hello Wrold!'
}
}
})
Mẹo: Chúng ta cần viết this.
làm tiền tố để tham chiếu đến thuộc tính dữ liệu từ bên trong một phương thức.
Để gọi phương thức 'writeText' khi chúng ta nhấp vào phần tử <div>
, chúng ta có thể viết mã bên dưới:
<div v-on:click="writeText"></div>
Ví dụ trông như thế này:
Ví dụ
Lệnh v-on
được sử dụng trên phần tử <div>
để nghe sự kiện 'click'. Khi sự kiện 'click' xảy ra, phương thức 'writeText' được gọi và văn bản được thay đổi.
<div id="app">
<p>Click on the box below:</p>
<div v-on:click="writeText">
{{ text }}
</div>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
text: ''
}
},
methods: {
writeText() {
this.text = 'Hello World!'
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử »Gọi một phương thức với đối tượng sự kiện
Khi một sự kiện xảy ra khiến một phương thức được gọi, đối tượng sự kiện sẽ được truyền cùng với phương thức đó theo mặc định. Điều này rất thuận tiện vì đối tượng sự kiện chứa nhiều dữ liệu hữu ích, ví dụ như đối tượng mục tiêu, loại sự kiện hoặc vị trí chuột khi xảy ra sự kiện 'click' hoặc 'mousemove'.
Ví dụ
Lệnh v-on
được sử dụng trên phần tử <div>
để lắng nghe sự kiện 'mousemove'. Khi sự kiện 'mousemove' xảy ra, phương thức 'mousePos' được gọi và đối tượng sự kiện được gửi cùng với phương thức này theo mặc định để chúng ta có thể lấy vị trí con trỏ chuột.
Chúng ta phải sử dụng cái this.
tiền tố để tham chiếu đến "xPos" bên trong thuộc tính dữ liệu phiên bản Vue từ phương thức.
<div id="app">
<p>Move the mouse pointer over the box below:</p>
<div v-on:mousemove="mousePos"></div>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
xPos: 0,
yPos: 0
}
},
methods: {
mousePos(event) {
this.xPos = event.offsetX
this.yPos = event.offsetY
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử » Nếu mở rộng ví dụ trên chỉ bằng một dòng, chúng ta cũng có thể thay đổi màu nền dựa trên vị trí con trỏ chuột theo hướng x. Điều duy nhất chúng ta cần thêm là v-bind
để thay đổi màu nền trong thuộc tính style:
Ví dụ
Sự khác biệt ở đây so với ví dụ trên là màu nền được liên kết với 'xPos' bằng v-bind
sao cho giá trị hsl 'hue' được đặt bằng 'xPos'.
<div
v-on:mousemove="mousePos"
v-bind:style="{backgroundColor:'hsl('+xPos+',80%,80%)'}">
</div>
Hãy tự mình thử » Trong ví dụ bên dưới, đối tượng sự kiện mang một văn bản từ thẻ <textarea>
để làm cho nó trông giống như chúng ta đang viết bên trong một cuốn sổ tay.
Ví dụ
Lệnh v-on
được sử dụng trên thẻ <textarea>
để lắng nghe sự kiện 'input' xảy ra bất cứ khi nào có sự thay đổi trong văn bản bên trong phần tử textarea.
Khi sự kiện 'input' xảy ra, phương thức 'writeText' được gọi và đối tượng sự kiện được gửi cùng với phương thức này theo mặc định để chúng ta có thể lấy văn bản từ thẻ <textarea>
. Thuộc tính 'text' trong phiên bản Vue được cập nhật bằng phương thức 'writeText'. Phần tử span được thiết lập để hiển thị giá trị 'văn bản' với cú pháp dấu ngoặc nhọn đôi và giá trị này được Vue cập nhật tự động.
<div id="app">
<textarea v-on:input="writeText" placeholder="Start writing.."></textarea>
<span>{{ text }}</span>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
text: ''
}
},
methods: {
writeText(event) {
this.text = event.target.value
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử »Truyền đối số
Đôi khi chúng ta muốn truyền một đối số bằng phương thức khi một sự kiện xảy ra.
Giả sử bạn làm công việc kiểm lâm và bạn muốn đếm số lần nhìn thấy nai sừng tấm. Đôi khi người ta nhìn thấy một hoặc hai con nai sừng tấm, đôi khi có thể nhìn thấy hơn 10 con nai sừng tấm trong một ngày. Chúng tôi thêm các nút để đếm số lần nhìn thấy '+1' và '+5' và nút '-1' trong trường hợp chúng tôi đã đếm quá nhiều.
Trong trường hợp này, chúng ta có thể sử dụng cùng một phương thức cho cả ba nút và chỉ cần gọi phương thức đó với một số khác làm đối số từ các nút khác nhau. Đây là cách chúng ta có thể gọi một phương thức có đối số:
<button v-on:click="addMoose(5)">+5</button>
Và đây là cách phương thức 'addMoose' trông như thế nào:
methods: {
addMoose(number) {
this.count = this.count + number
}
}
Hãy xem cách truyền đối số bằng một phương thức hoạt động như thế nào trong một ví dụ đầy đủ.
Ví dụ
<div id="app">
<img src="img_moose.jpg">
<p>{{ "Moose count: " + count }}</p>
<button v-on:click="addMoose(+1)">+1</button>
<button v-on:click="addMoose(+5)">+5</button>
<button v-on:click="addMoose(-1)">-1</button>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
count: 0
}
},
methods: {
addMoose(number) {
this.count+=number
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử »Truyền cả Đối số và Đối tượng Sự kiện
Nếu chúng ta muốn truyền cả đối tượng sự kiện và đối số khác, thì có một tên dành riêng ' $event
' chúng ta có thể sử dụng khi phương thức được gọi, như sau:
<button v-on:click="addAnimal($event, 5)">+5</button>
Và đây là cách phương thức trong phiên bản Vue trông như thế nào:
methods: {
addAnimal(e, number) {
if(e.target.parentElement.id==="tigers"){
this.tigers = this.tigers + number
}
}
}
Bây giờ chúng ta hãy xem một ví dụ để biết cách truyền cả đối tượng sự kiện và đối số khác bằng một phương thức.
Ví dụ
Trong ví dụ này, phương thức của chúng tôi nhận cả đối tượng sự kiện và văn bản.
<div id="app">
<img
src="img_tiger.jpg"
id="tiger"
v-on:click="myMethod($event,'Hello')">
<p>"{{ msgAndId }}"</p>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
msgAndId: ''
}
},
methods: {
myMethod(e,msg) {
this.msgAndId = msg + ', '
this.msgAndId += e.target.id
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử »Ví dụ lớn hơn
Trong ví dụ này, chúng ta thấy rằng chỉ có thể sử dụng một phương pháp để đếm ba con vật khác nhau với ba số gia khác nhau cho mỗi con vật. Chúng tôi đạt được điều này bằng cách chuyển cả đối tượng sự kiện và số gia tăng:
Ví dụ
Cả kích thước tăng dần và đối tượng sự kiện đều được truyền dưới dạng đối số với phương thức khi nhấp vào nút. Từ dành riêng ' $event
' được sử dụng để truyền đối tượng sự kiện với phương thức cho biết con vật nào cần đếm.
<div id="app">
<div id="tigers">
<img src="img_tiger.jpg">
<button v-on:click="addAnimal($event,1)">+1</button>
<button v-on:click="addAnimal($event,5)">+5</button>
<button v-on:click="addAnimal($event,1)">-1</button>
</div>
<div id="moose">
<img src="img_moose.jpg">
<button v-on:click="addAnimal($event,1)">+1</button>
<button v-on:click="addAnimal($event,5)">+5</button>
<button v-on:click="addAnimal($event,1)">-1</button>
</div>
<div id="kangaroos">
<img src="img_kangaroo.jpg">
<button v-on:click="addAnimal($event,1)">+1</button>
<button v-on:click="addAnimal($event,5)">+5</button>
<button v-on:click="addAnimal($event,1)">-1</button>
</div>
<ul>
<li>Tigers: {{ tigers }} </li>
<li>Moose: {{ moose }} </li>
<li>Kangaroos: {{ kangaroos }} </li>
</ul>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
tigers: 0,
moose: 0,
kangaroos: 0
}
},
methods: {
addAnimal(e,number) {
if(e.target.parentElement.id==="tigers") {
this.tigers+=number
}
else if(e.target.parentElement.id==="moose") {
this.moose+=number
}
else {
this.kangaroos+=number
}
}
}
})
app.mount('#app')
</script>
Hãy tự mình thử »