在 Vue.js 中使用组合 API 扩展组件

Ter*_*esa 14 vue.js vuejs3 vue-composition-api

通过选项 API,我们可以使用这些方式来扩展组件。假设我们有 2 个组件。

组件1.vue

<script>
export default {
  methods: {
    init(message) {
      alert(message)
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

现在,如何让它与组合 API 一起工作?我已经检查过该extends属性在文档中仍然可用,但没有明确的使用说明。

https://v3.vuejs.org/api/options-composition.html#extends

考虑以下带有组合 API 的代码。

组件1.vue

<script>
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup () {
    const init = (message) => {
      alert(message)
    }
    
    return {
      init
    }
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

谢谢你!

Bou*_*him 4

组合 api 通过可组合函数强制代码可重用性,该函数可以跨多个组件使用,因此创建一个名为useInit.js以下内​​容的文件:

const useInit=()=>{
     const init = (message) => {
      alert(message)
    }
    
    return {
      init
    }
}

export default useInit;
Run Code Online (Sandbox Code Playgroud)

然后将其导入每个组件中,例如:

组件1

<script>
import { defineComponent, ref } from 'vue'
import useInit from './useInit'
export default defineComponent({
  setup () {
    const {init} = useInit()
    
    return {
      init
    }
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)

组件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>
Run Code Online (Sandbox Code Playgroud)

  • 您好,感谢您的帮助。我认为这可能是实现这一目标的好方法。然而,我仍然很好奇如何使用“extends”属性来实现这一点。为什么它仍然在文档中以及如何将其与组合 API 一起使用?请检查此文档链接:https://v3.vuejs.org/api/options-composition.html#extends (3认同)
  • 是的,“extends”仅用于选项 api 以使组件可重用,对于组合 api,有一种不同的方法,即使用可在不同组件中使用的可组合函数。 (3认同)