Câu Hỏi Phỏng Vấn Kỹ Thuật Vue.js - Tổng Hợp Chi Tiết

1. Giải thích về Vue.js, đặc điểm và lý do không tương thích với IE8 và các phiên bản thấp hơn

Vue.js là một framework tiến bộ được thiết kế để xây dựng giao diện người dùng, với hệ thống cốt lõi là cơ chế ràng buộc dữ liệu hai chiều

Vue.js là một framework MVVM, dựa trên cơ chế liên kết dữ liệu hai chiều. Khi dữ liệu thay đổi, Vue.js tự thực hiện các tính toán cần thiết

Đặc điểm: gọn nhẹ, điều khiển dựa trên dữ liệu, thành phần hóa (component), thân thiện với module

Vue.js sử dụng các tính năng của ECMAScript 5 mà IE8 không thể mô phỏng, và không có giải pháp thay thế

2. Nguyên lý hoạt động của cơ chế liên kết dữ liệu hai chiều trong Vue

Chủ yếu được thực hiện thông qua thuộc tính defineProperty của đối tượng Object, ghi đè hàm set và get của data

Vue.js thực hiện liên kết dữ liệu bằng cách chiếm giữ dữ liệu, với phương thức cốt lõi là sử dụng Object.defineProperty() để chiếm giữ thuộc tính

Khi thiết lập hoặc lấy giá trị, chúng ta có thể thêm các hàm kích hoạt khác vào phương thức get hoặc set để đạt được mục đích giám sát sự thay đổi dữ liệu

3. MVVM là gì, khác biệt với MVC

MVVM là viết tắt của Model-View-ViewModel

Model đại diện cho mô hình dữ liệu

View đại diện cho giao diện thành phần, chịu trách nhiệm chuyển đổi dữ liệu thành UI

ViewModel là đối tượng đồng bộ hóa View và Model (liên kết hai chiều)

Trong MVVM, View và Model không có kết nối trực tiếp mà tương tác thông qua ViewModel

Tương tác giữa Model và ViewModel là hai chiều, do đó có thể thao tác dữ liệu thông qua view và ngược lại

MVC là viết tắt của Model-View-Controller. Mục đích sử dụng MVC là tách Model và View

Khác biệt lớn nhất giữa MVVM và MVC là tự động đồng bộ hóa View và Model, tức là khi thuộc tính của Model thay đổi

Chúng ta không cần thao tác thủ công DOM để thay đổi View, mà thuộc tính tương ứng ở View sẽ tự động thay đổi

4. Hai yếu tố cốt lõi của Vue.js là gì

Tư duy điều khiển dữ liệu và tư duy thành phần hóa

5. Khác biệt giữa Vue và Angular

Liên kết hai chiều của Vue dựa trên getter/setter của ES5, trong khi Angular tự triển khai một bộ quy tắc biên dịch mẫu và cần kiểm tra "bẩn"

Vue cần một đối tượng el để khởi tạo, phạm vi hoạt động sau này cũng nằm trong el, trong khi Angular làm việc trên toàn bộ trang HTML

6. Nguyên lý hoạt động ở tầng thấp của Vue

Vue sử dụng mô hình m-v-vm (model-view-modelView), với modelView làm tầng trung gian cho liên kết và thay đổi dữ liệu hai chiều

  1. Tạo cây DOM ảo thông qua document.createDocumentFragment()

  2. Khi dữ liệu được giám sát thay đổi, sẽ bị chặn bởi Object.defineProperty để phát hiện sự thay đổi

  3. Sự thay đổi dữ liệu được phát hiện, kích hoạt Watcher (người quan sát) thông qua mô hình phát hành - đăng ký

  4. Cuối cùng, cập nhật giá trị của các phần tử trong DOM ảo, thay đổi giá trị của cây DOM được render, hoàn thành liên kết hai chiều

7. Giải thích ứng dụng trang đơn (SPA) với Vue.js, ưu nhược điểm

Ứng dụng trang đơn, mọi thao tác của người dùng đều diễn ra trên một trang duy nhất

Ưu điểm: không tải lại trang, trải nghiệm người dùng tốt, tài nguyên chỉ cần tải một lần, sử dụng tư duy thành phần hóa cấu trúc code chuẩn hóa, dễ sửa đổi và điều chỉnh

Nhược điểm: không thân thiện với công cụ tìm kiếm, không hỗ trợ các phiên bản trình duyệt cũ, thời gian tải trang đầu tiên tương đối dài, không thể sử dụng nút điều hướng của trình duyệt, cần tự triển chức năng tiến/lùi

8. So sánh React và Vue

