Vue Ref从可组合返回后不再React

t5zmwmid  于 7个月前  发布在  Vue.js
关注(0)|答案(2)|浏览(82)

我正在使用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.观察一个或多个返回值的变化

tjvv9vkg

tjvv9vkg1#

好吧,我找到问题了。
问题在于我对合成的工作原理的误解。
在我的代码库中,我有一个组件,它使用我的composable来设置文件,另一个组件,我想使用composable来导入在第一个组件中设置的文件。由于composable的工作原理,这不起作用。
简而言之,问题是:

Composable Invocation的作用域:

当您在ComplexentOne.vue中调用useYourComposable(),并在ComplexentTwo.vue中调用useYourComposable()时,将创建组合的两个独立示例。每个示例都有自己的独立状态。对一个示例中状态的更改不会影响另一个示例中的相同状态。

解决方案:

为了在不同的组件之间共享状态,你必须使用一个状态管理解决方案,比如Pinia或Vuex(Pinia是Vue3的新标准)。

8qgya5xd

8qgya5xd2#

当前您正在userInput.value.materialerFiles中设置一个ref,而不是newMaterialerFiles ref的值。
尝试通过使用materialerFiles ref的值设置userInput.value来更新您的手表,如下所示:

// files
const { files, materialerFiles, plantegningFiles } = useFileUpload()

// Watch for changes to materialerFiles
watch(materialerFiles, (newMaterialerFiles) => {
  console.log('changed')
    userInput.value = {
        ...userInput.value,
        materialerFiles: newMaterialerFiles.value,
    };
});

字符串

相关问题