我有一个简单的Vue.js代码,当用户能够从BLE设备触发命令时。所以我创建了一个可组合的"useSession“,它连接到IoT设备、网关和服务器,并在每个服务器中将数据推送到存储区,主要是日志。回顾一般的结构,here's an example。
到目前为止,我使用自定义的useSession()可组合函数从主页组件的setup()
方法中创建并连接到设备,而useStore()
在可组合函数中工作得很好。
现在我的应用程序更复杂了,所以我添加了一个按钮来触发可组合方法。因此,当单击该按钮时,会话将创建所有3个连接(useSession().create()
)
结果是:
无法读取未定义的属性(读取“提交”)
查看这个问题,我发现了以下内容:https://forum.vuejs.org/t/is-it-possible-to-access-usestore-from-another-usexxx-composable/114230
--您应该能够从可组合的内部调用useStore,只要可组合本身是从安装程序中调用的。通常的规则是必须在安装程序的同步执行过程中调用它,而不是在异步回调中调用它。
为了缩小这个问题,我建议在调用useStore之前,在安装函数中调用useAuth,以确认它可以从那里访问商店。
因此,我很清楚为什么这不起作用,但不确定是否将存储传递给我连接到的每个实例是最佳实践。
发布于 2022-08-08 05:43:54
可组合性主要是在创建组件实例时使用的--直接在安装函数/块或相应的options (data
和beforeCreate
)中使用。任何其他用途都取决于它们的实现,需要进一步确认。
预计useStore
使用inject
通过组件层次结构传播存储值,这在安装过程中才被允许。
由于使用可合成的方法会导致问题,因此需要对其进行合理的说明。在全球商店中使用它只有几个原因。可组合允许延迟访问存储,这对于解决循环依赖关系很有用。provide
/inject
允许使用依赖注入,项目的组件可以从根组件获得不同的默认存储,这是一个角落情况,例如,对于多应用程序项目。
在任何其他情况下,Vuex/Pinia商店都可以直接从使用它的地方进口。这需要在一个单独的模块中定义它。
除了安装函数/块之外,还需要使用可组合的useSession
,这意味着它的设计或使用不正确。一般情况下,这个案件的处理方式如下:
<script setup>
...
const session = useSession() // calls useStore
const clickHandler = () => {
session.create()
}
</script>
https://stackoverflow.com/questions/73277487
复制相似问题