import { shallowReactive } from"vue";
// 使用 shallowReactive 创建一个仅顶层属性为响应式的对象
const userInfo = shallowReactive({
name: "前端专家",
address: { city: "", street: "" }, // 嵌套对象
hobbies: ["编程", "调试"],
});
// ✅ 顶层属性的变更会触发更新
userInfo.name = "Vue 高手";
// ❌ 嵌套对象属性的变更不会触发更新,从而避免了不必要的渲染
userInfo.address.city = "旧金山";
import { reactive, toRefs } from "vue";
// 创建一个响应式对象
const user = reactive({ name: "Jane", age: 30 });
// 使用 toRefs 将对象的属性解构为独立的 ref
const { name, age } = toRefs(user);
// ✅ 现在可以像 ref 一样直接修改值,并触发响应式更新
name.value = "Doe";
import { ref, watchEffect } from "vue";
const count = ref(0);
const double = ref(0);
// watchEffect 会立即执行一次,然后自动追踪其内部用到的响应式依赖(这里是 `count`)
watchEffect(() => {
// 当 count 的值变化时,这个函数会自动重新执行
double.value = count.value * 2;
});
// 增加 count 的值,上面的 watchEffect 回调将会被触发
count.value++;
<template>
<Suspense>
<!-- #default 插槽:当异步组件加载完成时显示 -->
<template #default>
<AsyncComponent />
</template>
<!-- #fallback 插槽:在异步组件加载期间显示的“加载中”UI -->
<template #fallback>
<p>全力加载中...</p>
</template>
</Suspense>
</template>
<script setup>
import { defineAsyncComponent } from "vue";
// 使用 defineAsyncComponent 定义一个异步组件
const AsyncComponent = defineAsyncComponent(() => import("./AsyncComponent.vue"));
</script>
<template>
<button @click="show = true">打开模态框</button>
<!-- 使用 Teleport 将内部内容传送到 body 标签下 -->
<Teleport to="body">
<p
v-if="show"
class="modal"
>
<!-- 这个 p 会被渲染在 <body> 的直接子节点中 -->
这是一个模态框
<button @click="show = false">关闭</button>
</p>
</Teleport>
</template>
// 在 main.js 或插件文件中定义一个全局自定义指令
app.directive("copy", {
// 当指令绑定到元素上时触发
mounted(el, binding) {
el.addEventListener("click", () => {
// 创建一个临时的 textarea 用于执行复制操作
const textarea = document.createElement("textarea");
// binding.value 是指令绑定的值,即 'Text to copy'
textarea.value = binding.value;
document.body.appendChild(textarea);
textarea.select();
document.execCommand("copy");
// 操作完成后移除临时元素
document.body.removeChild(textarea);
alert("已复制!");
});
},
});
<!-- 在组件中直接使用指令 -->
<button v-copy="'需要复制的文本'">点我复制</button>
// 插件:为所有 store 添加一个 $reset 方法
const resetPlugin = ({ store }) => {
// $initialState 是我们自定义添加的属性,用于存储初始状态
const initialState = JSON.parse(JSON.stringify(store.$state));
store.$reset = () => store.$patch(initialState);
};
// 创建 Pinia 实例并使用插件
const pinia = createPinia();
pinia.use(resetPlugin);
// 在组件中使用
const userStore = useUserStore();
userStore.$reset(); // 调用插件添加的自定义方法!
<ul>
<li
v-for="item in items"
:key="item.id"
<!-- v-memo 接收一个依赖数组 -->
<!-- 只有当 item.id 或 item.status 变化时,这个 li 才会重新渲染 -->
v-memo="[item.id, item.status]"
>
{{ item.name }} - {{ item.status }}
</li>
</ul>
<script setup>
import { ref } from'vue';
import { useIntersectionObserver } from'@vueuse/core';
// 创建一个 ref 来引用目标元素
const target = ref(null);
// 一个 ref 用于追踪元素是否可见
const isVisible = ref(false);
// 设置 Intersection Observer
useIntersectionObserver(
target, // 监听的目标元素
([{ isIntersecting }]) => {
// 当元素进入视口时,isIntersecting 会变为 true
if (isIntersecting) {
isVisible.value = true;
}
},
);
</script>
<template>
<img
ref="target"
<!-- 仅当元素可见时才设置 src 属性,从而实现懒加载 -->
:src="isVisible ? 'real-image-url.jpg' : 'placeholder.png'"
alt="懒加载图片"
>
</template>
// composables/useFormValidation.js
import { ref } from"vue";
exportdefaultfunction useFormValidation() {
// 封装表单数据和错误状态
const email = ref("");
const errors = ref({});
// 封装验证逻辑
const validate = () => {
errors.value = {};
if (!email.value) {
errors.value.email = "此项为必填项";
} elseif (!email.value.includes("@")) {
errors.value.email = "请输入有效的邮箱地址";
}
// 如果错误对象没有属性,则验证通过
returnObject.keys(errors.value).length === 0;
};
// 返回响应式状态和方法
return { email, errors, validate };
}
<!-- 在组件中使用 -->
<script setup>
import useFormValidation from "./composables/useFormValidation";
// 像使用普通 Hook 一样调用,获取所需的状态和方法
const { email, errors, validate } = useFormValidation();
</script>
<template>
<input
v-model="email"
@blur="validate"
/>
<p v-if="errors.email">{{ errors.email }}</p>
</template>
来自:https://mp.weixin.qq.com/s/ql0REKVPAl2l9yI-wNiXJA
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
为解决JS加载速度慢,采用js的延时加载,和动态加载。由于js的堵塞特性,当浏览器在加载javascript代码时,不能同时做其他任何事情,如果javascript执行时间越久,浏览器等待响应的时间就越久。
如何提高CSS性能,根据页面的加载性能和CSS代码性能,主要表现为: 加载性能 (主要是从减少文件体积,减少阻塞加载,提高并发方面入手),选择器性能,渲染性能,可维护性。
css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行。这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在css加载完成之后才进行dom的渲染以及执行后面的js语句。
性能十分重要。然而,我们真的知道性能瓶颈具体在哪儿吗?是执行复杂的 JavaScript,下载缓慢的 Web 字体,巨大的图片,还是卡顿的渲染?研究摇树(Tree Shaking),作用域提升(Scope Hoisting)
Js高性能总结:加载和运行、数据访问、DOM编程、算法和流程控制、响应接口、Ajax 异步JavaScript和XML、编程实践...
前端网站性能优化规则:网络加载类、页面渲染类。包括:减少 HTTP 资源请求次数、减小 HTTP 请求大小、避免页面中空的 href 和 src、合理设置 Etag 和 Last-Modified、使用可缓存的 AJAX、减少 DOM 元素数量和深度等
性能一直以来是前端开发中非常重要的话题。随着前端能做的事情越来越多,浏览器能力被无限放大和利用:从 web 游戏到复杂单页面应用,从 NodeJS 服务到 web VR/AR 和数据可视化,前端工程师总是在突破极限
BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。
你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗?现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅。
像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费。采用懒加载技术,即用户浏览到哪儿,就加载该处的图片。这样节省网络资源、提升用户体验、减少服务器压力。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!