Laravel 7 新特性-组件以及插槽的简单用法

2020-03-25 19:28:56 浏览数 (1)

Laravel 7 很重要一个更新就是 Blade 组件标签 & 优化

其实组件 和 布局 layout 有点儿类似,我们可以抽离相同的代码块,封装成一个组件。以前我们是封装成多个 layout 来进行布局。这个功能和 Vue 极度类似,很大程度上借鉴了 Vue.js。

ok,废话不多说,我们就来看看组件如何使用。

使用组件

Laravel 7 的版本,新增了一个创建组件的命令,make:component

我们试着生成一个 Header 组件。

代码语言:javascript复制
php artisan make:component Header

运行以上命令,将会生成两个文件,一个是:app/View/Components/Header.php,另一个是:resources/views/components/header.blade

我们先编写组件,编辑 resources/views/components/header.blade

代码语言:javascript复制
<div>
    <ul class="nav">
        <li class="nav-item">
            <a class="nav-link active" href="#">Active</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
            <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
        </li>
    </ul>
</div>

然后组件怎么引入呢?其实就像写标签,HTML 标签一样即可。Laravel 7 里组件的引入都是 以 x- 来进行引入

为了简化方便,我将在 welcome.blade.php 模板里来引入。我将去掉无用的代码,改成精简的 HTML。 要想使用组件 只需要 <x-header></x-header> 即可

代码语言:javascript复制
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <x-header></x-header>
</body>
</html>

其实我们也可以在进行简化 采用如下的方式也是同样的道理

代码语言:javascript复制
<x-header />

是不是非常方便?我们以后在进行布局的时候,时不时可以直接采用组件的方式呢。

组件传参

字符串传参

熟悉 Vue 的童鞋,知道我们组件是可以进行传参的,那么在 Laravel 7 里可不可以呢?

答案是当然可以。

接下来我们来看下 另一个文件 app/View/Components/Header.php

代码语言:javascript复制
<?php

namespace AppViewComponents;

use IlluminateViewComponent;

class Header extends Component
{
    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return IlluminateViewView|string
     */
    public function render()
    {
        return view('components.header');
    }
}

假如我们传入一个 title 的字段,只需要修改 __construct 构造函数即可

代码语言:javascript复制
public $title;

/**
 * Create a new component instance.
 *
 * @return void
 */
public function __construct($title)
{
    $this->title = $title;
}

之后修改组件传参

代码语言:javascript复制
<x-header title="Laravel 7"></x-header>

接着,我们如果在组件中显示传入的值,直接使用 双大括号即可。

代码语言:javascript复制
<ul class="nav">
    <li class="nav-item">
        <a class="nav-link active" href="#">{{ $title }}</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
    </li>
    <li class="nav-item">
        <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
    </li>
</ul>

以上传递是一个简单的字符串。那么如果传递一个变量呢?

变量传参

变量传参的方式就不可以采用上方的属性传参了。不可以采用如下的方式

代码语言:javascript复制
@php
    $title = 'Hello Laravel 7';
@endphp
<x-header title="{{ $title }}"></x-header>

如果采用以上方式将会输出如下:并不能达到我们想要的效果

代码语言:javascript复制
<?php echo e($title); ?>

那么该怎样使用呢?其实类似于 Vue 一样 采用 : 的方式,然后也不能使用 双大括号了,直接字符串包含变量即可

代码语言:javascript复制
<x-header :title="$title"></x-header>

组件还有一个强大的用法,那就是可以在组件视图中执行组件类上的任何公共方法

假如 app/View/Components/Header.php 文件有一个 返回数据的方法。

代码语言:javascript复制
public function menus()
{
    return [
        'Laravel','Vue','Java'
    ];
}

那么直接就可以在组件中使用

代码语言:javascript复制
<ul class="nav">
    @foreach($menus as $menu)
        <li class="nav-item">
            <a class="nav-link active" href="#">{{ $menu }}</a>
        </li>
    @endforeach
</ul>

方法也可以传递参数,这里我就不演示了。可以参考文档 Blade 模板

插槽

同理,他和 Vue 也类似,插槽意思就是我们可以在组件内添加一些其他内容。 比如:

代码语言:javascript复制
@php
    $title = 'Hello Laravel 7';
@endphp
<x-header :title="$title">
    <div><strong>Whoops!</strong> Something went wrong!</div>
</x-header>

那如果要显示添加的内容,我们组件这里需要添加一个 {{ $slot }} 即可。

组件中的代码如下:

代码语言:javascript复制
<ul class="nav">
    @foreach($menus as $menu)
        <li class="nav-item">
            <a class="nav-link active" href="#">{{ $menu }}</a>
        </li>
    @endforeach
</ul>

{{ $slot }}

插槽也是可以进行传参的。

代码语言:javascript复制
<x-slot name="error">
    Server Error
</x-slot>

然后在组件使用 $error 即可接受传递的内容

代码语言:javascript复制
{{ $error }}

ok,以上就是 关于 Laravel 7 组件的一些新特性,当然其中还有一些用法,我没有说明,你可以参考 官方文档 来进一步使用

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。转载无需与我联系,但须注明出处,注明文章来源 Laravel 7 新特性-组件以及插槽的简单用法

联系我

0 人点赞