首页 > 其他分享 >Laravel 组件

Laravel 组件

时间:2024-07-16 18:29:37浏览次数:15  
标签:Laravel slot return 插槽 视图 组件 View

创建组件命令

php artisan make:component Alert

make:component 命令还将为组件创建视图模板。视图将放在 resources/views/components 目录中。为自己的应用程序编写组件时,组件会在 app/View/components 目录和 resources/views/components 目录中自动发现,因此通常不需要进一步的组件注册。

也可以在子目录中创建组件:
php artisan make:component Forms/Input
上面的命令将在 App\View\Components\Forms 目录中创建一个 Input 组件,该视图将放在 resources/views/Components/Forms 目录中。

渲染组件
要显示组件,可以在其中一个 Blade 模板中使用 Blade 组件标记。Blade 组件标记以字符串 x- 开头,后跟组件类的蛇形名称:
<x-alert/> 或者 <x-alert></x-alert>
<x-user-profile/> 或者 <x-user-profile/> </x-user-profile>
如果组件类嵌套在 App\View\Components 目录的更深处,则可以使用 . 字符表示目录嵌套。例如,如果我们假设一个组件位于 App\View\Components\Forms\Input.php ,我们可以这样处理:
<x-forms.input/>

给组件传递数据
可以使用 HTML 属性将数据传递给 Blade 组件。硬编码、原始值可以使用简单的 HTML 属性字符串传递给组件。PHP 表达式和变量应通过使用 : 字符作为前缀的属性传递给组件:
<x-alert type="error" :message="$message"/>
你应该在组件类的构造函数中定义组件所需的数据。组件上的所有公共属性将自动提供给组件的视图。不必从组件的 render 方法将数据传递到视图。以下是app/View/components目录下的Alert.php文件。

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    /**
     * The alert type.
     *
     * @var string
     */
    public $type;

    /**
     * The alert message.
     *
     * @var string
     */
    public $message;

    /**
     * 创建组件实例
     *
     * @param  string  $type
     * @param  string  $message
     * @return void
     */
    public function __construct($type, $message)
    {
        $this->type = $type;
        $this->message = $message;
    }

    /**
     * 将一个视图或者字符串传递给组件用于渲染
     *
     * @return \Illuminate\View\View|\Closure|string
     */
    public function render()
    {
        return view('components.alert');
    }
}

  渲染组件时,可以通过按名称回显变量来显示组件公共变量的内容:

<div class="alert alert-{{ $type }}">
    {{ $message }}
</div>

  

驼峰命名

应使用 camelCase 指定组件构造函数参数,而在 HTML 属性中引用参数名称时应使用 kebab-case。例如,给定以下组件构造函数:

/**
 * 创建组件实例
 *
 * @param  string  $alertType
 * @return void
 */
public function __construct($alertType)
{
    $this->alertType = $alertType;
}

  

$alertType 参数可以使用如下所示的方式接受数据:
<x-alert alert-type="danger" />

访问组件类中的属性和插槽
Blade 组件还允许你访问类的 render 方法中的组件名称、属性和插槽。但是,为了访问这些数据,应该从组件的 render 方法返回闭包。闭包将接收一个 $data 数组作为它的唯一参数。此数组将包含几个元素,这些元素提供有关组件的信息:

/**
 * 获取表示组件的视图/内容
 *
 * @return \Illuminate\View\View|\Closure|string
 */
public function render()
{
    return function (array $data) {
        // $data['componentName'];
        // $data['attributes'];
        // $data['slot'];
                 return 'components.alert';

        return '<div>Components content</div>';

        return <<<'blade'
                <div class="alert alert-danger">
                    {{ $message }}
                </div>
            blade;
    };
}

  

组件传递的数据无法修改,修改数据可以在构造函数中修改。

闭包应该返回一个字符串。如果返回的字符串与现有视图相对应,则将呈现该视图;否则,返回的字符串将作为内联 Blade 视图进行计算。

插槽
通常需要通过 「插槽」 将其他内容传递给组件。通过回显 $slot 变量来呈现组件插槽。为了探索这个概念,我们假设 alert 组件具有以下内容: 类似 VUE

/resources/views/components/alert.blade.php

<div class="alert alert-danger">
    {{ $slot }}
</div>

  我们可以通过向组件中注入内容将内容传递到 slot :

<x-alert>
    <strong>Whoops!</strong> Something went wrong!
</x-alert>

  有时,组件可能需要在组件内的不同位置渲染多个不同的插槽。让我们修改警报组件以允许注入 「标题」插槽:

<span class="alert-title">{{ $title }}</span>

<div class="alert alert-danger">
    {{ $slot }}
</div>

  可以使用 x-slot 标记定义命名插槽的内容。任何不在显式 x-slot 标记中的内容都将传递给 $slot 变量中的组件:

<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

  

作用域插槽
如果你使用过诸如 Vue 之类的 JavaScript 框架,那么你可能熟悉 「作用域插槽」,它允许你从插槽中的组件访问数据或方法。通过在组件上定义公共方法或属性,并通过 $component 变量访问插槽中的组件,可以在 Laravel 中实现类似的行为。在本例中,我们假设 x-alert 组件在其组件类上定义了一个公共的 formatAlert 方法:

<x-alert>
    <x-slot name="title">
        {{ $component->formatAlert('Server Error') }}
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

  内联组件视图

/**
 * 获取表示组件的视图/内容。
 *
 * @return \Illuminate\View\View|\Closure|string
 */
