开发者问题收集

使用 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({ ... }) });

还有这个 https://github.com/pearofducks/mount-vue-component

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