Vue3 <script setup> 语法糖:功能特色与简洁API使用
admin
撰写于 2024年 05月 26 日

以下是关于<script setup>语法在Vue 3中的功能特色和简洁API使用的详细总结,附带案例参考和解释。


简介

<script setup> 是Vue 3.2引入的一种语法糖,它极大地简化了组件的书写方式,让代码更加简洁和易于维护。以下是<script setup>为Vue 3带来的主要功能特色和简洁API使用,帮助开发者更高效地构建Vue组件。

1. 直接导入组合API

<script setup>中,可以直接导入并使用Vue的组合API,如refreactivecomputedwatch等。这些API可以直接在模板中使用,而无需显式导出。

示例:

<script setup lang="ts">
import { ref, computed } from 'vue';

const count = ref(0);
const doubleCount = computed(() => count.value * 2);

const increment = () => {
  count.value++;
};
</script>

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

2. 自动导出到模板

<script setup>中声明的变量和函数会自动暴露给模板使用,无需显式返回或导出。

示例:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};
</script>

3. 使用definePropsdefineEmits

<script setup>中提供了definePropsdefineEmits用于处理组件的props和事件。这些API简化了组件属性和事件的定义和使用。

示例:

<template>
  <div>
    <p>{{ msg }}</p>
    <button @click="emitEvent">Emit Event</button>
  </div>
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';

const props = defineProps<{ msg: string }>();
const emit = defineEmits<{ (e: 'my-event', value: number): void }>();

const emitEvent = () => {
  emit('my-event', 42);
};
</script>

4. 生命周期钩子的直接使用

<script setup>语法中可以直接使用Vue组件的生命周期钩子,如onMountedonUpdatedonUnmounted等。

示例:

<script setup lang="ts">
import { ref, onMounted, onUpdated, onUnmounted } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};

onMounted(() => {
  console.log('Component is mounted');
});

onUpdated(() => {
  console.log('Component is updated');
});

onUnmounted(() => {
  console.log('Component is unmounted');
});
</script>

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

5. 组合API钩子的直接使用

除了生命周期钩子,组合API中的provideinject也可以直接在<script setup>中使用。

示例:

ProviderComponent.vue

<template>
  <slot />
</template>

<script setup lang="ts">
import { provide, ref } from 'vue';

const someValue = ref('Provided Value');
provide('myKey', someValue);
</script>

ConsumerComponent.vue

<template>
  <div>{{ injectedValue }}</div>
</template>

<script setup lang="ts">
import { inject } from 'vue';

const injectedValue = inject('myKey');
</script>

6. 使用模板引用(template refs)

可以使用ref绑定到DOM元素或组件实例,直接在<script setup>中操作DOM。

示例:

<template>
  <div>
    <input ref="inputRef" type="text" />
    <button @click="focusInput">Focus Input</button>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const inputRef = ref<HTMLInputElement | null>(null);

const focusInput = () => {
  inputRef.value?.focus();
};

onMounted(() => {
  inputRef.value?.focus();
});
</script>

7. 使用异步setup

<script setup>支持异步函数,可以在setup中直接使用await,方便处理异步数据加载。

示例:

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const data = ref(null);

onMounted(async () => {
  const response = await fetch('https://api.example.com/data');
  data.value = await response.json();
});
</script>

<template>
  <div>{{ data }}</div>
</template>

8. 更简洁的样式管理

可以使用<style scoped><style module>来确保样式仅作用于当前组件,并且可以直接在SFC中定义样式。

示例:

<template>
  <div>
    <button>Styled Button</button>
  </div>
</template>

<script setup>
</script>

<style scoped>
button {
  color: blue;
}
</style>

9. 插槽处理的简化

使用<script setup>时,处理插槽(slots)和作用域插槽(scoped slots)更加简洁。

示例:

<template>
  <div>
    <slot name="default" />
  </div>
</template>

<script setup>
</script>

总结

<script setup>语法为Vue 3引入了许多简洁且强大的功能,使得组件的书写和管理变得更加高效。通过直接导入和使用组合API、自动导出到模板、简化props和事件处理、方便的模板引用以及支持异步操作等特性,开发者可以更轻松地构建和维护Vue组件。

