Skip to content

vue 3.3

导入复杂类型支持

  • 组件
vue
<script setup lang="ts">
  // type Props = {
  //   name: string;
  //   age: number;
  // };
  import { Props } from './type';

  // imported + intersection type
  defineProps<Props & { extraProp: string }>();
</script>
<script setup lang="ts">
  // type Props = {
  //   name: string;
  //   age: number;
  // };
  import { Props } from './type';

  // imported + intersection type
  defineProps<Props & { extraProp: string }>();
</script>
  • 使用
vue
<script lang="ts" setup>
  import ImportedAndComplexTypesSupport from './ImportedandComplexTypesSupport.vue';
</script>

<template>
  <ImportedAndComplexTypesSupport
    :age="18"
    name="哈哈哈"
    extra-prop=""
  ></ImportedAndComplexTypesSupport>
</template>
<script lang="ts" setup>
  import ImportedAndComplexTypesSupport from './ImportedandComplexTypesSupport.vue';
</script>

<template>
  <ImportedAndComplexTypesSupport
    :age="18"
    name="哈哈哈"
    extra-prop=""
  ></ImportedAndComplexTypesSupport>
</template>

DefineEmits

  • 组件
vue
<script setup lang="ts">
  const emits = defineEmits<{
    change: [num: number];
    update: [num: number, ...reset: any[]];
  }>();
</script>

<template>
  <a-button @click="emits('change', 666)">change</a-button>
  <a-button @click="emits('update', 666, 7777, '哈哈哈')">update</a-button>
</template>

<style scoped lang="less"></style>
<script setup lang="ts">
  const emits = defineEmits<{
    change: [num: number];
    update: [num: number, ...reset: any[]];
  }>();
</script>

<template>
  <a-button @click="emits('change', 666)">change</a-button>
  <a-button @click="emits('update', 666, 7777, '哈哈哈')">update</a-button>
</template>

<style scoped lang="less"></style>
  • 使用

Reactive Props

  • 开启自定义属性结构解析
js
// vite
defineConfig({
  // ...
  plugins: [
    vue({
      reactivityTransform: true,
    }),]
  // ...
})
// vitepress
export default defineConfig({
  // ...
  vue: {
    script: {
      propsDestructure: true,
    },
  },
  // ...
});
// vite
defineConfig({
  // ...
  plugins: [
    vue({
      reactivityTransform: true,
    }),]
  // ...
})
// vitepress
export default defineConfig({
  // ...
  vue: {
    script: {
      propsDestructure: true,
    },
  },
  // ...
});
  • 组件
vue
<script setup lang="ts">
  import { watchEffect } from 'vue';

  const { name, age } = defineProps<{
    name: number;
    age: number;
  }>();

  watchEffect(() => {
    console.log(name, age);
  });
</script>

<template>
  <div>{{ name }}</div>
  <div>{{ age }}</div>
</template>
<script setup lang="ts">
  import { watchEffect } from 'vue';

  const { name, age } = defineProps<{
    name: number;
    age: number;
  }>();

  watchEffect(() => {
    console.log(name, age);
  });
</script>

<template>
  <div>{{ name }}</div>
  <div>{{ age }}</div>
</template>
  • 使用

defineModel

  • config中开启defineModel
js
export default defineConfig({
  // ...
  vue: {
    script: {
      defineModel: true,
    },
  },
  // ...
});
export default defineConfig({
  // ...
  vue: {
    script: {
      defineModel: true,
    },
  },
  // ...
});
  • 定义子组件
vue
<script setup>
  const modelValue = defineModel();
</script>

<template>
  <input v-model="modelValue" />
</template>
<script setup>
  const modelValue = defineModel();
</script>

<template>
  <input v-model="modelValue" />
</template>
  • 使用组件

express test