Livewire: невозможно вызвать метод компонента. Открытый метод [дочернее имя метода] не найден в компоненте: [родительский]

#php #laravel #laravel-livewire

#php #laravel #laravel-livewire

Вопрос:

Используя Laravel Livewire, у меня есть родительский и (повторяющийся) дочерний. Дочерний блейд имеет вызов childMethod() through wire:click="childMethod()" .

Проблема в том, что parent->childMethod() он вызывается, когда я хотел child->childMethod() , чтобы его вызывали.

Родительский компонент

 class StatementsTable extends Component // parent
{
    public function render()
    {
        return view('livewire.statements-table', [
            'statements' => Statement::limit(10)->get()
        ]);
    }
}
  

Родительский statements-table.blade

 <table class="table">
    @foreach($statements as $statement)
        @livewire('statement-line', ['statement' => $statement], key($statement->id))
    @endforeach
</table>
  

Дочерний компонент:

 class StatementLine extends Component
{
    public $statement;
    public $calls = 0;

    public function childMethod()
    {
        $this->calls  = 1;
    }

    public function mount($statement): void
    {
        $this->statement = $statement;
    }

    public function render()
    {
        return view('livewire.statement-line');
    }
}
  

Дочерний statement-line.blade

 {{-- dd(get_defined_vars()) --}}
<tr>
    <td>{{$statement->name}}</td>
    <td>{{$statement->date}}</td>
    <td>{{$calls}}</td>
    <td><button wire:click="childMethod">Plus</button></td>
</tr>
  

Почему я получаю

 LivewireExceptionsMethodNotFoundException
Unable to call component method. Public method [childMethod] not found on component: [statements-table]
  

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

1. Слишком много кодов для ответа

2. @PaulH Я тоже сталкиваюсь с этой проблемой. Вы нашли решение?

Ответ №1:

Возникла та же проблема. Решение было:

Убедитесь, что дочернее представление имеет ОДИН корневой элемент, как указано в документах Livewire .

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

1. Хотя это действительно очень важно, это не причина проблемы. Единственным корневым элементом родительского элемента является <table>, а единственным корневым элементом дочернего элемента является <tr>

Ответ №2:

Вы можете использовать свои обратные вызовы в livewire, взглянув на документацию, доступную здесь https://laravel-livewire.com/docs/2.x/events#scoping-events

В вашем случае вы должны использовать self следующим образом

 <button wire:click="$emitSelf('childMethod')">
  

Ответ №3:

для передачи параметров (строки) в функции убедитесь, что вы используете одинарные '' кавычки , обратите внимание на двойные кавычки "" . Нравится :

 wire:click="activeTab('product')"