Điểm giống nhau:

Cả hai đều hỗ trợ render phía máy chủ, điều khiển view dựa trên dữ liệu, quản lý trạng thái

Cả hai đều có DOM ảo, phát triển thành phần, truyền dữ liệu giữa thành phần cha-con qua props

Điểm khác nhau:

React nghiêm túc chỉ tập trung vào tầng C của MVC, trong khi Vue là mô hình MVVM

Về DOM ảo:

Vue theo dõi mối quan hệ phụ thuộc của mỗi thành phần, không cần render lại toàn bộ cây thành phần, trong khi React khi trạng thái ứng dụng thay đổi, tất cả thành phần đều được render lại

Về render view:

React sử dụng JSX để render vào DOM, Vue sử dụng template

Về liên kết dữ liệu:

Vue triển khai liên kết dữ liệu hai chiều, React có luồng dữ liệu một chiều

Về đối tượng state:

Trong React, state không thể thay đổi, cần sử dụng setState để cập nhật trạng thái

Trong Vue, state không bắt buộc, dữ liệu được quản lý bởi thuộc tính data trong đối tượng Vue

9. Lợi ích của thành phần hóa trong phát triển frontend

  1. Tăng hiệu suất phát triển

  2. Dễ dàng tái sử dụng

  3. Phù hợp với phát triển nhóm

  4. Dễ quản lý và bảo trì

10. Vòng đời của Vue.js, khi sử dụng keep-alive sẽ tăng thêm hai giai đoạn nào

Trước/sau khi tạo beforeCreate/created:

Giai đoạn beforeCreate, phần tử el và đối tượng data của Vue đều chưa được khởi tạo. Giai đoạn created, đối tượng data đã có nhưng el vẫn chưa

Trước/sau khi mount beforeMount/mounted:

Giai đoạn beforeMount, el và data đã được khởi tạo nhưng vẫn là DOM ảo trước khi mount. Giai đoạn mounted, Vue đã mount thành công và data được render

Trước/sau khi cập nhật beforeUpdate/updated:

Khi data thay đổi, kích hoạt beforeUpdate và updated. Ít được sử dụng

Trước/sau khi hủy beforeDestroy/destroyed:

beforeDestroy được kích hoạt trước khi Vue instance bị hủy, thường ở đây cần removeEventListener để giải bỏ các sự kiện đã bind

Sau khi destroy, Vue instance đã ngừng lắng nghe sự kiện và binding DOM, nhưng cấu trúc DOM vẫn tồn tại

Trong các thành phần/route được bao bởi keep-alive, sẽ có thêm hai hook:

activated và deactivated

11. Hiểu về cơ chế kiểm tra "bẩn" trong Angular

Trong Angular không thể xác định dữ liệu đã thay đổi hay chưa, nên đặt ra một số điều kiện, khi kích hoạt các điều kiện này sẽ thực hiện một kiểm tra để duyệt tất cả dữ liệu, so sánh nơi đã thay đổi và thực hiện sự thay đổi

Cơ chế kiểm tra này không khoa học và hiệu quả thấp, có nhiều phần thừa

12. Làm thế nào để CSS chỉ có tác dụng trong thành phần hiện tại

Muốn CSS chỉ có hiệu lực trong thành phần hiện tại, thêm scoped trong style

13. Khác biệt giữa v-if và v-show trong Vue

v-if và v-show đều được dùng để điều khiển việc render phần tử

v-if dựa trên giá trị thật/giả của dữ liệu sau đó để quyết định thêm/xóa DOM

v-show chỉ sửa đổi thuộc tính css (display)

v-if nếu điều kiện render ban đầu là thật thì render, ngược lại thì không

v-show dù điều kiện ban đầu có thật hay không đều được render

v-if có chi phí chuyển đổi cao, không phù hợp với việc chuyển đổi thường xuyên

v-show có chi phí render ban đầu cao, phù hợp với việc chuyển đổi thường xuyên

14. Các modifier trong Vue là gì

Modifier sự kiện: stop, prevent, self, once

Modifier bàn phím: enter, space, up, down

Modifier form: number, trim, lazy

15. Liệt kê các directive thường dùng trong Vue

v-if, v-show, v-for, v-on, v-bind, v-model, v-once

16. v-on có thể bind nhiều phương pháp cùng lúc không

Có thể

<input @keyup.enter="guiDuLieu" @focus="trungTam">

17. Khác biệt giữa $mount và el trong Vue

$mount và el không có sự khác biệt khi sử dụng, đều dùng để mount instance Vue đã khởi tạo vào phần tử DOM chỉ định

