我的分数是DocumentView.vue.该组件具有DocumentListingView.Vue组件.DocumentListingView.vue有一个DocumentItem.view组分.在DocumentItem.view组件中,可以(通过API调用)删除相应的文档.删除后,我希望更新DocumentListingView.vue.这意味着子元素必须告诉家长,请通过激发新的API调用来更新您的DocumentListingView.我知道,使用$emit和Pinia store,您可以实现子元素与父母之间的通信.但我只是不知道它在建筑上应该是什么样子.

Problem:我正在try 用Pinia来实现它.不幸的是,我不知道最后一步,如何更新 list 中的数据.

Question:什么是理论上的概念?子元素应该更新ParentView的列表吗?

下面你可以看到我用来做这个的文件.他们被减少到基本的:DocumentView.vue(父母),DocumentListingView.vue(子元素),DocumentItem.view(孙子),FireData.js(皮尼亚)

DocumentView.vue

<script setup>
  import { ref, computed as compi, onMounted } from 'vue'
  import DocumentListing from './document/DocumentListingView.vue'
  import { useApiDataStore } from '@/stores/apiData';
  
  let list = {};
  const apiData = useApiDataStore(); // init stores for api call
  
  async function getDocumentList() {  
    await apiData.refreshDocumentList();
    list = await apiData.listData;
  }    
  
  getDocumentList();
</script>

<template>
  <div>
    <DocumentListing :documents="list"/>    
  </div>
</template>

DocumentListingView.vue

<template>
    <h2>Documents</h2>
    <div class="documentListing">        
        <div v-for="item in documents">
            <DocumentItem :data="item"></DocumentItem>        
        </div>        
    </div>
</template>

<script lang="ts" setup>
  import DocumentItem from '../../components/DocumentItem.view'

  defineProps({
    documents: Object,
  })

</script>

DocumentItem.view

<script setup>
    import { useApiDataStore } from '@/stores/apiData';

    defineProps({
        data: Object,
    });
    
    const apiData = useApiDataStore();
    const removeDocument = async (document) => {
      // api call to remove document
      apiData.refreshDocumentList();
    }
    
</script>

<template>
  <div>
  <button @click="removeDocument(data)">Delete Doument></button>
  </div>
</template>

FireData.js

import { defineStore } from 'pinia'

export const useApiDataStore = defineStore('apiData', {
    id: 'apiData',
    state: () => ({
        listData: {}
    }),
    actions: {
        async refreshDocumentList() {
            const endpoint = "http://localhost:8888/api.php?list";
            const response = await fetch(endpoint);
            const json = await response.json();          
            this.listData = json;
        }
    }
  })

推荐答案

当您在您的DocumentView.vue中使用状态属性apiData.listData而不是本地列表属性时,您可以解决这个问题.我对这些更改进行了 comments .

<script setup>
  import { ref, computed as compi, onMounted } from 'vue'
  import DocumentListing from './document/DocumentListingView.vue'
  import { useApiDataStore } from '@/stores/apiData';
  
  // let list = {}; //remove this line
  const apiData = useApiDataStore(); // init stores for api call
  
  async function getDocumentList() {  
    await apiData.refreshDocumentList();
    // list = await apiData.listData; // remove this line
  }    
  
  getDocumentList();
</script>

<template>
  <div>
    <DocumentListing :documents="apiData.listData"/>  <!--   replace list with  apiData.listData -->
  </div>
</template>

Vue.js相关问答推荐

Vue3组合-如何在组件卸载时注销回调

如何在 Nuxt3 中使用 nuxtjs/auth-next 模块?

如何在 vue2.7 中删除 slot-scope

有没有办法初始化一个保留初始 HTML 的 Vue 对象

webpack vue-loader 配置

aspnet core如何在deploy上构建webpack

我可以从手表调用方法并安装吗?

如何使用 Vue 命名插槽呈现静态内容列表?

更新 v-for 中使用的数组内的对象时,Vue js react性问题

如何使用 vuejs 从 SPA 访问 /storage -laravel- 中的图像

JavaScript/VueJS:判断数组是否包含具有特定值元素的对象

Javascript/vue.js 接收json

Nuxt.js - API 调用的最佳场所

使用props向组件添加类名

输入文件 Select 事件在 Select 同一文件时未触发

使用 Spring Boot(VueJS 和 Axios 前端)禁止发布 403 帖子

我应该将所有数据存储在 vuex 状态

Vue组件如何命名

如何访问通用 javascript 模块中的当前路由元字段

禁用外部主题文件产生的 Dart SASS 警告