如何将数据从控制器 blade 发送到组件 livewire

How to send data from controller blade to component livewire

知道的人 LIVEWIRE-LARAVEL ‼我需要一些在 livewire 上工作的代码(表格更新) 我正在尝试传递数据(产品) :来自控制器(布局内容) 到 livewire 组件 (product-update)

但它不起作用,有时它无法识别“$products”,有时它发送的表单在 livewire 组件中不起作用

那么什么是好的做法呢?从 livewire 检索产品数据并使表单更新工作

提前致谢

调用 livewire 组件的控制器(由 KeyvanGholami 提出):

public function editProduit($idsscatg, $idprd){

    $ss_catg = SousCategorie::find($idsscatg);

    $idsscatgg = $idsscatg;
    $idprdd = $idprd;

    $nom_catg = $ss_catg->nom_catg;

    if( $ss_catg->nom_catg == 'Consommable médico-chirurgical')
    {
        $produit = ProduitConsommable::find($idprdd);
        
        return view('livewire.update-produit',compact('produit', 'idsscatgg', 'nom_catg'));

    }

我的组件 (update-produit) 为了测试提交, 但是表格没有提交!!!它重新加载并 return 使用 url:

中的令牌返回表单
@extends('Admin.layoutAdmin')
@section('content')
{{-- <livewire:update-produit :produits="$produits")> --}}
<div>
    <div class="container-fluid mb-5">
        <div class="row mb-4">
            <div class="col-lg-10">
                <h3> Modifier Produit </h3>
            </div>   
        </div>
        <div class="container">
            <form class="contact-form row" wire:submit.prevent="oui" enctype = "multipart/form-data">                       
                @csrf
                <input type="text" wire:model="oui">
                <div class="container-fluid d-flex align-items-center justify-content-center" >                         
                    <button wire:click="submit" type="submit" class="btn btn-primary">Enregistrer</button>

                </div>
            </form>

        </div>
    </div>
</div>

livewire 函数注入测试表单提交:

public function mount(){

        $cons = SousCategorie::where('nom_catg', 'Consommable médico-chirurgical')->get();
        $equips = SousCategorie::where('nom_catg', 'Equipements')->get();
        $mobs = SousCategorie::where('nom_catg', 'Mobilier médical')->get();
        $landangers = SousCategorie::where('nom_catg', 'Landanger')->get();
        $delacroixs = SousCategorie::where('nom_catg', 'Delacroix-chevalier')->get();
        $divs = SousCategorie::where('nom_catg', 'Divers')->get();

                 
        View::share('cons', $cons);
        View::share('equips', $equips);
        View::share('mobs', $mobs);
        View::share('landangers', $landangers);
        View::share('delacroixs', $delacroixs);
        View::share('divs', $divs);

    }
    public function render($produits)
    {
        return view('livewire.update-produit');   
    }


    public function oui(){

        $oui = $this->oui;
        dd($oui);

    }

请帮帮我!

您应该在控制器视图(blade 文件)中调用 LiveWire 组件并通过它传递数据(产品)。

我从不在使用 livewire 时接触 laravel 控制器,因为它有自己的 Class。如果您想检索产品数据,只需制作一个 livewire 组件并将其传递给视图即可。像这样的东西(抱歉太可怕了)

ProductIndex.php

...
protected $listeners = ['productUpdated'];

public function productUpdated() {
  // Just Blank
}

public function render() {
  return view('your-livewire-product-index', ['products' => Product::all());
}

Blade产品索引

<div>
  <ul>
     @foreach($products as $product) {
       <li>{{ $product->name }} | <a href="{{ route('products.edit', ['product' => $product->id]) }}">Edit</a></li>
     @endforeach
  </ul>
</div>

这是为了更新

ProductEdit.php

...
public $name, $product_id;
public Product $product;

public function mount() {
  $getProductID = explode('/', url()->current());
  $this->product_id = end($getProductID);
}

public function update() {
   // For simplicity i just update product name
   Product::find($this->product_id)->update(['name' => $this->name]);

   // I call event so ProductIndex listen it and it will auto update the productIndex list
   $this->emit('productUpdated');
}

public function render() {
   return view('livewire-edit-product', ['product' => Product::find($this->product_id)]);
}

Blade 产品编辑

<div>
  <form wire:submit.prevent="update">
    <input type="hidden" wire:model="product_id">
    <input type="text" wire:model="name">
    <input type="submit" value="save">
  </form>
</div>