Nếu khởi tạo Vue với el, Vue sẽ render trong DOM tương ứng với el

Nếu không chỉ định el, instance Vue sẽ ở trạng thái "chưa mount", lúc này dùng $mount để thực hiện mount thủ công

18. Cách sử dụng event modifier trong Vue, ví dụ minh họa

        <!-- Ngăn chặn sự kiện click lan truyền -->
        <a @click.stop="lamDieuNay"></a>
        <!-- Sự kiện submit không tải lại trang -->
        <form @submit.prevent="onSubmit"></form>
        <!-- Modifier có thể kết nối chuỗi -->
        <a @click.stop.prevent="lamDoDo"></a>
        <!-- Chỉ sử dụng modifier -->
        <form @submit.prevent></form>
        <!-- Sự kiện click chỉ kích hoạt một lần -->
        <a @click.once="lamDieuNay"></a>
        <!-- Chỉ kích hoạt khi event.target là chính element đó -->
        <div @click.self="lamDoDo">...</div>    

19. Tác dụng của key và is trong Vue

Sử dụng key, Vue sẽ sắp xếp lại thứ tự phần tử dựa trên sự thay đổi của key, và loại bỏ các phần tử không có key. Có thể tối ưu hóa

is có thể mở rộng HTML element gốc, cũng có thể bind thành phần động

20. Tại sao data trong component phải là hàm

Vì component được sử dụng để tái sử dụng, trong JS đối tượng là quan hệ tham chiếu, như vậy không có cách ly phạm vi

Trong khi instance của new Vue, không được tái sử dụng, vì vậy không có vấn đề tham chiếu đối tượng

21. Khái niệm luồng dữ liệu một chiều

Khái niệm này xuất hiện trong giao tiếp giữa các component. Dữ liệu流向 từ component cha đến con, dữ liệu vẫn thuộc về component cha

Nếu muốn thao tác ở component con để thay đổi dữ liệu của component cha, chỉ có thể cho component cha biết cần thao tác dữ liệu nào

Sau đó component cha tự sửa đổi dữ liệu của mình, xong rồi truyền lại cho component con

22. Tính toán (computed) trong Vue là gì, có những cách sử dụng nào

computed là thuộc tính tính toán, có thể giám sát sự thay đổi dữ liệu trong Vue, khi dữ liệu thay đổi sẽ kích hoạt

  1. Dạng hàm
       computed:{
            ngheMang(){
            // Sử dụng dữ liệu trong data, tự động giám sát sự thay đổi dữ liệu
            // Kết quả trả về là một việc khác được thực hiện khi thay đổi dữ liệu         
            }
        }
  1. Dạng đối tượng
        computed:{
            ngheMang:{
                get(){
                    // Khi lấy giá trị
                },
                set(giaTriMoi){
                    // Khi sửa đổi giá trị
                }
            }
        }
        // Khi sử dụng get set, computed định nghĩa một thuộc tính dạng đối tượng
        // Không sử dụng get set, computed định nghĩa một thuộc tính có thể là hàm
      

23. Cách truyền dữ liệu giữa các component trong Vue

Component cha truyền cho component con:

Đầu tiên, trên component con thêm v-bind:tên-thuộc-tính-bắt-tự = dữ liệu của component cha, component con nhận dữ liệu qua props

Component con truyền cho component cha:

Trên component con bind một sự kiện tùy chỉnh và truyền hàm xử lý sự kiện của component cha

Trong component con, sử dụng $emit để lắng nghe sự kiện tùy chỉnh này, this.$emit('tên-sự-kiện', tham-số)

24. Khác biệt giữa computed và watch trong Vue

computed có thể giám sát sự thay đổi dữ liệu trong Vue, thực hiện một lần khi trang tải, mỗi lần dữ liệu thay đổi lại kích hoạt, khi thao tác dữ liệu sẽ sinh ra một việc khác

watch chỉ kích hoạt khi dữ liệu chỉ định thay đổi. Ban đầu không kích hoạt, chỉ khi dữ liệu chỉ định thay đổi thì kích hoạt

watch có thể thêm deep (sâu), computed không thể

25. Hiểu về nextTick trong Vue

nextTick trong Vue có thể lấy được phần tử DOM đã được cập nhật

Nếu trong mounted không thể lấy chính xác phần tử DOM, có thể sử dụng nextTick

Các thao tác DOM trong hook created() của vòng đời Vue phải đặt trong hàm callback của Vue.nextTick()

26. Phương pháp định nghĩa directive tùy chỉnh (v-check, v-focus) là gì? Có những hook nào? Tham số của hook là gì

