」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Laravel Livewire:它是什麼以及如何在您的 Web 應用程式中使用它

Laravel Livewire:它是什麼以及如何在您的 Web 應用程式中使用它

發佈於2024-11-06
瀏覽:310

Livewire 是 Laravel 生态系统中最重要的项目之一,专门针对前端开发。 Livewire v3 最近发布了,让我们来探讨一下 Livewire 是什么,以及什么样的项目适合其架构。

Livewire 的独特之处在于它允许开发“现代”Web 应用程序,而无需使用专用的 JavaScript 框架。

使用 Livewire,可以开发提供与 Vue 或 React 相同水平的反应性的 Blade 组件,而无需通过解耦的前端和后端来管理项目的复杂性。 您可以在 Laravel 和 Blade 模板的范围内继续开发您的应用程序。

Livewire 的工作原理

Livewire 是一个 Composer 包,您可以将其添加到 Laravel 项目中。然后必须使用适当的 Blade 指令在每个 HTML 页面(或该页面,如果您想要创建单页面应用程序)上激活它。 Livewire 组件由 PHP 类和 Blade 文件组成,其中包含特定前端组件如何工作以及必须呈现的逻辑。

当浏览器要求访问使用 Livewire 的页面时,会发生以下情况:

  • 页面以组件的初始状态呈现,就像使用 Blade 创建的任何页面一样;
  • 当组件 UI 触发交互时,将对适当的路由进行 AJAX 调用,指示 Livewire 组件和发生的交互,以及组件的状态;
  • 数据在组件的 PHP 部分进行处理,该部分执行交互结果的新渲染并将其发送回浏览器;
  • 页面的 DOM 根据从服务器收到的更改而更改。

这与 Vue 和 React 的做法非常相似,但在这种情况下,响应交互的反应性逻辑由后端管理,而不是在 javascript 端管理。

为了帮助您更好地理解逻辑,我将在下面向您展示这个比较的示例。

如果您想了解更多有关构建开发人员驱动型公司所面临的挑战,您可以在 Linkedin 或 X 上关注我。

如何安装 Laravel Livewire

Livewire 安装绝对是最少的。在 Laravel 项目中安装 Composer 包,并将必要的 Blade 指令添加到所有页面(或项目中所有 Blade 模板所衍生的通用布局)。

composer require livewire/livewire

    ...

    @livewireStyles


    ...

    @livewireScripts


如何创建 Laravel Livewire 组件

安装 Composer 软件包后,可以使用新的 Artisan make 子命令来创建新的 Livewire 组件。每个组件都将由一个 PHP 类和一个 Blade 视图组成。

它类似于Blade的基于类的组件。

php artisan make:livewire SpyInput    
COMPONENT CREATED ?

CLASS: app/Http/Livewire/SpyInput.php
VIEW: resources/views/livewire/spy-input.blade.php

此示例中的组件将“监视”HTML 输入字段中写入的内容,而无需编写 JavaScript 代码。

然后我们向组件类插入一个公共属性:

// app/Http/Livewire/SpyInput.php

namespace App\Livewire;

use Livewire\Component;

class SpyInput extends Component
{
    public string $message;

    public function render()
    {
        return view('livewire.spy-input');
    }
}

组件视图实现如下:

// resources/views/livewire/spy-input.blade.php

You typed: {{ $message }}

最后将 Livewire 组件放入刀片视图中:


    @livewireStyles



    

    @livewireScripts


在普通的 Blade 组件中,组件类的所有公共属性在 Blade 模板中都是可见的。因此在 {{ $message }} 中,$message 属性的值将自动显示。然而,在普通的基于类的组件中,这只发生在第一个组件渲染时。如果您在输入字段中输入内容,span 标记中不会发生任何变化。

然而,在Livewire 组件中,我们在字段中使用了wire:model="message" 属性。该属性确保输入字段的值链接到 PHP 类中的 $message 属性。当您在输入字段中写入新值时,它将发送到服务器,服务器更新 $message 的值并执行新的渲染,将其发送回前端,然后更新 {{ $消息 }}.

通过打开浏览器开发工具的“网络”选项卡,我们会注意到键盘上的每个按键都会按以下路线调用服务器:

/livewire/message/

对每个调用的响应包含组件的新渲染 HTML,Livewire 会将其插入到页面中以代替旧的 HTML。可以使用各种自定义导线属性。例如,您可以在单击按钮时执行组件类的公共方法。以下是此出价的示例:


class SpyInput extends Component
{
    public function doSomething()
    {
        // Your code here…
    }
}

其中doSomething是Livewire组件的PHP类的公共方法。

与其他 Laravel 功能集成

连接到组件的 PHP 类的行为与 Laravel 项目中的任何其他 PHP 类类似。唯一的区别是它使用 mount 方法而不是经典的 __construct 类构造函数来初始化类的公共属性。

{{-- Initial assignment of the the $book property in the ShowBook class --}}


class ShowBook extends Component
{
    public $title;
    public $excerpt;

    // "mount" instead of "__constuct"
    public function mount(Book $book = null)
    {
        $this->title = $book->title;
        $this->excerpt = $book->excerpt;
    }
}

您还可以使用受保护的属性$rules来配置前端发送到后端的数据的验证限制。您必须调用 validate() 方法来验证数据:

@error('title') {{ $message }} @enderror @error('excerpt') {{ $message }} @enderror @error('isbn') {{ $message }} @enderror
class BookForm extends Component
{
    public $title;
    public $excerpt;
    public $isbn;

    protected $rules = [
        'title' => ['required', 'max:200'],
        'isbn' => ['required', 'unique:books', 'size:17'],
        'excerpt' => 'max:500'
    ];

    public function saveBook()
    {
        $validated = $this->validate($this->rules);

        Book::create($validated);

        return redirect()->to('/books);
    }
}

或者您可以使用 PHP 属性来声明类属性所需的验证规则:

class BookForm extends Component
{
    #[Validate('required|max:200')]
    public $title;

    #[Validate('required|unique:books|size:17')]
    public $isbn;

    #[Validate('max:500')]
    public $excerpt;

    public function saveBook()
    {
        $this->validate();

        Book::create([
            'title' => $this->title,
            'isbn' => $this->isbn,
            'excerpt' => $this->excerpt,
        ]);

        return redirect()->to('/books);
    }
}

一般来说,每个 Livewire 组件的行为方式与 Laravel 开发人员期望 Laravel 项目中的 PHP 类的行为方式相同。因此允许创建反应式 Web 界面,而无需分离 Laravel 和 Vue/React 之间的开发项目。

免费监控您的 Laravel 应用程序

Inspector是专门为软件开发人员设计的代码执行监控工具。您不需要在服务器级别安装任何东西,只需安装 Laravel 包 就可以开始了。

如果您正在寻找 HTTP 监控、数据库查询见解以及将警报和通知转发到您首选消息传递环境的功能,请免费尝试 Inspector。注册您的帐户。

或者在网站上了解更多信息:https://inspector.dev

Laravel Livewire: What it is, and how to use it in your web app

版本聲明 本文轉載於:https://dev.to/inspector/laravel-livewire-what-it-is-and-how-to-use-it-in-your-web-app-34ae?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-22
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-07-22
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-07-22
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-07-22
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-22
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-07-22
  • Python環境變量的訪問與管理方法
    Python環境變量的訪問與管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    程式設計 發佈於2025-07-22
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-07-22
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-22
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-07-22
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-07-22
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-07-22
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-07-22
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-07-22
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-07-22

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3