让我们继续探讨 Vue.js 的一些高级主题和最佳实践
31. 组件的 v-show 和 v-if 指令
v-show
和 v-if
都是用来根据条件渲染元素,但它们在性能上有所不同。v-show
是简单的 CSS 切换,而 v-if
会销毁和重建 DOM。
<!-- v-show -->
<div v-show="isVisible">可见时显示</div>
<!-- v-if -->
<div v-if="isCondition">条件满足时显示</div>
32. 列表渲染中的 key
在使用 v-for
渲染列表时,为每个元素提供一个唯一的 key
属性,这有助于 Vue 的虚拟 DOM 进行高效的 DOM 元素复用。
<ul>
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>
33. 组件的 slot-scope 属性
slot-scope
允许你为带有作用域插槽的组件定义一个模板。
<child-component>
<template slot-scope="slotProps">
<p>{{ slotProps.text }}</p>
</template>
</child-component>
34. 动态和条件性组件标签
你可以使用 v-if
和 v-for
指令来动态地渲染组件。
<component :is="componentName" v-for="(item, index) in items" :key="index"></component>
35. 自定义指令的钩子函数
自定义指令可以定义多个钩子函数,例如 bind
、inserted
、update
和 unbind
。
Vue.directive('my-directive', {
bind(el, binding) {
// 初始绑定时调用
},
inserted(el, binding) {
// 指令所在组件插入父组件后调用
},
update(el, binding) {
// 指令所在组件的 VNode 更新时调用
},
unbind(el, binding) {
// 指令所在组件卸载时调用
}
});
36. 使用 Fragments
Vue 支持 <template>
标签作为 Fragments,允许你将多个元素视为单个 DOM 节点。
<template v-if="ok">
<div>第一个元素</div>
<div>第二个元素</div>
</template>
37. XSS 预防
Vue 通过自动对所有 DOM 绑定进行 HTML 转义来预防 XSS 攻击。如果你需要渲染真实的 HTML,可以使用 v-html
指令,但要确保 HTML 是安全的。
<div v-html="safeHtml"></div>
38. Vue Devtools
Vue Devtools 是一个浏览器扩展,提供了对 Vue 应用的深入洞察,包括组件树、状态管理和事件跟踪。
39. Vuex Modules
在大型应用中,使用 Vuex Modules 可以帮助你组织和管理状态。
const moduleA = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
};
const store = new Vuex.Store({
modules: {
a: moduleA
}
});
40. Vuex Actions 的 Promises
Vuex Actions 可以返回 Promises,这使得你可以处理异步逻辑。
actions: {
asyncAction({ commit }) {
commit('gotData', await fetchData());
}
}
41. Vuex 持久化
使用 vuex-persistedstate
插件,你可以将 Vuex 的状态持久化到 localStorage 或 sessionStorage。
import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';
Vue.use(Vuex);
const store = new Vuex.Store({
plugins: [createPersistedState()]
});
42. Vue Router 导航守卫
Vue Router 提供了全局前置守卫、全局解析守卫、路由独享守卫和组件内守卫。
const router = new VueRouter({
routes: [...],
beforeEach: (to, from, next) => {
// 导航前的全局守卫
}
});
43. 服务端渲染(SSR)和客户端水合(Hydration)
服务端渲染可以提升首屏加载速度,而客户端水合是指在客户端接管 SSR 输出的 HTML,使其成为一个完全交互的应用程序。
// 在服务端
app.renderToString()
.then(html => {
// 发送 HTML 到客户端
});
// 在客户端
new Vue({
hydrate: true,
el: '#app'
});
44. TypeScript 支持
Vue 支持 TypeScript,允许你在项目中使用 TypeScript 来获得类型检查和自动补全。
import Vue from 'vue';
interface ComponentData {
count: number;
}
const Component = Vue.extend({
data(): ComponentData {
return {
count: 0
};
}
});
45. Vue.js 3 Composition API
Vue.js 3 引入了 Composition API,提供了更灵活的方式来组织组件逻辑。
import { ref, reactive, computed } from 'vue';
const count = ref(0);
const state = reactive({
count: 0
});
const doubleCount = computed(() => state.count * 2);
这些高级主题和最佳实践涵盖了 Vue.js 的许多方面,从组件通信、状态管理、路由、测试到服务端渲染等。