我正在使用Vue 3脚本设置语法糖使用Nuxt 3组合API。
我有一个问题,当我的组合对象的引用返回到组件时,它不会响应。观察值没有任何影响。
请注意,我正在使用VueUse创建filedialog的不同示例(useFileDialog)。
import { useFileDialog } from '@vueuse/core'
import { ref as storageRef, getStorage, listAll, getDownloadURL, deleteObject } from 'firebase/storage'
import { useStorageFile } from 'vuefire'
import { ref, computed, watch } from 'vue'
export const useFileUpload = (props) => {
const storage = getStorage();
const filename = ref();
const fileRef = ref(null);
const selectedImages = ref([]);
const images = ref({});
const imagePreviews = computed(() => {
if (images.value) {
return Array.from(images.value).map(file => URL.createObjectURL(file));
}
return [];
})
const {
url,
uploadTask,
upload,
} = useStorageFile(fileRef)
const { files, open } = useFileDialog()
const { open: openMaterialer, files: materialerFiles } = useFileDialog();
const { open: openPlantegning, files: plantegningFiles } = useFileDialog();
watch(files, (newFiles) => {
if (newFiles.length > 0) {
const fileType = newFiles[0].type.split('/')[0]
if (fileType === 'image') {
images.value = newFiles
}
else return
}
})
const uploadFile = async () => {
// Some upload logic here
}
watchEffect(() => {
// Confirms reactivity in composable
console.log('materialerFiles in upload:', materialerFiles.value);
});
return {
imagePreviews,
files,
materialerFiles,
plantegningFiles,
uploadTask,
open,
openMaterialer,
openPlantegning,
uploadFile,
};
};
字符串
现在,在我的组件中,我使用了可组合(记住,可组合是自动导入的)
// files
const { files, materialerFiles, plantegningFiles } = useFileUpload()
// Watch for changes to materialerFiles
watch(materialerFiles, (newMaterialerFiles) => {
console.log('changed')
userInput.value = {
...userInput.value,
materialerFiles: newMaterialerFiles,
};
});
型
这应该从组件将'changed'记录到控制台。但什么也没发生。
我是否误解了什么,或者这是一个已知的问题。有什么解决方法或建议吗?
我希望记录应该包含的文件。
复制步骤:
1.在“composable”目录中创建一个composable
1.从vue导入useFileDialog使用和ref,watch,从vue计算
1.在可组合文件中创建文件对话框的3个示例
1.从可组合对象返回React性文件值
1.在组件中解构可组合的const {返回值在这里} = useYourComposable()
1.观察一个或多个返回值的变化
2条答案
按热度按时间tjvv9vkg1#
好吧,我找到问题了。
问题在于我对合成的工作原理的误解。
在我的代码库中,我有一个组件,它使用我的composable来设置文件,另一个组件,我想使用composable来导入在第一个组件中设置的文件。由于composable的工作原理,这不起作用。
简而言之,问题是:
Composable Invocation的作用域:
当您在ComplexentOne.vue中调用useYourComposable(),并在ComplexentTwo.vue中调用useYourComposable()时,将创建组合的两个独立示例。每个示例都有自己的独立状态。对一个示例中状态的更改不会影响另一个示例中的相同状态。
解决方案:
为了在不同的组件之间共享状态,你必须使用一个状态管理解决方案,比如Pinia或Vuex(Pinia是Vue3的新标准)。
8qgya5xd2#
当前您正在userInput.value.materialerFiles中设置一个ref,而不是newMaterialerFiles ref的值。
尝试通过使用materialerFiles ref的值设置userInput.value来更新您的手表,如下所示:
字符串