Laravel 8 Livewire 在其他方法中使用来自渲染的变量数据

Laravel 8 Livewire use variable data from render in other method

在我基于 livewire 的 Laravel 8 Jetstream 安装中,我有一个列出一些记录的组件。

这些记录可以在前端根据一些标准实时过滤并实时更新和分页。

还没有什么特别的,一切都按预期进行。

现在,我需要实现一个 export() 方法来导出过滤后的数据,我不知道如何或什至不确定是否可以从 render() 访问数据变量方法,以便我只能使用过滤后的数据进行导出。

Pages 分量

public $type;
public $color;

public function export() {
    $dataToExport = 'here I need the filtered data from $pages variables from render method so I can export them';
}

public function render() {
    $pages = Page::when($this->type, function($query) {
         $query->where('type', $this->type);
    })
    ->when($this->color, function($query) {
        $query->where('color', $this->color);
    })
    ...
    ->paginate();

    return view('livewire.page.index', [
        'pages' => $pages
    ]);
}

我正在使用 render() 方法通过查询数据库来准备数据,因为当我在前端更改某些内容时它会呈现和输出正确的数据。

基本上,一切正常,但在前端我有一个按钮会触发export方法,所以过滤后的数据必须可用于要导出的方法。

我也选择这种方法,因为我认为不在 public 属性 中公开数据更安全。也许我没有使用最好的方法,所以我愿意接受一个更好的解决方案,同时兼顾性能和安全性。

顺便说一句:在 render() 方法中使用变量或使用属性有什么区别(就安全性 and/or 性能而言)?

在渲染器或 public 属性 上使用数据在性能或安全性方面没有显着差异,这两种方法都会将数据公开给 javascript.如果您要处理敏感数据,我不建议您使用 Livewire。

根据您的代码,我认为您可以使用函数获得相同的查询:

public $type;
public $color;

public function export() {
    $dataToExport = $this->pages()->someWayOfExportTheFilteredData();
}

public function render() {
    return view('livewire.page.index', [
        'pages' => $this->pages()->paginate()
    ]);
}

protected function pages()
{
    return Page::when($this->type, function($query) {
         $query->where('type', $this->type);
    })
    ->when($this->color, function($query) {
        $query->where('color', $this->color);
    })
    ...
}