【发布时间】:2021-06-24 10:23:51
【问题描述】:
我有这个非常简单的 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>
然后它不起作用。确切地说,console.log 每 0.5 秒记录一次不同的值(true 或 false),但我的浏览器仍然只呈现初始的 false 值。
控制台没有错误。如果在我的 Vue 应用程序之外调用 ref(),我的“反应性”似乎会以某种方式神奇地拒绝工作。
这也不适用于reactive() 和 Vuex。我想创建一个 npm 包,它将公开一些反应性引用(由 ref() 创建),而我的 Vue 应用程序将 import 这些值。在这种情况下如何保持反应性?我在这里错过了什么?
编辑:我刚刚发现,如果我将 Vue 应用程序中的 ref 传递给 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
}
所以看起来我的 Vue 应用程序中的 ref 和我的包中的 ref 不一样。但为什么呢?
编辑 2:我将 ref 保存在 Vue 应用程序中,例如 window.ref1 = ref,然后我将 ref 保存在 npm 包中,例如 window.ref2 = ref。当我运行window.ref1 === window.ref2 时,它是错误的。所以我在 Vue 应用程序中的 ref 与我在 npm 包中的 ref 不同。我使用以下代码导入两者:
import { ref } from 'vue'
【问题讨论】:
标签: vue.js vuejs3 ref vue-composition-api vue-reactivity