definePage

使用 definePage 宏定义页面

definePage 宏,用于动态生成 pages.json

definePage 全局类型声明

将类型添加到 tsconfig.json 中的 compilerOptions.types

tsconfig.json
{
  "compilerOptions": {
    "types": ["@uni-helper/vite-plugin-uni-pages"]
  }
}

使用

vue SFC 文件内 definePage 宏使用方式

更多使用方式请参考 playground/pages/define-page

定义页面

对象形式

pages/index.vue
<script setup lang="ts">
definePage({
  style: {
    navigationBarTitleText: 'hello world',
  },
  middlewares: [
    'auth',
  ],
});
</script>

函数形式

pages/index.vue
<script setup lang="ts">
import type { HelloWorld } from './utils';

definePage(() => {
  const words: HelloWorld = {
    hello: 'hello',
    world: 'world',
  };

  return {
    style: {
      navigationBarTitleText: [words.hello, words.world].join(' '),
    },
    middlewares: [
      'auth',
    ],
  };
});
</script>

嵌套函数

pages/index.vue
<script setup lang="ts">
definePage(() => {
  function getTitle(): string {
    const hello = 'hello';
    const world = 'world';

    return [hello, world].join(' ');
  }

  return {
    style: {
      navigationBarTitleText: getTitle(),
    },
    middlewares: [
      'auth',
    ],
  };
});
</script>

异步数据获取

pages/index.vue
<script setup lang="ts">
definePage(async () => {
  function fetchTitle(): Promise<string> {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve('hello world from async');
      }, 100);
    });
  }

  const title = await fetchTitle();

  return {
    style: {
      navigationBarTitleText: title,
    },
    middlewares: [
      'auth',
    ],
  };
});
</script>

引入外部函数、变量

pages/index.vue
<script setup lang="ts">
import { parse as parseYML } from 'yaml';

definePage(() => {
  const yml = `
style:
  navigationBarTitleText: "yaml test"
`;
  return parseYML(yml);
});
</script>

条件编译

npm
pnpm
bun
yarn
npm i @uni-helper/uni-env
pages/index.vue
<script setup lang="ts">
import { isH5 } from '@uni-helper/uni-env';

definePage(() => {
  const title = isH5 ? 'H5 环境' : '非 H5 环境';

  return {
    style: {
      navigationBarTitleText: title,
    },
    middlewares: [
      'auth',
    ],
  };
});
</script>

选项式 API

pages/index.vue
<script>
definePage({
  style: {
    navigationBarTitleText: 'Option API 内使用 definePage',
  },
  middlewares: [
    'auth',
  ],
})

export default {
  data() {
    return {
      count: 0
    }
  }
}
</script>