Как передать «id» на компонент livewire другому компоненту livewire?

Я пытаюсь выполнить CRUD с помощью livewire, и у меня возникают некоторые проблемы.

Здесь вы можете увидеть мой основной компонент контроллера.

class Topics extends Component
{

    public function index()
    {
       $topics = Topic::all();

        return view('topics.index', ['topics'=>$topics]);
    }

    public function create()
    {
        return view('topics.create');

    }  /* The store function is in a single component as I say after */

    public function show(Topic $topic)
    {

        return view('topics.show', compact('topic'));
    }
    
    public function edit(Topic $topic)
    {
       return view('topics.edit', compact('topic'));
    }
  
    public function destroy(Topic $topic)
    {
        //
    }

    public function render()
    {
        return view('livewire.topics');
    }
}

В начале я бы попробовал перегруппировать все функции CRUD в один файл livewire. Но у меня не было возможности использовать функцию магазина. Мне нужно было создать компонент только для хранения. Может быть, у вас есть решение и для этого? Но это не моя главная проблема здесь.

В качестве функции сохранения функция обновления не работает, поэтому я создал компонент с именем «редактировать».

Вот в чем проблема.

Я могу :

  • посмотреть все мои темы в моем (topics.index)
  • посмотрите мою форму создания в моем компоненте livewire с именем «магазин», включите представление (topics.create) и создайте тему
  • видеть только одну тему с включенной функцией показа (topics.show)
  • нажмите на мою кнопку «редактировать» и увидите мою страницу «редактировать» в (topics.edit), но когда я включаю свой компонент livewire с именем «редактировать», который содержит мою форму обновления, я не могу, например, сделать это: «$ тема- >название"

Я не могу передать этому компоненту информацию о теме, на которую я нажал.

Переменная $topic не имеет знака.

Как, по-вашему, я могу передать этому компоненту информацию темы, которую я хочу отредактировать?

Я поместил здесь остальную часть моего фактического представления и контроллера.

Компонент магазина:

class Store extends Component
{
    protected $rules = [

        'title' => 'required',

        'content' => 'required',    
    ];

    public $title;
    public $content;
    public $user_id;

    public function store()
    {
        $this->user_id = auth()->user()->id;

        $this->validate();
        
       $topic = Topic::create([

            'title' => $this->title,
            'content' => $this->content,
            'user_id' => $this->user_id,

        ]);
    
       return redirect()->route('topics.show', $topic->id);
      
    }
  
    public function render()
    {
        return view('livewire.test');
    }
}

Компонент контроллера редактирования:

class Edit extends Topics
{
    public function render()
    {
       
        return view('topics.edit');
    }
}

Как видите, я попытался расширить контроллер Topics для передачи $topic... но это, конечно, не сработало.

Я попытался:

<div>
 <livewire:edit :topic = "$topic">
</div>

И еще кое-что.

Спасибо за помощь мне

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно определить функцию монтирования в вашем Livewire:

class Store extends Component
{
    protected $rules = [ ...  ];
    
    public $topic = NULL;
    public function mount($topic) {
       $this->topic = $topic 
    }

В компонентах Livewire вы используете mount() вместо конструктора класса __construct(), к которому вы, возможно, привыкли. NB: mount() вызывается только при первом монтировании компонента и не будет вызываться снова, даже когда компонент обновляется или перерисовывается.

Кроме того, в вашем случае, если вы разделяете модель View таким образом, вы могли бы также подумать о том, чтобы Livewire инициировался отдельно. поэтому в Store также добавьте $listener, а затем используйте javascript для загрузки Livewire... но это совсем другой вопрос и другой ответ.

Спасибо за ваш ответ. Для слушателя, пока мне это не нужно, но я держу это в уме. Еще раз спасибо :)

Karl 01.12.2022 21:42

Другие вопросы по теме