livewire 的 @script 和 @endscript 指令无效?

目前的环境是 php 8.2.12 + laravel 10.31.0 + livewire v3.1.0

我在 livewire 页面组件的 blade 模板中使用了 @script @endscript 指令,按照手册上的说法应该用来包裹 <script> 标签。

@script @endscript 指令被输出到页面,且无法在 javascript 脚本中获取到 $wire 对象,代码如下:

@script
<script>
document.addEventListener('livewire:initialized', () => {
// 下面这行报错:Uncaught ReferenceError: $wire is not defined
  const flow = new Flow(new go.Diagram("diagram"), $wire);
  const flowData = {{ Js::from($flow) }};
  flow.setUpData(flowData);
})
</script>
@endscript

对照手册 livewire.laravel.com/docs/javascri... 应该可以从 javascript 脚本中访问到 $wire 对象,且不应该将@script @endscript 指令输出到页面。

请大家帮我看看是哪里出了问题?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
sanders

借这个帖子也写一些踩上的坑,目前发现了个新问题:

click: (e, obj) => {
  let argument = obj.part.data;
  Livewire.dispatch('show-argument-form', argument);
},
    #[On('show-argument-form')]
    public function onShowArgumentForm($argumentData): void
    {
        info('show-editor-argument', $argumentData);
        $this->currentForm = 'flow-editor-argument';
    }

这样虽然可以响应事件,但会报错 Unable to resolve dependency [Parameter #0 [ <required> $argumentData ]] 貌似被当成注入参数了,错误在于事件数据必须是对象,且属性必须与参数名吻合,其余的都会被当做注入参数。所以可将JavaScript代码改为:

click: (e, obj) => {
  let argumentData = obj.part.data;
  Livewire.dispatch('show-argument-form', {argumentData});
},
5个月前 评论
sanders

现在碰到的问题是,在模板中使用了动态加载的组件 <livewire:is :component=”$currentForm” /> 但能看到返回数据已经修改,但对应的组件却未被加载。对应手册这里:livewire.laravel.com/docs/nesting#...

咋感觉一步一个坎。 :sweat_smile: 是有什么更好的调试方法吗?还是我对这个库的理解有问题?大家有什么建议吗?

5个月前 评论

没用过livewire,但是看文档这个事件应该定义在外部的 js 代码中,不是在 @script 里用的,事件发生的时候 $wire 还没被声明,所以事件回调获取不到

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!