1. 组合式api
代替选项式api, 作为组合式api的入口,拆散逻辑关注点,将同一个逻辑关注点的代码收集在一起
另外,还提供了逻辑复用计划,代替Vue2.x Mixin(命名抵触隐患,不同组件间配置化应用不够灵便)应用
import dataGet from './dataGet.js';import dataDelete from './dataDelete.js';import dataUpdate from './dataUpdate.js';export default { props: { id: String, }, // 组件创立之前执行,this实例无法访问 setup(props, context) { // 解构props, 获取对id的响应式援用 const { id } = toRefs(props); const { xxx } = dataGet(); const { xxx } = dataDelete(); const { xxx } = dataUpdate(); /* something others */ // 返回的内容会裸露给组件的其余部分包含模板 return { xxx }; // 或者返回一个渲染函数, 此时u须要应用expose裸露组件外部的办法/属性以供父组件拜访 context.expose({ property }); return () => h('div', 'test composite-api'); }}// SFC中应用组合式api的语法糖// 代码预编译为setup函数的内容<script setup>......// defineProps, defineEmits// 不反对渲染函数......</script>
setup中应用依赖注入
// 响应性绑定// 组合式apisetup() { const location = ref('North Pole') const geolocation = reactive({ longitude: 90, latitude: 135 }) provide('location', location) provide('geolocation', geolocation)}// 选项式api, 应用computedapp.component('todo-list', { provide() { return { todoLength: Vue.computed(() => this.todos.length) } }})app.component('todo-list-statistics', { inject: ['todoLength'],})// 2.x响应性绑定data() { return { test1: 'xxx', test2: { text: 'aaa', }, }}provide: { return { proData1: () => this.test1, // 形式1 proData2: this.test2, // 形式2 }},
2. Teleport
管制模板的渲染地位
常见应用场景:模态框、对话框
app.component('modal-button', { template: ` <button @click="modalOpen = true"> Open full screen modal! </button> // 将模态框内容渲染至body元素下 <teleport to="body"> <div v-if="modalOpen" class="modal"> <div> I'm a teleported modal! (My parent is "body") <button @click="modalOpen = false"> Close </button> </div> </div> </teleport> `, data() { return { modalOpen: false } }})
3. 片段
多根节点
// 2.x// 联合inheritAttrs: false绑定$attrs到非根元素<template> <div> <header>...</header> <main v-bind="$attrs">...</main> <footer>...</footer> </div></template><script>export default { inheritAttrs: false,}</script>// 3.x// 反对多根节点,显示绑定$attrs<template> <header>...</header> <main v-bind="$attrs">...</main> <footer>...</footer></template>
4. 状态驱动的动静css
// 应用v-bind<script setup>const theme = { color: 'red'}</script><template> <p>hello</p></template><style scoped>p { color: v-bind('theme.color');}</style>
5. emits组件选项
// 应用对象语法能够进行事件验证app.component('custom-form', { emits: { // 没有验证 click: null, // 验证 submit 事件 submit: ({ email, password }) => { if (email && password) { return true; // 失效 } else { console.warn('Invalid submit event payload!') return false } } }, methods: { submitForm(email, password) { this.$emit('submit', { email, password }) } }})