Vue3 <script setup> 语法糖:功能特色与简洁API使用

以下是关于<script setup>语法在Vue 3中的功能特色和简洁API使用的详细总结,附带案例参考和解释。


简介

<script setup> 是Vue 3.2引入的一种语法糖,它极大地简化了组件的书写方式,让代码更加简洁和易于维护。以下是<script setup>为Vue 3带来的主要功能特色和简洁API使用,帮助开发者更高效地构建Vue组件。

1. 直接导入组合API

<script setup>中,可以直接导入并使用Vue的组合API,如refreactivecomputedwatch等。这些API可以直接在模板中使用,而无需显式导出。

示例:

<script setup lang="ts">
import { ref, computed } from 'vue';

const count = ref(0);
const doubleCount = computed(() => count.value * 2);

const increment = () => {
  count.value++;
};
</script>

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

2. 自动导出到模板

<script setup>中声明的变量和函数会自动暴露给模板使用,无需显式返回或导出。

示例:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};
</script>

3. 使用definePropsdefineEmits

<script setup>中提供了definePropsdefineEmits用于处理组件的props和事件。这些API简化了组件属性和事件的定义和使用。

示例:

<template>
  <div>
    <p>{{ msg }}</p>
    <button @click="emitEvent">Emit Event</button>
  </div>
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';

const props = defineProps<{ msg: string }>();
const emit = defineEmits<{ (e: 'my-event', value: number): void }>();

const emitEvent = () => {
  emit('my-event', 42);
};
</script>

4. 生命周期钩子的直接使用

<script setup>语法中可以直接使用Vue组件的生命周期钩子,如onMountedonUpdatedonUnmounted等。

示例:

<script setup lang="ts">
import { ref, onMounted, onUpdated, onUnmounted } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};

onMounted(() => {
  console.log('Component is mounted');
});

onUpdated(() => {
  console.log('Component is updated');
});

onUnmounted(() => {
  console.log('Component is unmounted');
});
</script>

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

5. 组合API钩子的直接使用

除了生命周期钩子,组合API中的provideinject也可以直接在<script setup>中使用。

示例:

ProviderComponent.vue

<template>
  <slot />
</template>

<script setup lang="ts">
import { provide, ref } from 'vue';

const someValue = ref('Provided Value');
provide('myKey', someValue);
</script>

ConsumerComponent.vue

<template>
  <div>{{ injectedValue }}</div>
</template>

<script setup lang="ts">
import { inject } from 'vue';

const injectedValue = inject('myKey');
</script>

6. 使用模板引用(template refs)

可以使用ref绑定到DOM元素或组件实例,直接在<script setup>中操作DOM。

示例:

<template>
  <div>
    <input ref="inputRef" type="text" />
    <button @click="focusInput">Focus Input</button>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const inputRef = ref<HTMLInputElement | null>(null);

const focusInput = () => {
  inputRef.value?.focus();
};

onMounted(() => {
  inputRef.value?.focus();
});
</script>

7. 使用异步setup

<script setup>支持异步函数,可以在setup中直接使用await,方便处理异步数据加载。

示例:

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const data = ref(null);

onMounted(async () => {
  const response = await fetch('https://api.example.com/data');
  data.value = await response.json();
});
</script>

<template>
  <div>{{ data }}</div>
</template>

8. 更简洁的样式管理

可以使用<style scoped><style module>来确保样式仅作用于当前组件,并且可以直接在SFC中定义样式。

示例:

<template>
  <div>
    <button>Styled Button</button>
  </div>
</template>

<script setup>
</script>

<style scoped>
button {
  color: blue;
}
</style>

9. 插槽处理的简化

使用<script setup>时,处理插槽(slots)和作用域插槽(scoped slots)更加简洁。

示例:

<template>
  <div>
    <slot name="default" />
  </div>
</template>

<script setup>
</script>

总结

<script setup>语法为Vue 3引入了许多简洁且强大的功能,使得组件的书写和管理变得更加高效。通过直接导入和使用组合API、自动导出到模板、简化props和事件处理、方便的模板引用以及支持异步操作等特性,开发者可以更轻松地构建和维护Vue组件。

赞 (0)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论