Định nghĩa directive toàn cục: trong phương thức directive của đối tượng Vue có hai tham số, lần lượt là tên directive và hàm

Định nghĩa directive trong component: directives

Hook: bind (khi sự kiện được bind), inserted (khi node được chèn), update (khi component liên quan cập nhật)

Tham số hook: el, binding

27. Tối ưu hóa tốc độ tải trang đầu tiên của ứng dụng SPA

  1. Nhập các thư viện JS chung thông qua thẻ script bên ngoài, để trình duyệt tải song song tài nguyên, tăng tốc độ tải

  2. Khi cấu hình route, sử dụng lazy loading cho trang và component, chỉ tải file js tương ứng khi gọi component

  3. Thêm loading trang đầu tiên để nâng cao trải nghiệm người dùng

28. Trình bày tác dụng của các modifier trim, number, lazy trong Vue

trim: dùng để lọc khoảng trắng trước và sau

number: bind dữ liệu người dùng nhập vào dạng number

lazy: sử dụng modifier này sẽ đồng bộ từ "sự kiện input" thành "sự kiện change"

29. Vue-router có những navigation hook nào, chúng có tham số gì

Hook điều hướng toàn cục: to, from, next

Hook trong component: beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave

Hook riêng của từng route: beforeEnter

30. Cách chuyển đổi giữa các route

Khai báo (sử dụng tag) <router-link :to="xxx">

Lập trình (sử dụng js) router.push('index')

31. Giải thích về lazy loading (tải theo yêu cầu route)

Trong webpack cung cấp require.ensure() để thực hiện tải theo yêu cầu. Trước đây nhập route bằng cách import, thay bằng cách định nghĩa bằng const

Cách nhập không tải trang theo yêu cầu:

import  trangChu   from '../common/trangChu.vue'

Cách nhập tải trang theo yêu cầu:

const trangChu = r => require.ensure( [], () => r (require('../common/trangChu.vue')))

32. Khác biệt giữa $router và $route trong Vue

router là một đối tượng của VueRouter, thông qua Vue.use(VueRouter) và hàm khởi tạo VueRouter để có instance router

route là một đối tượng route, mỗi route sẽ có một route object

Là một đối tượng cục bộ, có thể lấy name, path, params, query tương ứng

33. vue-loader là gì? Mục đích sử dụng là gì

Loader cho file .vue, chuyển đổi template/js/style thành module js

Mục đích: js có thể viết es6, style có thể scss hoặc less, template có thể thêm jade

34. Khác biệt giữa query và params trong vue-router

Cả query và params đều dùng để truyền tham số trong route của Vue

query dùng path để nhập, params chỉ có thể dùng name để truyền, không thể dùng path

query giống như yêu cầu get (tham số hiển thị trong thanh địa chỉ), trong khi params giống như post (không hiển thị tham số trong thanh địa chỉ)

35. Cách định nghĩa route động trong vue-router? Lấy tham số động truyền vào

Trong file index.js của thư mục router, thêm /:id vào thuộc tính path

Sử dụng params.id của đối tượng router

36. Cách định nghĩa route lồng nhau

Sử dụng cấu hình children trong tham số VueRouter, children chứa route con, route con còn có thể tiếp tục lồng route con

37. active-class là thuộc tính của component nào

Component router-link trong module vue-router

38. Ví dụ về các đối tượng route thường dùng trong Vue và tác dụng

$route.name tên route hiện tại

$route.path đường dẫn của đối tượng route hiện tại

$route.meta chèn một trường trong route, khi chuyển route sẽ truyền thông tin qua

$route.query thông tin truy vấn chứa cặp key-value trong route

$route.hash giá trị hash của đường dẫn hiện tại, có #

$route.params biến được định sẵn, khi chuyển route truyền qua parmas một giá trị id

39. Trong dự án vue.cli, công dụng của mỗi thư mục và file trong thư mục src

main.js là file入口

app.vue là component chính

view chứa trang giao diện

components chứa component

router chứa cấu hình route

assets chứa tài nguyên tĩnh

40. Trong vue.cli, cách sử dụng component tùy chỉnh

Bước 1: Tạo file component mới trong thư mục components

Bước 2: Nhập component vào trang (component) cần sử dụng

Bước 3: Inject vào thuộc tính components của component con

Bước 4: Sử dụng trong template view

41. Vòng đời của Vue.js là gì, tác dụng gì, lần tải trang đầu tiên kích hoạt những hook nào

Quá trình từ tạo đến hủy của Vue instance

Từ khi bắt đầu tạo, khởi tạo dữ liệu, biên dịch template, mount DOM→render, cập nhật→render, hủy等一系列过程,称为 Vue 的生命周期

