Trải nghiệm sử dụng Livewire có vẻ kỳ diệu. Như thể HTML mặt trước của bạn có thể gọi mã PHP của bạn và mọi thứ chỉ hoạt động
Rất nhiều thứ đã làm nên điều kỳ diệu này. Hãy để tôi chỉ cho bạn những gì đang xảy ra
Ví dụ của chúng tôi
Đối với bài viết này, chúng tôi sẽ sử dụng ví dụ về một thành phần bộ đếm đơn giản. Đây là thành phần Livewire trông như thế nào
Phản đối. php
count++;
}
public function render[]
{
return view['livewire.counter'];
}
}
phản đối. lưỡi. php
Count: {{ $count }}
Increment
Trong ví dụ này, khi chúng tôi tải trang, chúng tôi thấy “Đếm. 0“ và khi chúng tôi nhấn nút “Increment”, số “0” biến thành số “1” một cách kỳ diệu
Bây giờ chúng tôi đã thiết lập một cái gì đó cụ thể, hãy nói về cách Livewire biến điều này thành hiện thực
Kết xuất ban đầu
Giả sử chúng ta muốn đưa thành phần Livewire này vào chế độ xem phiến hoàn toàn tiêu chuẩn. Đây là cách nó sẽ trông như thế nào
@livewireScripts
Khi bạn tải trang này, Laravel xử lý tệp Blade này giống như bất kỳ tệp nào khác, ngoại trừ việc Livewire thực hiện một số hành vi gian lận để Blade chuyển đổi
@livewireScripts
5 thành.
@livewireScripts
6Trong trường hợp đơn giản này, lệnh
@livewireScripts
6 biên dịch thành mã trông như thế này.
@livewireScripts
8Trước khi chúng tôi tìm hiểu những gì đang xảy ra trong
@livewireScripts
9, chúng tôi sẽ chỉ ở bên ngoài và xem kết quả của cuộc gọi đó________số 8Như bạn có thể thấy, Livewire hiển thị thành phần như bạn mong đợi, nhưng nó cũng bơm vào HTML rất nhiều siêu dữ liệu cho các mục đích nội bộ của riêng nó
Chúng ta sẽ tìm hiểu vấn đề này trong phần tiếp theo, nhưng trong khi chúng ta ở đây, chúng ta cũng hãy xem xét ngắn gọn những gì
Count: 0
Increment
0 làmVề cơ bản, chỉ thị Blade này biên dịch thành hai
@livewireScripts
5Như bạn có thể thấy, Livewire tải JavaScript của chính nó, sau đó khởi chạy nó khi trang đã sẵn sàng
Khởi tạo trang
Điều thú vị về Livewire là ngay cả khi bạn đã tắt JavaScript, thành phần này sẽ hiển thị ở dạng HTML thuần túy. Điều này thật tuyệt vời để có được nội dung trên một trang ngay lập tức và làm hài lòng các công cụ tìm kiếm
Bây giờ nội dung đã có trên trang và trong trình duyệt, hãy xem điều gì sẽ xảy ra khi JavaScript của Livewire được khởi tạo và phương thức
Count: 0
Increment
2 được gọiĐây là một đoạn trích nguyên văn về hàm
Count: 0
Increment
3 của Livewire trong JavaScript
Count: {{ $count }}
Increment
3Livewire sử dụng
Count: 0
Increment
4 để lấy các phần tử gốc của các thành phần Livewire trên trang. Nó thực hiện điều này bằng cách tìm kiếm sự hiện diện của thuộc tính
Count: 0
Increment
5Sau khi tìm thấy chúng, nó sẽ khởi tạo chúng bằng cách chuyển chúng vào một hàm tạo dành riêng cho lớp có tên là
Count: 0
Increment
6Mỗi thành phần Livewire trên một trang có phiên bản riêng của lớp
Count: 0
Increment
6 trong bộ nhớ JavaScript. Nếu có một lớp thần trong Livewire, thì đó sẽ là thế nàyKhi khởi tạo
Count: 0
Increment
6, nó trích xuất tất cả siêu dữ liệu được nhúng trong HTML và lưu trữ nó trong bộ nhớCụ thể hơn, nó lấy nội dung của thuộc tính
Count: 0
Increment
9 đi kèm với trang [nhớ lại từ đoạn mã trước]
@livewireScripts
0Đây là mã JavaScript thực tế từ hàm tạo của
Count: 0
Increment
6 thực hiện điều này
@livewireScripts
2Bây giờ JavaScript của Livewire biết các thông tin sau về thành phần "bộ đếm"
- Đó là dấu vân tay [một đối tượng chứa tên, id của thành phần, v.v.]
- Đó là serverMemo [dữ liệu liên tục về thành phần]
- Đó là hiệu ứng [tác dụng phụ sẽ chạy khi tải trang]
Hiểu ba thuộc tính này là điều cần thiết để hiểu hoạt động bên trong của Livewire. Chúng tôi sẽ xem lại chúng sau chi tiết hơn
Giai đoạn khởi tạo cuối cùng là để Livewire duyệt qua tất cả các nút DOM trong một thành phần và tìm kiếm bất kỳ thuộc tính Livewire nào
Trong trường hợp của chúng tôi, chúng tôi có một nút có thuộc tính
Count: {{ $count }}
Increment
31
@livewireScripts
4Khi Livewire nhìn thấy phần tử này, nó sẽ đăng ký một trình xử lý sự kiện
Count: {{ $count }}
Increment
32 trên đó, với một trình xử lý kích hoạt yêu cầu AJAX tới máy chủTrước khi chúng tôi chuyển sang điều đó, hãy xem xét nhanh về vị trí của chúng tôi
Chúng tôi có HTML trên trang trông như thế này
@livewireScripts
6Và trong bộ nhớ, JavaScript có một phiên bản của lớp
Count: 0
Increment
6 với tất cả dữ liệu chúng ta cần về thành phần Livewire nàyHiện tại cũng có một trình lắng nghe sự kiện được đính kèm với phần tử
Hãy chuyển sang khái niệm lớn tiếp theo. thực hiện cập nhật. Mà trong trường hợp của chúng tôi trông giống như nhấp vào nút
Cập nhật trang
Thay vì xem qua mọi thứ xảy ra khi nhấp vào nút, chúng ta hãy xem xét yêu cầu AJAX được gửi đến máy chủ và cả phản hồi AJAX quay lại
Chúng ta có thể nói chi tiết hơn trong một phút, nhưng có thể hữu ích nếu bạn nhìn nhận điều này từ góc độ từ ngoài vào trong
Yêu cầu AJAX
@livewireScripts
8Có RẤT NHIỀU thứ đang diễn ra ở đây, vì vậy chúng ta sẽ dành cả một phần cho đối tượng yêu cầu này, nhưng điều quan trọng cần chú ý là đối tượng
Count: {{ $count }}
Increment
34 và mảng
Count: {{ $count }}
Increment
35Đây là hai thứ sẽ trông trực quan với bạn
Phản hồi AJAX
Count: {{ $count }}
Increment
0
Count: {{ $count }}
Increment
36Bây giờ máy chủ đã hoàn thành công việc của mình, phản hồi quay lại chứa HTML mới sẽ hiển thị trên trang VÀ dữ liệu mới được biểu thị bằng JSON
Một lần nữa, tôi sẽ dành toàn bộ phần cho những gì đang diễn ra ở đây, nhưng hãy bắt đầu với việc tìm hiểu sâu về yêu cầu
Yêu cầu
Tôi không chắc có cách nào tốt hơn để tiếp cận phần này ngoài việc chỉ giải thích từng mục riêng lẻ trong tải trọng yêu cầu. Hãy làm nó
vân tay
Count: {{ $count }}
Increment
1Đây là dữ liệu được liên kết với một thành phần làm cho nó trở nên độc nhất và cung cấp thông tin không thay đổi cần thiết về nó
Ngoài
Count: {{ $count }}
Increment
37 và
Count: {{ $count }}
Increment
38 của thành phần, còn có thông tin về ngôn ngữ của ứng dụng và thông tin về đường dẫn của trang gốc mà thành phần này được tải trên đóThông tin này thực sự là một phần thiết yếu trong hệ thống bảo mật của Livewire. Khi máy chủ nhận được dữ liệu này, nó sẽ tra cứu lộ trình tải trang ban đầu, trích xuất bất kỳ phần mềm trung gian xác thực nào [và phần mềm trung gian khác] và áp dụng chúng cho mọi yêu cầu tiếp theo từ thành phần này
Bằng cách này, nếu một thành phần được tải trên một trang có ủy quyền đặc biệt, thì ai đó không thể thực hiện yêu cầu AJAX đối với thành phần đó từ một trang khác mà không có ủy quyền đó
bản ghi nhớ máy chủ
Count: {{ $count }}
Increment
2“Bản ghi nhớ máy chủ” là tất cả dữ liệu KHÔNG thay đổi trong suốt vòng đời của một thành phần. Dữ liệu này được sử dụng để cho Livewire biết cách “hydrat hóa” hoặc khởi động lớp thành phần
Count: {{ $count }}
Increment
39 của chúng tôi như thể nó đang chạy trong phần phụ trợ suốt thời gian quaCó rất nhiều ở đây, nhưng tôi sẽ chỉ đề cập đến những gì liên quan đến hướng dẫn này
bản ghi nhớ máy chủ. dữ liệu
Count: {{ $count }}
Increment
3Đối tượng dữ liệu là một trong những phần dữ liệu quan trọng và rõ ràng nhất mà chúng ta cần gửi lại máy chủ. Đây là cách phía PHP của Livewire biết rằng họ cần đặt
@livewireScripts
00 thành
@livewireScripts
01 cho yêu cầu tiếp theobản ghi nhớ máy chủ. dữ liệu
Count: {{ $count }}
Increment
4Chúng tôi không sử dụng
@livewireScripts
02 cho yêu cầu này, nhưng điều đáng nói. Mảng này lưu trữ thông tin sâu hơn về dữ liệu. Ví dụ: chúng tôi đặt thuộc tính
@livewireScripts
03 thành Eloquent Collection,
@livewireScripts
02 sẽ lưu trữ một ghi chú về điều đó để JavaScript chỉ xem dữ liệu dưới dạng một mảng đơn giản, nhưng PHP sẽ không "hydrat hóa" nó trở lại thành Eloquent collection cho mỗi yêu cầutổng kiểm tra
Count: {{ $count }}
Increment
5Đây là tính năng bảo mật quan trọng nhất trong Livewire. Mỗi tải trọng thành phần được ký bằng hàm băm tổng kiểm tra bảo mật được tạo từ toàn bộ tải trọng. Bằng cách này, nếu có bất kỳ thứ gì can thiệp vào dữ liệu được sử dụng để gửi lại máy chủ, phần phụ trợ sẽ có thể biết điều đó và sẽ đưa ra một ngoại lệ
cập nhật
Count: {{ $count }}
Increment
6"cập nhật" là danh sách các hướng dẫn để thực hiện trên thành phần trong phần phụ trợ. Trong trường hợp của chúng tôi, chúng tôi đang gọi phương thức "increment". Nhưng đây là nơi mà bất kỳ bản cập nhật
@livewireScripts
05 hoặc sự kiện đã gửi nào sẽ đi quaPhew, ok, bây giờ chúng ta đã có một chút bối cảnh, hãy xem điều gì sẽ xảy ra trên máy chủ khi nó nhận được tải trọng yêu cầu này
Dưỡng ẩm theo yêu cầu
Ok, đã đến lúc PHP. Tôi sẽ không viết ra mọi hoạt động PHP đơn lẻ xảy ra trong một yêu cầu Livewire bởi vì cả bạn và tôi đều ghét điều đó
Thay vào đó chúng ta sẽ chỉ nhìn vào những điểm nổi bật
Khi tải trọng đến từ trình duyệt, PHP sẽ tạo một đối tượng Yêu cầu Livewire mới để lưu trữ tất cả dữ liệu
Count: {{ $count }}
Increment
7
@livewireScripts
06 là một thể hiện của lớp
Count: {{ $count }}
Increment
39 Livewire thực tế. Tuy nhiên, nó vẫn chưa được “ngậm nước” [chứa đầy đủ dữ liệu hoặc “trạng thái” từ giao diện người dùng]Phần còn lại của điều kỳ diệu xảy ra trong một phương thức bên trong nhà cung cấp dịch vụ của Livewire [
@livewireScripts
08] được gọi là.
@livewireScripts
09. Đây là một hương vị của những gì bên trong
Count: {{ $count }}
Increment
9Để chúng tôi rõ ràng, đây là mã nguồn sao chép/dán thực tế ở trên. Mục tiêu của tôi là thể hiện khái niệm “hydrat hóa” và “khử nước” trực tiếp trong mã
Bạn có thể thấy đoạn mã trên rằng yêu cầu đi qua các phần mềm trung gian này theo một chiều trên đường vào và sau đó theo thứ tự ngược lại trên đường bạn
Để hiểu cách Livewire “hydrat hóa” thuộc tính của một thành phần, chúng ta sẽ xem nhanh bên trong
@livewireScripts
20Dưới đây là một vài đoạn trích ra để chứng minh
@livewireScripts
0Như bạn có thể thấy trong đoạn mã trên, sau khi “phần mềm trung gian cấp nước” này chạy, lớp thành phần
Count: {{ $count }}
Increment
39 của chúng ta sẽ có các thuộc tính được đặt từ trạng thái giao diện người dùngGọi phương thức "increment"
Bây giờ, thành phần của chúng ta đã “ngậm nước” với trạng thái thích hợp, đã đến lúc thực sự gọi phương thức “increment” của chúng ta trên đó. Điều đó được xử lý trong phần mềm trung gian
@livewireScripts
22. Đây là phiên bản rút gọn để xem nó hoạt động
@livewireScripts
1Như bạn có thể thấy, mỗi bản cập nhật kích hoạt
@livewireScripts
23 trên thành phần. Việc triển khai phương thức này không thực sự quan trọng, như bạn có thể tưởng tượng, nó…à…gọi phương thức đó trên lớpKết xuất thời gian
Bây giờ chúng tôi đã thực hiện yêu cầu, cấp nước cho thành phần VÀ gọi phương thức mà chúng tôi dự định gọi, đã đến lúc hiển thị nội dung của thành phần của chúng tôi ra HTML, sau đó gửi nó trở lại giao diện người dùng
Ở cuối ngăn xếp phần mềm trung gian hydrat hóa, có một phần mềm tên là
@livewireScripts
24 chịu trách nhiệm kết xuất một thành phầnThay vì hướng dẫn bạn qua từng lệnh gọi PHP đơn lẻ, tôi sẽ chỉ dán [và làm lại cho đơn giản] trong các đoạn trích có liên quan để bạn có thể nắm được ý chính về cách hiển thị chế độ xem của thành phần Livewire
@livewireScripts
2Sau khi thêm HTML vào phản hồi, Livewire có các phần mềm trung gian khác bổ sung thêm nhiều thứ vào phản hồi. Một trong số họ [
@livewireScripts
20] nhận các giá trị thuộc tính công khai mới từ thành phần và thêm dữ liệu vào tải trọng phản hồiHãy xem xét kỹ hơn về tải trọng Phản hồi trước khi nói chuyện lại với giao diện người dùng
Phản hồi
Đây là Phản hồi đầy đủ từ đầu bài viết này để bạn có thể thấy bức tranh toàn cảnh
Phản hồi AJAX
Count: {{ $count }}
Increment
0
Count: {{ $count }}
Increment
36Hầu hết tải trọng này là tự giải thích. Có hai khái niệm ở đây. “serverMemo” và “hiệu ứng”
Đối tượng “serverMemo” là tất cả “trạng thái” mới của thành phần cho đến khi nó quay trở lại máy chủ cho một yêu cầu khác. Đây là những thứ giống như dữ liệu
Lưu ý rằng cũng có một "tổng kiểm tra". Điều này đã được cập nhật cho tải trọng mới này và sẽ được chuyển đến phần phụ trợ trong yêu cầu bảo mật tiếp theo
Tại thời điểm này, cũng cần lưu ý rằng Livewire cố gắng hết sức để chỉ gửi lượng dữ liệu tối thiểu cần thiết. Ví dụ: bạn sẽ nhận thấy thuộc tính “htmlHash”
Đây là hàm băm của HTML được gửi qua. Bằng cách này, chúng tôi có thể đánh giá yêu cầu tiếp theo nếu HTML khác và chỉ gửi HTML đầy đủ nếu nó đã thay đổi. Mặt khác, chúng tôi có thể tiết kiệm kích thước tải trọng phản hồi
Điều tương tự cũng xảy ra với dữ liệu. Livewire sẽ chỉ gửi dữ liệu khác nhau cho mỗi phản hồi. Hãy nghĩ về nó giống như một "sự khác biệt" của dữ liệu
Bây giờ chúng ta đã thấy toàn bộ chu trình phụ trợ, hãy xem giao diện người dùng làm gì với thông tin này để biến số “0” thành “1”
Bàn giao phản hồi trong JS
Khi phản hồi trở lại, Livewire đã biết thành phần đã gửi nó đi, vì vậy nó có thể khớp phản hồi với thành phần đó và để CNTT xử lý phản hồi
Có một phương thức trong JS trên lớp thành phần có tên là
@livewireScripts
27. Đây là một mẫu của nó để chứng minh những gì nó làm
@livewireScripts
4Như bạn có thể thấy, phản hồi trở lại từ máy chủ và đối tượng thành phần giao diện người dùng của Livewire tự cập nhật với tất cả dữ liệu mới [từ “serverMemo”]
Sau khi tất cả được đồng bộ hóa, cuối cùng cũng đến lúc thao tác với DOM của trang thực. Biến số “0” thành số “1”
Điều này xảy ra bên trong hàm
@livewireScripts
28. Hãy nói về HTML biến hìnhBiến đổi HTML
Để biến “0” thành “1” trên trang, chúng ta CÓ THỂ thay thế tất cả HTML bên trong thành phần bằng HTML mới từ máy chủ
Tuy nhiên, đây là một ý tưởng tồi vì nhiều lý do, chủ yếu là nó sẽ xóa sạch mọi trạng thái tạm thời trong DOM như văn bản trong các kiểu nhập văn bản
Vì vậy, thay vào đó, chúng tôi sử dụng một gói có tên là “morphdom” để tìm ra một cách thông minh những phần nào của DOM thực khác với HTML từ máy chủ và CHỈ thao tác với DOM thực ở những nơi có sự không phù hợp
Cơ chế này xứng đáng có cả một bài viết riêng vì vậy tôi sẽ không đi sâu vào chi tiết về nó ở đây. Vui lòng truy cập nguồn Livewire lặn [áp dụng cho tất cả những điều này] để tìm hiểu thêm về hoạt động bên trong
Sau khi morphdom chạy, HTML được cập nhật thành “1” và chúng ta đã hoàn tất
kết thúc
Phù. Thật là một chuyến đi
Tôi hy vọng điều đó hữu ích cho những bạn đang tìm kiếm kiến thức sâu hơn mà không cần đọc và hiểu từng dòng mã trong Livewire
Bài viết này chỉ lướt qua bề mặt. Có nhiều cơ chế sâu hơn kết hợp với nhau để giúp Livewire hoạt động trơn tru. Có thể chúng sẽ là chủ đề của các bài báo trong tương lai, có thể không. Nhưng bạn luôn có thể xem tất cả chúng bằng cách tự tìm hiểu mã nguồn
Chúc mừng Livewireing. Ca-lép
Tôi thường xuyên gửi email về những thứ thú vị mà tôi đang làm hoặc tung ra. Nếu bạn đào, hãy tiếp tục và đăng ký
Làm cách nào để tải một thành phần mới khi nhấp vào góc?
Đây là tất cả những gì bạn cần làm để tải động một thành phần trong Angular. . Xóa thùng chứa Tạo một nhà máy cho MessageComponent Tạo thành phần bằng cách sử dụng nhà máy Truyền giá trị cho các thuộc tính @Input bằng phương thức cá thể tham chiếu thành phần
Khóa dây trong livewire là gì?
Thêm dây. Chìa khóa. Như một biện pháp cuối cùng, thêm dây. khóa sẽ cho Livewire biết trực tiếp cách theo dõi phần tử DOM . Sử dụng quá mức thuộc tính này là một mùi, nhưng nó rất hữu ích và mạnh mẽ cho các vấn đề về bản chất này.
Làm cách nào để sử dụng Select2 trong Livewire?
Cách tạo menu thả xuống Select2 trong Laravel 9 Livewire . Bước 1. Tạo dự án Laravel Bước 2. Thêm gói Livewire Bước 3. Tạo thành phần Select2 với Livewire Bước 4. Tạo tuyến đường Bước 5. Thiết lập Chế độ xem Blade Bước 6. Thử nghiệm ứng dụng demo
mô hình dây defer là gì?
dây. kiểu mẫu. hoãn lại. điều này sẽ không kích hoạt yêu cầu máy chủ khi thay đổi đầu vào . Nó sẽ lưu giá trị mới vào nội bộ và sẽ chuyển nó sang yêu cầu mạng tiếp theo, yêu cầu này có thể đến từ các trường nhập khác hoặc các lần nhấp vào nút khác.