【问题标题】:How to refactor/extract functionality from setup() into reusable function如何将 setup() 中的功能重构/提取为可重用函数
【发布时间】:2021-07-09 09:14:27
【问题描述】:

我想从现有的 Vue 3 组件中提取一个函数,成为一个可在多个组件中使用的可组合函数。

在我的 vue 组件中,我使用了一个函数,它将引用变量 reset 设置为 truefalse(通过点击触发)。

当前解决方案:

改变reset变量的函数在setup函数中。工作正常。

组件

// Vue3Component.vue
<script lang="ts">
import { ref, defineComponent } from "vue";
    export default defineComponent({

        setup() {
            const reset = ref(false);

          // Triggered by click
            function updatePaginatedPage(paginaValue: {
              resetState: boolean;
            }) {
                  // Sets reset to true or false
                  reset.value = paginaValue.resetState;
              }
            }
        }
    })
</script>

由于我需要在另一个 Vue 组件中使用该功能,因此我想将该功能放在挂钩文件中。

所需的解决方案:

将从文件导入的重置变量更改为设置函数的函数。我不知道,如何将值分配给一个变量(以及更多在 useUpdatePaginatedPage() 中的东西)以将新值分配给组件中的重置变量。

组件:

// Vue3Component.vue
<script lang="ts">
    import { ref, defineComponent } from "vue";
    import { useUpdatePaginatedPage } from "@/hooks/updatePaginatedPage";

    export default defineComponent({
        const reset = ref(false);

        // function from hook (below)
        useUpdatePaginatedPage({ resetState: false });

    })
</script>

挂钩/可组合函数

// updatePaginatedPage.ts
export const useUpdatePaginatedPage = function(paginaValue: {
    currentPage: number;
    resetState: boolean;
  }, reset: any) {
    reset.value = paginaValue.resetState;
}

我不知道如何处理。 即,如何从 updatePaginatedPage 重新分配 reset.value。 我可以将它作为参数传递,但那又如何呢? 我应该返回值并通过组件中的另一个函数分配它吗?

【问题讨论】:

  • 是的,我现在明白了。我希望它现在更具可读性和清晰性。

标签: javascript typescript variable-assignment vuejs3 vue-composition-api


【解决方案1】:

第一个我认为您当前的解决方案缺少return { reset, updatePaginatedPage }(以使这些值/函数在模板中可用)

如果你看一下setup()reset 变量是函数的局部变量。为了使其可重用,您需要再次使其成为某个函数的局部变量 - 比如说 usePagination - 每次从某个组件的 setup() 调用该函数时,新的本地变量 reset 和绑定到的 updatePaginatedPage将创建该变量...

从某种意义上说,您需要的重构只是将整个setup() 函数重命名为其他名称并将其存储在自己的文件中...

我们看一下代码:

// composables/usePagination.js
export usePagination(/* pass any params you want for desired behaviour */) {
  const reset = ref(false);

  function updatePaginatedPage(paginaValue: {
    resetState: boolean;
  }) {
    reset.value = paginaValue.resetState;
  }

  return { reset, updatePaginatedPage }
}

然后在某个组件中使用它...

setup() {
  const { reset, updatePaginatedPage } = usePagination(/* pass any params you want for desired behaviour */)

  // make it available to component's template
  return { reset, updatePaginatedPage }
}

【讨论】:

  • 嗨,Michal,首先感谢您更好地描述我的问题。该函数到目前为止没有返回任何内容。如果该功能在组件中,只需重新分配值以重置就可以很好地工作。问题是,在另一个时间我需要通过另一个功能重新分配“重置”。这就是为什么,我没有将重置放在“usePagination”中......什么是更好的方法,从不同的函数/文件更改共享变量。在我看来,使用 vuex 有点矫枉过正。
  • 我不确定我是否理解。因此,您不希望 reset 成为“每个组件”,而是以某种方式跨多个组件或整个应用程序的全局状态?
  • 没有。重置停留在这个组件中。只是重新分配发生在此组件/文件之外的功能中。可以从两个不同的功能(都在外部)更改复位值。
  • 抱歉,解释太模糊了。也许您可以将这两个函数都作为 usePagination 闭包的一部分?我不知道。无论如何,我在这里介绍的是我见过的大多数组合函数的结构化方式——将数据和功能打包在一起......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2021-12-28
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多