Tác dụng: Vòng đời có nhiều sự kiện hook, giúp chúng ta dễ dàng kiểm soát quá trình tạo instance Vue hơn

Lần tải trang đầu tiên sẽ kích hoạt beforeCreate, created, beforeMount, mounted

42. Mô tả ngắn gọn mỗi chu kỳ phù hợp với kịch bản nào

beforecreate : có thể thêm loading event, kích hoạt khi tải instance

created : thao tác khi khởi tạo xong, như kết thúc loading event, cũng có thể thao tác request bất đồng bộ

mounted : mount element, lấy được DOM node, khuyến nghị sử dụng nextTick

updated : nếu xử lý dữ liệu thống nhất, viết hàm tương ứng ở đây

beforeDestroy : có thể tạo hộp xác nhận dừng event, tắt timer

destroyed : component hiện tại đã bị xóa, dọn sạch nội dung liên quan

43. Giải thích về slot trong Vue

Slot là API phân phối nội dung mà Vue triển khai, là nơi chứa nội dung được phân phối.

Trong template component, mặc định chiếm một vị trí, khi sử dụng tag component, nội dung của tag component sẽ tự động thay thế nội dung đó

Trong slot có thể đặt một số nội dung mặc định, nếu truyền nội dung sẽ thay thế, tag không tên sẽ mặc định đặt vào default

44. Khi computed và watch là đối tượng, chúng có những tùy chọn nào? computed và methods có gì khác nhau? computed có thể phụ thuộc dữ liệu của component khác không?

computed có hai tùy chọn get set

watch có handler, deep (có sâu), immediate (có thực thi ngay)

methods là một đối tượng, có thể định nghĩa các phương thức trong đó, có thể nhận tham số, computed không

computed có thể cache, methods không

computed có thể phụ thuộc computed khác, thậm chí data của component khác

45. Cách hiểu hàm render trong Vue

Vue thường sử dụng template để tạo HTML, đôi khi chúng ta cần sử dụng javascript để tạo HTML, lúc này cần sử dụng hàm render

Hàm render return một createElement, các phần tử con trong component được lưu trong instance component

createElement trả về thông tin sẽ cho VUE biết cần render loại node nào trên trang. Chúng ta gọi node này là DOM ảo

46. Vuex là gì? Cách sử dụng? Trường hợp chức năng nào sử dụng nó?

Vuex là công cụ quản lý trạng thái trong framework Vue

Nhập store trong main.js, inject, tạo một thư mục store, export

Trường hợp sử dụng: trong ứng dụng trang đơn, trạng thái giữa các component. Trình phát nhạc, trạng thái đăng nhập, thêm vào giỏ hàng

47. Trong hook created() của vòng đời Vue, thao tác DOM phải đặt trong callback của Vue.nextTick(). Lý do là gì

Khi hook created() thực thi, DOM thực tế chưa được render, lúc này thao tác DOM vô nghĩa

Do đó, thao tác cần sử dụng cấu trúc DOM thay đổi theo dữ liệu, sau khi dữ liệu thay đổi, thao tác này nên đặt trong callback của Vue.nextTick()

48. Đặc điểm của store trong Vuex là gì

Vuex là một kho, trong kho chứa nhiều đối tượng

Trong đó state là nguồn dữ liệu, tương ứng với data trong đối tượng Vue thông thường

Dữ liệu trong state là phản ứng (reactive), khi component đọc dữ liệu từ store, nếu dữ liệu trong store thay đổi, component phụ thuộc cũng thay đổi

Nó sử dụng mapState để ánh xạ state và getters toàn cục vào computed của component hiện tại

49. Trong Vue, code request ajax nên viết trong methods của component hay action của vuex?

Nếu dữ liệu request không được các component khác sử dụng chung, chỉ sử dụng trong component request, thì không cần đặt vào state của vuex

Nếu được các nơi khác sử dụng, hãy đặt request vào action để tiện tái sử dụng và đóng gói thành promise trả về

50. Giải thích tư tưởng của Vuex

Tư tưởng của Vuex là khi chúng ta click một nút trên trang, nó sẽ kích hoạt(dispatch) một action, action sau đó thực hiện(commit) một mutation, mutation ngay lập tức thay đổi state,

state thay đổi, trang của chúng ta lấy dữ liệu từ state, trang sẽ thay đổi. Đối tượng Store chứa tất cả các nội dung chúng ta đang nói, action, state, mutation

Thẻ: Vue.js JavaScript frontend framework Component

Đăng vào ngày 15 tháng 7 lúc 00:24