使用 Vue.js 中的 Composition API 扩展组件
2020-11-26
27645
借助选项 API,我们可以使用这些方法来扩展组件。假设我们有 2 个组件。
Component1.vue
<script>
export default {
methods: {
init(message) {
alert(message)
}
}
}
</script>
Component2.vue
<script>
import Component1 from './Component1'
export default {
extends: Component1,
methods: {
showAlert() {
// we can access Component1 'init()' method here
this.init('Hello World!')
}
},
mounted() {
this.showAlert()
}
}
</script>
现在,如何使其与组合 API 配合使用?我已检查
extends
属性在文档中仍然可用,但没有关于该属性的明确用法说明。
https://v3.vuejs.org/api/options-composition.html#extends
考虑以下带有组合 API 的代码。
Component1.vue
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
setup () {
const init = (message) => {
alert(message)
}
return {
init
}
}
})
</script>
Component2.vue
<script>
import { defineComponent, ref, onMounted } from 'vue'
import Component1 from './Component1.vue'
export default defineComponent({
extends: Component1,
setup () {
const showAlert = () => {
// How to access 'init()' method here?
}
onMounted(() => {
showAlert()
})
}
})
</script>
谢谢!
3个回答
Composition api 通过可组合函数强制代码可重用性,该函数可在多个组件中使用,因此创建一个名为
useInit.js
的文件,内容如下:
const useInit=()=>{
const init = (message) => {
alert(message)
}
return {
init
}
}
export default useInit;
然后将其导入每个组件,如下所示:
组件 1
<script>
import { defineComponent, ref } from 'vue'
import useInit from './useInit'
export default defineComponent({
setup () {
const {init} = useInit()
return {
init
}
}
})
</script>
组件 2
<script>
import { defineComponent, ref, onMounted } from 'vue'
import Component1 from './Component1.vue'
import useInit from './useInit'
export default defineComponent({
setup () {
const {init} = useInit()
const showAlert = () => {
init()
}
onMounted(() => {
showAlert()
})
}
})
</script>
Boussadjra Brahim
2020-11-26
虽然迟到了,但请检查一下:
https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md#global-api-mapping
export default defineComponent({ extends: defineComponent({ ... }) });
wobsoriano
2021-08-12
这真的非常简单,这是我的代码,效果很好:
BaseComponent.vue
import { defineComponent } from 'vue'
export default defineComponent({
methods: {
...
},
})
ChildComponent.vue
import { defineComponent } from 'vue'
import BaseComponent from '@/components/BaseComponent.vue'
export default defineComponent({
extends: BaseComponent,
...
})
rompish
2023-08-07