Làm cách nào để bạn gọi một thành phần Livewire khi nhấp vào nút?

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
6

Trong 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
8

Trướ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ố 8

Như 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àm

Về cơ bản, chỉ thị Blade này biên dịch thành hai


    

    @livewireScripts
5

Như 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

3

Livewire 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

5

Sau 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

6

Mỗ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ày

Khi 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
2

Bâ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
4

Khi 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
6

Và 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ày

Hiệ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
8

Có 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

36

Bâ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 qua

Có 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 theo

bản ghi nhớ máy chủ. dữ liệu

Count: {{ $count }} Increment

4

Chú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ầu

tổ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 qua

Phew, 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
20

Dưới đây là một vài đoạn trích ra để chứng minh


    

    @livewireScripts
0

Như 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ùng

Gọ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
1

Như 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ớp

Kế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ần

Thay 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
2

Sau 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ồi

Hã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

36

Hầ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
4

Như 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ình

Biế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.

Chủ Đề