【问题标题】:Livewire Mount vs. RenderLivewire 安装与渲染
【发布时间】:2021-09-15 20:49:55
【问题描述】:

我想了解 Livewire 组件中的 mount 和 render 方法有什么区别,因为我看到了两者都用于定义变量初始状态的示例。例如,当您使用模型中的记录实例化一个变量时,¿哪个是使用 ORM 语法加载数据的正确位置?

【问题讨论】:

    标签: laravel eloquent laravel-livewire


    【解决方案1】:

    mount() 方法是所谓的“生命周期挂钩”。 Livewire 中还有一些此类方法,官方文档中概述了这些方法 - https://laravel-livewire.com/docs/2.x/lifecycle-hooks - 而 render() 是调用以呈现实际视图的最终方法。

    mount() 方法是组件的构造。这是您传递组件所需数据的地方。此方法仅在组件初始化时调用一次,这意味着它通常也用于设置非常量的初始值。

    但是,由于 Livewire 组件的公共属性只能是集合、模型的实例、数组或原生 PHP 类型(如字符串和整数),因此您不能传递更多依赖于状态的“高级”类型 - 因为例如模型查询的分页。

    这就是为什么有时需要通过render() 方法将数据传递给组件的原因,就像在普通 Laravel 控制器中返回数据时一样。在这里传递数据的另一个原因是数据不会像组件的公共属性那样暴露在 JavaScript 中。

    render() 方法在每个生命周期请求结束时调用,但在组件脱水之前。官方文档有更详细的信息https://laravel-livewire.com/docs/2.x/rendering-components#render-method - 这里定义的数据不是类的属性,因此无法在组件的其他方法中访问。

    因此,要回答您的问题,这取决于您传递的数据类型,数据是否应该可以在类中的其他方法中访问,或者它是否敏感以至于它不应该在附加的 JavaScript 对象中可见到组件。

    【讨论】:

    • 我认为这是一个非常清晰和全面的答案。
    • 鉴于已接受的答案,我还有一个问题:难道不是说在 render() 方法中加载模型会在每次视图刷新时执行不必要的查询吗?例如,如果我们需要一个国家列表来填充表单的选择控件,那么使用 mount() 方法加载模型不是更好吗,因为该列表永远不会改变?
    • 这不会有什么不同,因为 Livewire 是无状态的 - 它只来回发送模型类型和 ID,因此它会在每个请求时重新水合。这意味着它会在水合时查询数据库以填充您在 mount 方法中设置的数据。
    【解决方案2】:

    mount 方法就像任何构造函数一样,您可以在多种情况下使用它,在其他情况下您不需要它。例如,如果您有一个嵌套组件到一个完整页面组件中,但最初嵌套属性为 null 或需要任何定义,您可以在此处定义它。也用于路由模型绑定定义,但您需要清楚您在此处声明的任何定义在初始化组件后都不会更新、水合或遭受任何更改。大多数情况下,这是与渲染方法的区别。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2021-01-27
      • 2021-01-07
      • 2021-03-03
      • 2018-11-15
      • 2021-08-04
      • 2022-07-05
      • 2015-02-23
      • 1970-01-01
      相关资源
      最近更新 更多