问题描述
我一直在四处寻找(但我找不到)以下问题的答案。
在 Vue 2.x 中,您可以将 mixins 用于生命周期挂钩,例如:我可以使用
创建一个 Mixins.jsexport default {
created() {
console.log('test');
}
}
然后,在一个组件中,执行以下操作:
import mixins from "../misc/mixins";
export default {
name: "My component",mixins: [mixins],created() {
console.log('Another test');
}
}
如果我运行“我的组件”,我会在控制台中同时获得“另一个测试”和“测试”。我找不到使用 Composition API 执行类似操作的方法(当然,我可以在“onMounted”内执行从另一个文件导入的函数,但这不是那么优雅)。
有办法吗?
谢谢!
解决方法
使用 Composition API,您必须导入所需的生命周期。包含列表的文档:https://v3.vuejs.org/guide/composition-api-lifecycle-hooks.html
Component.vue
<script>
import { onMounted } from 'vue'
export default {
setup(props) {
console.log('CREATED')
onMounted(() => {
console.log('MOUNTED')
});
return {};
},}
</script>
请注意,没有 onCreated()
。来自文档:
因为 setup 是围绕 beforeCreate 和 created 生命周期钩子运行的,所以您不需要显式定义它们。换句话说,在这些钩子中编写的任何代码都应该直接在 setup 函数中编写。
但是如何使用它作为 Mixin 的替代方案?
现在,如果您愿意,您可以简单地将其提取到单独的文件中,通常称为可组合文件。
demoLifehooks.js
import { onMounted } from 'vue'
export default () => {
console.log('Created')
onMounted(() => {
console.log('Mounted')
})
}
现在只需导入并执行即可。
Component.vue
<script>
import useDemoLifecycles from './demoLifecycles.js'
export default {
setup(props) {
useDemoLifecycles()
return {};
},}
</script>
甚至更短,感谢 new script setup syntax.
<script setup>
import useDemoLifecycles from './demoLifecycles.js'
useDemoLifecycles()
</script>
登录控制台:
创建
已安装
将其命名为 useSomething
只是惯例。通过导出不是默认函数而是命名函数来强制它不是一个坏主意:
export const useDemoLifecycles = () => { console.log('code here') }
然后
import { useDemoLifecycles } from './demoLifecycles'
此外,如果您想从该文件中获取 refs 或其他数据,它将是
const { a,b } = useDemoLifecycles()
请注意,实际上在我的示例中,并没有像 Mixins 那样具有太多 Vue 的“魔力”。这几乎是纯 JS 的东西,而不是 Vue 特定的代码。所以它实际上比旧的 Options API + Mixins 更简单。