Vuex订阅和getter有什么区别?

What is the difference between Vuex subscribe and getter?

我有一个显示产品信息的 Product.vue 组件。每当路由中的 ProductID 随存储在 vuex 中的数据发生变化时,它就会更新。它是这样完成的:

setup() {
...
    // function to trigger loading product into vuex store state
        async function loadProduct() {
          try {
            await $store.dispatch('loadProduct', {ProductID: $route.params.ProductID})
          } catch (error) {
            console.log(error);
          }
        }
    
    // watch the route for changes to the ProductID param and run loadProduct() function above
      watch(() => $route.params.ProductID, async () => {
              if ($route.params.ProductID) {
                loadProduct();
              }
            },
            {
              deep: true,
              immediate: true
            }
        )
    // Get the product data using a getter
        const Product = computed(() => $store.getters.getProduct);
}

当我使用上面的代码并转到像 localhost:8080/product/123 这样的路线时,const Product 的值是空的,然后在一瞬间它就会有正确的产品数据。如果我然后转到另一条路线,如 localhost:8080/product/545const Product 的值将是更新为 545 之前的 123 的旧产品数据。这可能是预期的行为,但它会扰乱 SSR 应用程序,它将 return 向浏览器发送旧数据 HTML.

然后我遇到了解决问题的 vuex subscribe function。但我不明白为什么如何 它与computed getter 不同。这是代码所需的唯一更改:

setup() {
...
  const Product = ref();
  $store.subscribe((mutation, state) => {
  Product.value = state.productStore.product
  })
}

现在商店总是在页面呈现之前填充新产品数据,SSR 也获得正确的更新数据。为什么这 better/differently 对计算 属性 有效?

computed() 是 Vue 内部的,当在其内部调用的任何 ref 更新时更新。

subscribe() 是特定于 Vuex 的,只要调用 any 突变就会被调用。