创建组件命令

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 组件的更多相关文章

  1. Laravel学习笔记(二)Laravel 应用程序的体系结构

    在一切环境就绪了,当然就要开始了解框架了. 站在巨人的肩膀上,学东西会事半功倍.我在网上找到一篇好文章,正好可以让我轻松了解Laravel应用程序的体系结构.因此借来直接用了. 该章节内容翻译自< ...

  2. laravel项目拉取下来安装,node.js库安装

    1.拉取项目 2.切换分支 圈圈里面是版本 composer 安装laravel组件其他库 安装node.js安装包  npm set registry=https://registry.npm.ta ...

  3. Centos 7 安装composer和Laravel

    composer安装 我安装了lnmp到Centos7里,所以可以直接运行curl -sS https://getcomposer.org/installer | php把安装的composer.ph ...

  4. 如何使用 Laravel Collections 类编写神级代码

    本文首发于 如何使用 Laravel Collections 类编写神级代码,转载请注明出处. Laravel 提供了一些超赞的组件,在我看来,它是目前所有 Web 框架中提供组件支持最好的一个.它不 ...

  5. 怎么理解Laravel的核心架构

    使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一 ...

  6. Laravel Exception结合自定义Log服务的使用

    Laravel Exception结合自定义Log服务的使用 第一部分:laravel关于错误和异常的部分源码 第二部分:自定义异常的使用(结合serviceprovider monolog elas ...

  7. 【PHP】用了这么久的Laravel框架,你分析过核心架构了没

    Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理.用户身份验证等各种需求.另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码的软件包管理器. Laravel以其简洁. ...

  8. lumen 构建api(dingo api)

    什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...

  9. laravel+vue组合的项目中引入ueditor(打包成组件形式)

    前言:最近写东西需要用到ueditor,并且需要是在vue组件中引入. (本博客默认你已经配置了laravel+vue的项目环境,如果还没有配置好的的小伙伴,可以看看我的另一篇博客,链接: http: ...

  10. Laravel自带SMTP邮件组件实现发送邮件(QQ、163、企业邮箱都可)

    Laravel自带SMTP邮件组件实现发送邮件(QQ.163.企业邮箱都可)     laravel自带SMTP邮件配置和遇到的坑 laravel自带SwiftMailer库,集成了多种邮件API,可 ...

随机推荐

  1. 一文读懂Spring的SPI机制

    一. 从类加载说起 Java中的类加载器负载加载来自文件系统.网络或者其他来源的类文件.jvm的类加载器默认使用的是双亲委派模式.三种默认的类加载器Bootstrap ClassLoader.Exte ...

  2. SpringMVC在处理Ajax请求后返回void导致前台Ajax回调函数不执行

    问题简述 在一次SpringMVC项目中,前台通过Ajax请求,准备修改数据库中的数据.因为Ajax请求只是让后台更改数据,所以Controller方法根本不需要返回给前台任何数据,所以我们将Cont ...

  3. iOS使用SignalR客户端代码典范-桥接web SignalR 客户端库

    一.SignalR介绍 SignalR是微软基于.Net提供的一个开源实时Web RPC库,可以用在web实时通信的需求上面,比如聊天,web数据更新 SignalR的接口使用十分简单 由于最近的一个 ...

  4. NOIP模拟75

    前言 先吐槽一下出题人,T2 牛马数据连棵树都不是.. T3 描述不清楚.. T1 如何优雅的送分 解题思路 我考场上还真以为是个送分题,然而... 莫比乌斯反演... 对于一个数字 n 有 \(2^ ...

  5. 使用eNSP配置灵活QinQ

    参考链接:https://blog.csdn.net/xu119718/article/details/55260519 在"使用eNSP配置端口QinQ"实验中是基于端口划分的用 ...

  6. 执行nodejs 内置fs模块

        执行方式1:                 在 cmd 中 任意文件夹路径下输入 node 回车                 C:\Users\32991>node         ...

  7. 使用 Java 客户端通过 HTTPS 连接到 Easysearch

    Easysearch 一直致力于提高易用性,这也是我们的核心宗旨,然而之前一直没有官方的 Java 客户端,也对用户使用造成了一些困扰,现在,我们正式发布了第一个 Java 客户端 Easysearc ...

  8. 手把手教你搭建Docker私有仓库Harbor

    1.什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库.Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访 ...

  9. shiro有哪些组件?

    a.Authentication:身份认证/登录,验证用户是不是拥有相应的身份: b.Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是否能做事情,常见的 ...

  10. C# .net core中如何将多张png图片合并成一个gif

    背景 我们有很多这样的序列帧: 我这边要把这些序列帧裁切最后合并成gif,以下是我裁切后的png文件: 我一开始选用的是 SixLabors.ImageSharp 这是裁切代码: using var ...