vue.js - Vue 3 组合 API - ref 在 npm 包中不起作用
问题描述
我有这个非常简单的 Vue 3 组件。一切正常。value
每 0.5 秒更改一次(正在调用 console.log),并且浏览器中的值也每 0.5 秒更改一次。
<template>
<pre>value: {{ value }}</pre>
</template>
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
setup () {
const value = ref(false)
setInterval(() => {
value.value = !value.value
console.log('value changed to ', value.value)
}, 500)
return { value }
}
})
</script>
这是我的问题......如果我创建自己的 npm 包,假设@my/package
使用以下代码:
import { ref } from 'vue'
const value = ref(false)
setInterval(() => {
value.value = !value.value
console.log('value changed to ', value.value)
}, 500)
export { value }
然后我在我的 Vue 3 组件中使用我的包,如下所示:
<template>
<pre>value: {{ value }}</pre>
</template>
<script>
import { defineComponent } from 'vue'
import { value } from '@my/package'
export default defineComponent({
setup () {
return { value }
}
})
</script>
然后它不起作用。确切地说,每 0.5 秒console.log
记录一次不同的值(true
或false
),但我的浏览器仍然只呈现初始false
值。
控制台中没有错误。ref()
如果在我的 Vue 应用程序之外调用它,我的“反应性”似乎会以某种方式神奇地拒绝工作。
这也不适用于reactive()
Vuex。我想创建一个 npm 包,它将公开一些反应式引用(由 创建ref()
),而我的 Vue 应用程序将import
这些值。在这种情况下如何保持反应性?我在这里想念什么?
编辑:我刚刚发现如果我将ref
Vue 应用程序中的 传递给 npm 包函数,它确实可以正常工作。示例代码:
import { defineComponent, ref } from 'vue'
import { createValue } from '@my/package'
export default defineComponent({
setup () {
// Notice Im passing the ref to the createValue function
const value = createValue(ref)
return { value }
}
})
和我的@my/package
代码:
export function createValue (ref) {
const value = ref(false)
setInterval(() => {
value.value = !value.value
console.log('value changed to ', value.value)
}, 500)
return value
}
所以看起来ref
我的 Vue 应用程序和ref
我的包中的 不一样。但为什么?
编辑 2:我将我的保存ref
在 Vue 应用程序中window.ref1 = ref
,然后我将我保存ref
在 npm 包中,例如window.ref2 = ref
. 当我运行window.ref1 === window.ref2
它是错误的。所以我内部的 Vue 应用程序和我在 npm 包中的ref
不一样。ref
我使用以下代码导入两者:
import { ref } from 'vue'
解决方案
所以我找到了解决方案。问题是我@my/package
使用$ yarn link
命令链接了,所以我有两个vue
. 因此,当我在我的 Vue 应用程序中导入时,它与在 @my/packageref
中导入的函数不同。ref
这里最简单的解决方案可能只是简单地克隆 Vue 存储库并$ yarn link vue
在 Vue 应用程序和包中运行。
推荐阅读
- python - Keras 预测准确性与拟合结果不匹配
- c# - 一个模型、多个视图模型和使用 WPF 的可更新视图?
- c# - 我无法在 C# 中收到肥皂消息
- php - 休息API || 代码点火器 || 未定义授权
- python - 如何在 django 模板中单击按钮后填充表格?
- r - 带有 ranger 包的 fit_resamples 失败
- reactjs - 如何将数据从孩子传递给父母?当父类基于类而子类基于功能时
- bash - 如何定义字符串列表并替换子目录中文件中字符串的每个实例?
- javascript - Javascript:使用计算 SHA256 文件哈希
- sql - 如何使用循环连接数据列?