# 组合式 API(Composition API)

目前 uni-app(Vue2) 基于 Vue 2.6,组合式 API 由 @vue/composition-api 支持,script setup 由 unplugin-vue2-script-setup 支持。

# 环境准备

升级 uni-app 编译器到 3.6.8+

# 使用组合式API

  1. 在 main.js/ts 文件内增加安装 @vue/composition-api 插件。如果使用 nvue 页面,也需要在每个 nvue 页面安装,且每个 nvue 页面之间插件状态默认不会共享。

main.js

composition-api.js

pages/index/index.nvue

import './composition-api'
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

const app = new (typeof App === 'function' ? App : Vue.extend(Object.assign({ mpType: 'app' }, App)))
app.$mount()
  1. 从 @vue/composition-api 包内导入并使用基础的组合式API,具体的兼容性仍需参考:@vue/composition-api。从 @dcloudio/uni-app 包内导入 uni-app 应用生命周期页面的生命周期
import { defineComponent, ref } from '@vue/composition-api'
import { onReady } from '@dcloudio/uni-app'
export default defineComponent({
  setup(_, { expose }) {
    const title = ref('Hello')
    onReady(() => {
      console.log('onReady')
    })
    // @vue/composition-api 当前版本并无 expose 方法
    if (expose) {
      expose({
        title
      }) 
    }
    return {
      title
    }
  }
})

# 使用 Script Setup

  1. 使用 npm/yarn 安装 unplugin-vue2-script-setup 插件,此插件暂不支持 nvue 页面。
npm install unplugin-vue2-script-setup -D
# or
yarn add unplugin-vue2-script-setup -D
  1. 在 vue.config.js 配置 ScriptSetup 插件,以下为基础配置,其他具体配置请参考 unplugin-vue2-script-setup
const ScriptSetup = require('unplugin-vue2-script-setup/webpack').default
module.exports = {
  parallel: false,
  configureWebpack: {
    plugins: [
      ScriptSetup({ /* options */ }),
    ],
  },
  chainWebpack (config) {
    // disable type check and let `vue-tsc` handles it
    config.plugins.delete('fork-ts-checker')
  },
}
  1. 改用 Script Setup 写法导入 API
<script setup>
import { ref } from '@vue/composition-api'
import { onReady } from '@dcloudio/uni-app'
const title = ref('Hello')
onReady(() => {
  console.log('onReady')
})
defineExpose({
  // 注意要在 defineExpose 函数外定义
  title
})
</script>

# 与 TypesSript 一起使用

  • 与 Script Setup 一同使用时会禁用默认的类型检查,具体请参考 unplugin-vue2-script-setup
  • 即使不与 Script Setup 一同使用但项目为 HBuilderX 创建的工程时,由于 HBuilderX 内置TypesSript插件当前版本较低,也需要禁用默认的类型检查
  // vue.config.js
  module.exports = {
    chainWebpack (config) {
      // disable type check and let `vue-tsc` handles it
      config.plugins.delete('fork-ts-checker')
    },
  }