Как получить доступ к объявленной переменной из laravel-компонента livewire в макете приложения

#php #laravel #laravel-livewire

#php #laravel #laravel-livewire

Вопрос:

Я попытался передать переменную из компонента livewire:

 class Index extends Component
{
    public function render()
    {
        return view('livewire.index')->with('type', config('constants.NONAUTH'));
    }
}
  

и доступ к нему из layouts.app:

 <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

{{dd($type)}}

@include('includes.head')

...
  

Я получаю сообщение об ошибке, которое $type не определено, каков правильный способ сделать это?

Комментарии:

1. Вы должны создать layouts.app компонент livewire, так как этот компонент является дочерним по отношению к layout.app , у него не было бы доступа ни к каким данным внутри.

2. layouts.app является ли макет по умолчанию, который выдает содержимое компонента livewire.index , как вы предлагаете мне сделать его компонентом в этом случае? @OzanKurt

3. Просто создайте новый компонент Livewire с именем LayoutApp и верните layouts.app представление. НО сейчас моему мозгу приходится нелегко. Тогда как бы вы расширили свои другие представления на layouts.app…

4. Извините, мой подход, вероятно, не сработает : (

5. На самом деле это не так, это также предполагает, что я хочу отображать layouts.app как компонент, когда на самом деле это просто макет — оболочка. Спасибо за вашу помощь.

Ответ №1:

объявите общедоступную переменную $type и установите эту переменную внутри вашей функции mount() следующим образом:

 class Index extends Component
{
    public $type = null;
    
    public function render()
    {
        return view('livewire.index');
    }

    public function mount() 
    {
         $this->type = config('constants.NONAUTH');
    }

}

  

Отредактировано:

Я вижу, я понял вас неправильно в первый раз,. Я снова прочитал и понял, что то, что вы хотите, не сработает, потому что вы пытаетесь получить доступ к переменной, которая объявляется после макета вашего приложения. Livewire визуализирует свой компонент сразу после загрузки вашего макета. Я бы рекомендовал вам создать весь макет вашего приложения, используя livewire.

Да, могут быть различные способы объявления чего-либо из livewire в вашем блейде. Вот один:

Вы можете запустить событие, которое может быть прослушано global JS внутри вашего блейда. затем вы можете установить это значение внутри вашего блейд-компонента, используя jquery / vanilla js.

Комментарии:

1. Я также пробовал это до запроса, это не работает.