Я использую Livewire с абстрактным базовым компонентом (
Код: Выделить всё
AbstractRecipeListКод: Выделить всё
livewire.recipe-listДочерние компоненты:
[*]filteredRecipes.php
[*]savedRecipes.php
> /> < /ul>
Каждый из них возвращает различный базовый запрос в getbasequery (), но все они используют один и тот же вид лезвия. Навигация между страницами, такими как: < /p>
Код: Выделить всё
/users/profiles/1/liked
/users/profiles/1/saved
Код: Выделить всё
abstract class AbstractRecipeList extends Component
{
use WithPagination;
public string $sort = 'popularity';
public function render()
{
$recipes = $this->getRecipes();
$recipes = $recipes->paginate(2)->withQueryString();
return view('livewire.recipe-list', [
'recipes' => $recipes
]);
}
abstract protected function getBaseQuery(): Builder;
protected function getRecipes(){
$query = $this->getBaseQuery()
->with(...)
->withCount(...);
return $this->applySorting($query);
}
public function applySorting($query)
{
return match ($this->sort){
'popularity' => $query->orderByDesc('savedCount')
// other cases
};
}
}
< /code>
filteredRecipes.php:
class FilteredRecipes extends AbstractRecipeList
{
public function mount(RecipeFilterRequest $request): void
{
// mount
}
public function getBaseQuery(): Builder
{
// Filter logic using URL parameters
$query = Recipe::when(...) // filter logic here
return $query;
}
}
< /code>
savedrecipes.php:
class SavedRecipes extends AbstractRecipeList
{
public function getBaseQuery(): Builder
{
return auth()->user()->savedRecipes()->getQuery();
}
}
< /code>
likedrecipes.php:
class LikedRecipes extends AbstractRecipeList
{
public function getBaseQuery(): Builder
{
return auth()->user()->likedRecipes()->getQuery();
}
}
< /code>
И когда мне нужно называть эти дочерние компоненты, я использую: < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... -same-view
Мобильная версия