Vue 3 Composition API - 重建部分的最佳方法

Vue 3 Composition API - Best approach for rebuild section

我有一个名为 CreateSales.vue 的文件,它是在 Layout.vue 中导入的。重要的是要知道此文件加载以下内容: <FormModal v-if="processingData" :processingData="processingData" @gateway="saveForm" />

当数据从 FormModal 返回时,将调用一个函数,通过 API 存储它。这一切都很好。

问题:API添加东西后,我想确保后台的table再次自动刷新。但是,在 CreateSales.vue 中没有直接的 link(如 parent/child)到 SalesTable.vue(生成 table 的地方)。所以我必须查询 SalesTable 中的函数才能再次获取 table。什么是最好的工作方式?

有几种方法可以解决它。

  • 全球商店
  • Provide/inject
  • 事件api
  • 为中间的每个组件添加 props 和 listeners

全球商店

我猜,最流行的解决方案是使用全局存储来处理这个问题,无论是以 Vuex 的形式还是自定义配对的向下存储

这是定制商店的样子

mystore.js

const {ref} from "vue";
export const STATES = {INIT:'INIT', LOADING:'LOADING', LOADED:'LOADED'};
export const loadState = ref(STATES.INIT);

现在您可以在两个单独的组件中使用 mystore.js

观察变化

import {loadState, STATES} from "mystore.js";
//...
watch{
  loadState(value){
    if(value === STATES.LOADED) {
      // do something when state changed to loaded
    }
  }
}

并做出改变

import {loadState, STATES} from "mystore.js";
// ... somewhere where the API is being processed
loadState.value = STATES.LOADING;
api
  .get(url)
  .then(result => {
    // ...
    loadState.value = STATES.LOADED;
  })

您也可以使用 Vuex,它会在复杂性和样板文件方面增加一点,但当您需要管理更大的商店时有助于更大的应用程序。

Provide/inject

与自定义存储类似,但不是将变量放在单独的文件中,以使其全局可用,您可以在父组件中定义 ref 将其添加到 provide 然后在后代使用 inject 来访问那里的反应变量。

provide-inject

事件API

EventBus 已在 v3 中删除,但您仍然可以使用第 3 方事件发射器,例如 mitt

https://v3.vuejs.org/guide/migration/events-api.html#_2-x-syntax

import mitt from 'mitt';
const app = createApp(App)
app.config.globalProperties.emitter = mitt();

// 组件 1 创建(){ this.emitter.on('apiLoaded', this.doStuff()) }

// 组件 2 api .get(url) .then(结果 => { // ... this.emitter.emit('apiLoaded') }) }

为中间的每个组件添加 props 和 listeners

其他选择已经够多了,没必要求助于这个