未捕获的类型错误:无法读取未定义的属性 'get' [this.$inertia.get('/idea_details', );在 Vue 组件的 mount()]

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性 \'get\' [this.$inertia.get(\'/idea_details\', );在 Vue 组件的 mount()]【英文标题】:Uncaught TypeError: Cannot read property 'get' of undefined [this.$inertia.get('/idea_details', ); within Vue component's mounted()]未捕获的类型错误:无法读取未定义的属性 'get' [this.$inertia.get('/idea_details', );在 Vue 组件的 mount()] 【发布时间】:2021-07-18 21:50:13 【问题描述】:

我正在尝试使用 laravel/vue 的惯性,并尝试使用以下代码导航到新页面/url:

this.$inertia.get('/idea_details', ); 

出现以下错误:

Uncaught TypeError: Cannot read property 'get' of undefined

大概这意味着它(页面?)不知道“$inertia”是什么——或者不在乎,它不存在。

我在“Dashboard.vue”组件/页面中进行此调用,下面的代码几乎完整:

 41         </div>
 42     </breeze-authenticated-layout>
 43 </template>
 44 
 45 
 46 <script>
 47     import BreezeAuthenticatedLayout from '@/Layouts/Authenticated'
 48 
 49     export default 
 50         components: 
 51             BreezeAuthenticatedLayout,
 52         ,
 53         mounted()
 54             console.log('test from the Dashboard.vue component...');
 55             $(document).ready( function () 
 56                 var table = $('#myTable').DataTable();
 57 
 58                 $('#myTable tbody').on('click', 'tr', function () 
 59                     var data = table.row( this ).data();
 60                     alert( 'You clicked on '+data[0]+'\'s row' );
 61 
 62                     // Uncaught TypeError: Cannot read property 'get' of undefined
 63                     this.$inertia.get('/idea_details', ); 
 64 
 65                  );
 66             );
 67         
 68     
 69 
 70 </script>

我做错了什么?

我是整个堆栈的相对新手,包括 Web 组件和 npm 等,所以很可能我错过了一些非常基本的东西。

这是使用他们的“初学者工具包”之一的 Laravel 8 —— Breeze 和 Intertiajs:

https://laravel.com/docs/8.x/starter-kits#laravel-breeze-installation

谢谢!

...补充一点,Chrome 的 Vue 测试版扩展似乎认为它看到/了解 Inertia,正如您在此屏幕截图中看到的那样:

...得到了这个工作的一部分。似乎至少有两个部分我遗漏或做错了:

    import 然后声明我要访问的对象(惯性) 下面的代码 sn-p 的第 51 和 57 行。 仅在标签内“export default”的“methods”声明部分中使用——与“mounted”部分相反——我还没有弄清楚。

49 <script>
50     import BreezeAuthenticatedLayout from '@/Layouts/Authenticated'
51     import Inertia from '@inertiajs/inertia'
52 
53 
54     export default 
55         components: 
56             BreezeAuthenticatedLayout,
57             Inertia
58         ,
59         methods: 
60             hi()
61                 // corresponds to 'Route::get('/idea', ...' 
62                 //   in routes/web.php. ie don't use a '/' here
62                 this.$inertia.visit('idea',);

...建议的解决方案是这样的(我想),但它是错误的,或者至少是不正确的:

 58                 $('#myTable tbody').on('click', 'tr', function () 
 59                     var data = table.row( this ).data();
 60                     alert( 'You clicked on '+data[0]+'\'s row' );
 61 
 62                     // Uncaught TypeError: Cannot read property 'get' of undefined
 63                     this.$inertia.get('/idea_details', ); 
 64 
 65                 .bind(this)); // create closure?

这里的“表”是一个 DataTables.net 表。 “数据”是表列的数组,在我的例子中是 3 个:“id”、“代号”、“标语”。现在,无论您单击数据表的哪一行,您都将始终获得该表的第一行/顶行。

【问题讨论】:

【参考方案1】:

答案是找到一种方法来获得适当的范围,它似乎在这里得到了回答:

https://***.com/a/54072713/1965936

...好吧,发现绑定“this”可能是答案的一部分,或者至少暗示了答案,但还不确定如何实际解决这个问题。

...好吧,这可能是一个实际的答案:

187   $( "#myTable tbody" ).on( "click", "tr", thisArg: this, function(event) 
188       let data = myDataTable.row(this).data();
189       console.log(event.data.thisArg); // 'Proxy route:...'
190       event.data.thisArg.modal_title=data.codename;
191       event.data.thisArg.modal_body=data.tagline;
192       event.data.thisArg.showModal=true;
193       event.data.thisArg.hello(); // call your 'hello()' method
194   );

这里的关键是第 188 行的 this 与之前在第 187 行(作为参数)指定的 this 不同。

在这种情况下,破解/修复是使用jQuery '.on()' event handler function 的第三个参数将原始this(组件)作为变量传递——此处指定为“thisArg”。

您还必须将“事件”参数显式命名为“处理程序”函数——这是链接上的官方函数签名:

.on( events [, selector ] [, data ], handler )

data 参数只是一个带有键/值对的对象——无论你想要它/它们是什么。

然后要访问该数据,我在 data 参数中指定键:

event.data.thisArg

thisArg 是我要操作、调用方法等的组件。

当我运行console.log(thisArg) 时,我看到了这个:

Proxy route: ƒ, confirm: ƒ, close: ƒ, cancel: ƒ, …

这大概是我的组件的字符串化版本,confirmclosecancel 是我在组件中列出的前三个 methods()

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性 'get' [this.$inertia.get('/idea_details', );在 Vue 组件的 mount()]的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:无法读取未定义的属性 'get' [this.$inertia.get('/idea_details', );在 Vue 组件的 mount()]

未捕获的类型错误:无法读取未定义的属性“获取”

在与 API 调用关联的函数中:未捕获(承诺中)类型错误:无法读取未定义的属性“包含”

未捕获的类型错误:无法读取未定义的属性“区域”?

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`

未捕获的类型错误:无法读取未定义的属性 toLowerCase