如何在 2 个 livewire 文件中定义 2 个 alpines 组件

Posted

技术标签:

【中文标题】如何在 2 个 livewire 文件中定义 2 个 alpines 组件【英文标题】:How to define 2 alpines components in 2 livewire files 【发布时间】:2021-03-17 04:08:12 【问题描述】:

在 laravel 7 /livewire 1.3 / alpinejs 2 项目中,我制作了 crud,当 为了添加/编辑,我将 livewire.admin.app-news.form 包含在数据列表中(resources/views/livewire/admin/app-news/container.blade.php): 在这个文件中定义了 adminNewsComponent:

<article class="admin_page_container">
    
    <div class="form-admin-news" x-data="adminNewsComponent()"  x-init="initAdminNewsComponent()" >
        
        <div class="">
            ...
    
            @include('livewire.common.alert_messages')
    
    
            @if($updateMode=='edit' or $updateMode=='add')
                @include('livewire.admin.app-news.form')
            @endif
            
            @if($updateMode=='browse')
                @if(count($newsDataRows) == 0)
                    <div class="alert alert-info" role="alert">
                        No data found
                    </div>
                @endif
                
                @if(count($newsDataRows) > 0)
                    
                    <div class="table-responsive table-wrapper-for-data-listing" x-data="selectedNewsIdsBoxXData()">
                        DATA LISTING
                    </div> <!-- <div class="table-responsive table-wrapper-for-data-listing"> -->
                
                @endif -- @if(count($newsDataRows) > 0) --
            @endif -- @if($updateMode=='browse')  --
        </div> <!-- <div class=""> -->
        
        
        <section class="mt-2">
            @if($updateMode=='browse' and count($newsDataRows) > 0)
                 $newsDataRows->links() 
            @endif
        </section>
    
    </div> <!-- <div class=""> -->
</article> <!-- page_content_container -->

@push('styles')
    <link href="/css/quill.snow.css" rel="stylesheet">
@endpush

@push('scripts')
    <script src=" asset('/js/quill.js') "></script>
@endpush

@push('scripts')
    <script>
        function selectedNewsIdsBoxXData() 
            console.log('!!!selectedNewsIdsBoxXData::')
                ...
        


        function adminNewsComponent() 

            ...

         // function adminNewsComponent() 



    </script>
@endpush

adminNewsComponent 的所有方法和数据都可以正常工作,但问题是当我打开编辑器时 带行的表格:

@if($updateMode=='edit' or $updateMode=='add')
    @include('livewire.admin.app-news.form')
@endif

我无法在 resources/views/livewire/admin/app-news/form.blade.php 中定义类似的组件:

<article>
    
    @inject('viewFuncs', 'App\library\viewFuncs')
    
    <form class="form-editor" @if($updateMode=='edit')  wire:submit.prevent="update"
          @else  wire:submit.prevent="store" @endif >
        <div class="card" x-data="adminNewsEditorComponent()" x-init="initAdminNewsEditorComponent()" >
            <div class="card-body card-block">

                ...
    
    
                @section('scripts')
                <script>


                    function adminNewsEditorComponent() 

我明白了

ReferenceError: adminNewsEditorComponent is not defined.

我想原因是这里使用了@include(,实际上我想要不同的文件 并定义了 2 个不同的组件。

如何解决?

谢谢!

【问题讨论】:

请不要改变你的问题的范围,尤其是在它得到回答之后。如果您对答案有新问题,请ask a new question 【参考方案1】:

我遇到过类似的问题。我先解释一下原因。 Blade push 适用于第一次渲染,因此当我们使用 if 条件动态加载组件时,推送将不起作用。

换句话说,如果$updateMode = 'edit' or 'add' 在第一次渲染期间,那么推送会将脚本添加到布局中。如果不是,它将不适用于使用 livewire 进行的连续渲染。

@if($updateMode=='edit' or $updateMode=='add')
    @include('livewire.admin.app-news.form')
@endif

所以唯一的解决方案是将推送脚本移动到container.blade.php。那么这个错误就可以解决了。

【讨论】:

以上是关于如何在 2 个 livewire 文件中定义 2 个 alpines 组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Livewire 2 中实现实时验证?

Laravel Livewire,两个 livewire 组件之间的通信

点击gotoPage方法后如何在livewire中调用JS函数?

如何从 Laravel Livewire 的属性中删除上传的文件?

如何在livewire中获取菜单活动元素的应用程序的当前url

当使用 Livewire 在 Laravel Blade 中运行验证时,如何隐藏某些内容?