public function render()
{
    return <<<'blade'
        <div class="alert alert-danger">
            {{ $slot }}
        </div>
    blade;
}

  

使用组件布局

之前我们使用模板继承的方式进行布局。现在我们学习了组件 接下来我们使用组件的方式的来进行布局。

resources/views/components/layout.balde.php

<html>
    <head>
        <title>{{ $title ?? 'Todo Manager' }}</title>
          <style>
        .header{
            width: 100%;
            height: 100px;
            background-color:#f90;
        }
        .main{
            display: flex;
            width: 100%;
            min-height:500px;
        }
        .ce{
            width: 300px;
            background-color:pink;
        }
        .content{
            width: 100%;
            background-color:#cbd5e0;
        }
    </style>
    </head>

    <body>
      <header class="header"></header>
    <div class="main">
        <div class="ce">
            我是侧边栏
        </div>
        <div class="content">
                        {{ $slot }}
        </div>
    </div>
    </body>
</html>

  

应用布局组件

一旦定义了 layout 组件,我们就可以创建一个使用该组件的 Blade 视图。在本例中,我们将定义一个显示任务列表的简单视图:
resources/views/user.blade.php

<x-layout>
       <div>
                <h1>我是个人中心</h1>
        </div>
</x-layout>

  请记住,注入到组件中的内容将提供给 layout 组件中的默认 $slot 变量。正如你可能已经注意到的,如果提供了 $title 插槽,那么我们的 layout 也会尊从该插槽;否则,将显示默认的标题。我们可以使用 x-slot 插入标题

<x-layout>
    <x-slot name="title">
        Custom Title
    </x-slot>

    @foreach ($tasks as $task)
        {{ $task }}
    @endforeach
</x-layout>

  转载于:https://blog.csdn.net/qvtcxxjs/article/details/123299785

 

标签:Laravel,slot,return,插槽,视图,组件,View
From: https://www.cnblogs.com/flzs/p/18305876

相关文章

  • vue2 简洁的行政区划选择组件封装
     vue2简洁的行政区划选择组件封装//判断变量是否为null或undefinedexportfunctionisNullOrEmpty(value){ returnvalue===null||value===undefined||value===''}//判断变量是否为null或undefinedexportfunctionisNullOrUndefined(value){ ret......
  • 2024-07-16 记录vue内置组件(ps:内容来自GPT)
    1. Transition和TransitionGroup用途:用于为单个元素或组件提供过渡效果。TransitionGroup则用于列表中的多个元素或组件的过渡效果。特点:Transition:只影响单个元素或组件,不会额外渲染DOM元素。TransitionGroup:渲染一个真实的DOM元素(默认为<span>),可以通过tag属性改变渲染......
  • 深入探讨React表单组件:从基础到高级
    深入探讨React表单组件:从基础到高级大家好!今天我们来聊聊React中的表单组件。表单在前端开发中是非常常见的需求,无论是登录、注册还是数据提交,表单组件都扮演着重要的角色。本文将带你从基础到高级,深入了解React表单组件的使用和优化。基础知识在React中,表单元素(如<input>、<te......
  • 论 Suspense 组件在 Vue 3 中的重要性
        大家好,我是CodeQi! 一位热衷于技术分享的码仔。你是否曾经遇到过在加载大量数据时,界面卡顿或是空白的问题?如果你正在开发一个复杂的前端项目,那么一定需要处理很多异步数据请求。而异步请求太多就会导致用户看到空白屏幕时间变长,这对用户体验非常不友好。......
  • 【vue组件库搭建07】Vitest单元测试
    vitest官网vue-test-utils我们的测试框架选择的是Vitest和vue-test-utils。两者的关系为:Vitest提供测试方法:断言、Mock、SpyOn等方法。vue-test-utils:挂载和渲染组件:VueTestUtils允许您在隔离中挂载组件,这意味着您可以测试单个组件而不必担心其子组件或需要......
  • vite 实现自动导入element plus icons 图标组件
    vite.config.js配置import{fileURLToPath,URL}from"node:url";importComponentsfrom"unplugin-vue-components/vite";importAutoImportfrom"unplugin-auto-import/vite";import{ElementPlusResolver}from"unplugin-v......
  • 引用别的组件
    当GameObject要访问其它对象上的组件时,有下面两种方法方法一(推荐)publicclassMainLogic:MonoBehaviour{publicAudioSourcebgm;//StartiscalledbeforethefirstframeupdatevoidStart(){}//Updateiscalledonceperf......
  • 基于XML配置方式组件管理
    基于XML配置方式组件管理1.组件信息声明配置定义XML配置文件,声明组件类信息1.1基于无参构造函数先准备一个普通的类,里面默认包含无参构造packagecom.ztong.ioc_01;​publicclassHappyComponent{​  //默认包含无参构造  publicvoiddowork(){   ......
  • e4a 组件属性初始化
    按钮、编辑框等等组件画完之后,设置组件的默认属性,比如字体、大小、位置等等:(已有一个编辑框1,一个按钮1) 事件主窗口.创建完毕()'安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行如果权限操作1.取系统版本号()>=23则权限操作1.申请全部权......
  • Vue3中,使用TSX/JSX编写的父组件,如何向子组件中传递具名插槽(slot)的内容
    子组件(Child)-模板代码:<template><divclass="child-component"><divclass="header-box"><slotname="header"></slot></div><slot></slot></div></tem......