web缓存学习+H5自定义属性+observe

本文介绍网页缓存技术,包括服务端和客户端缓存策略,并探讨H5自定义属性的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.web缓存
(参考https://segmentfault.com/a/1190000006741200)
https://my.oschina.net/leejun2005/blog/369148
一般针对静态资源如CSS,JS,图片等使用缓存,原因如下:
(1)请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度。
(2)节省带宽:对于已缓存的文件,可以减少请求带宽甚至无需请求网络。
(3)降低服务器压力

缓存分为服务端侧和客户端侧。常用的服务端缓存有CDN缓存,客户端缓存就是指浏览器缓存。

浏览器缓存:
1.Cache-Control描述的是一个相对时间,一般使用Cache-Control: max-age=秒,读取缓存数据条件:上次缓存时间(客户端的)+max-age < 当前时间(客户端的)。
2.Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。
3.Expires策略,过时。

详细方式参考文章

H5自定义属性:
(参考:http://blog.youkuaiyun.com/qq_31851435/article/details/53100691)
H5为我们提供了一个data属性——“data-”前缀,可以让所有的HTML元素支持自定义属性,只要在标签里面以”data-”为前缀定义我们的自定义属性就可以用来进行一些数据的存放。

<div id="myDiv" data-attribute="value">在标签里设置H5新增的自定义属性</div>  

一、使用getAttribute来获取
var myDiv = document.getElementById(“myDiv”);
var theValue = myDiv.getAttribute(“user-defined-attribute”);
二、使用Html5自定义属性对象Dataset来获取
var myDiv = document.getElementById(“myDiv”);
var theValue = myDiv.dataset.attribute;

2、删掉一个data属性
delete myDiv.dataset.attribute;
3、增加一个data属性
myDiv.dataset.attribute4 = ‘value4’;

三 observe.
参考:(https://www.w3ctech.com/topic/1097
是一个用于异步监听JavaScript对象变化的方法,并且无需使用额外的JavaScript库。它允许监听器接受一个按时间顺序排列的变更记录序列,这些变更记录描述了被监听对象所发生变化的内容的集合。

chrome30之后支持,但是新的chrome又取消了支持;

// 假设我们这里有个数据模型
var model = {};
// 我们来对它进行监听
Object.observe(model, function(changes){
    // 这个异步回调函数将被执行
    changes.forEach(function(change) {
        // 我们知道了都发生了哪些变化
        console.log(change.type, change.name, change.oldValue);
    });
});

数据模型发生的任何变化都会被记录下来:
通过Object.observe()我更喜欢称它为O.o(),你可以在不使用任何框架的前提下轻松实现双向数据绑定。而且速度很快。

<think>好的,我现在需要解决用户的问题:在Vue3和TypeScript项目中集成AntV/X6,并实现图表的宽度和高度自适应。首先,我得回顾一下AntV/X6的基本使用方法,以及它在Vue3中的集成步骤。然后,重点考虑如何让图表的宽高自适应,这可能涉及到监听窗口大小变化,调整画布尺寸,以及可能的布局调整。 首先,AntV/X6的官方文档应该是最主要的参考。用户提到之前使用过antv/G6,现在转向X6,可能需要确认X6在Vue3中的兼容性。X6本身是一个专注于图编辑的库,支持Vue等框架,可能需要使用官方的Vue组件或者自行封装。 接下来,安装依赖。用户使用Vue3和TypeScript,所以需要安装x6和对应的Vue组件,可能是@antv/x6-vue-shape。另外,可能需要处理样式文件的引入,确保正确加载。 然后,创建一个Vue组件,用来承载X6的图表。在Vue3中,使用Composition API,需要用到onMounted生命周期钩子来初始化图表,因为图表需要在DOM元素挂载后才能正确渲染。同时,考虑到TypeScript,需要正确声明节点和边的类型,避免类型错误。 关于自适应宽高,通常的做法是监听窗口的resize事件,当窗口大小变化时,调整图容器的宽高,并调用graph.resize()方法。不过需要注意防抖处理,避免频繁触发重绘导致性能问题。另外,可能需要设置容器的初始宽高为父容器的100%,这样才能根据父容器的大小进行自适应。如果父容器本身也是动态调整的,可能需要使用ResizeObserver来监听尺寸变化,而不是仅仅依赖window的resize事件。 示例代码部分,用户需要看到如何在Vue3的setup函数中初始化图表,如何绑定ref到容器元素,以及如何实现自适应逻辑。可能需要使用ref来引用DOM元素,然后在onMounted中初始化图表,并添加事件监听器。在销毁组件时,记得移除事件监听器,防止内存泄漏。 此外,用户可能需要自定义节点和边的样式,这里需要参考X6的文档,如何注册节点和边的形状,以及如何应用样式属性。例如,可以通过defineNode或defineEdge方法来创建自定义元素,然后在创建节点时应用这些定义。 最后,测试自适应功能是否有效,可能需要调整浏览器窗口大小,观察图表容器是否跟随变化,并且图表内容是否重新渲染以适应新尺寸。如果遇到问题,可能需要检查CSS样式是否正确应用,或者是否遗漏了某些配置步骤。 总结步骤大致如下: 1. 安装必要的依赖包。 2. 创建Vue组件,初始化X6图表实例。 3. 设置容器样式为自适应(如width: 100%; height: 100%)。 4. 监听窗口或父容器尺寸变化,调整图表尺寸。 5. 实现自定义节点和边的样式(如果需要)。 6. 处理组件销毁时的清理工作,如移除监听器。 可能遇到的问题包括:TypeScript类型错误,需要引入正确的类型定义;自适应逻辑没有正确触发,需要检查事件绑定和样式设置;图表内容没有居中或布局混乱,可能需要配置自动居中或布局算法。 需要确保所有步骤都符合Vue3和TypeScript的最佳实践,例如使用Composition API,正确使用ref和reactive,以及类型注解。同时,参考官方示例和文档,确保代码的准确性和可靠性。</think>在Vue3与TypeScript项目中集成AntV/X6并实现自适应布局,可分为以下步骤: ### 一、环境准备 1. 安装核心依赖: ```bash npm install @antv/x6 @antv/x6-vue-shape ``` ### 二、基础集成 ```vue <template> <div ref="container" class="x6-container"></div> </template> <script setup lang="ts"> import { ref, onMounted, onBeforeUnmount } from 'vue' import { Graph } from '@antv/x6' import { register } from '@antv/x6-vue-shape' const container = ref<HTMLElement>() let graph: Graph // 注册Vue组件节点 register({ shape: 'vue-node', width: 180, height: 40, component: { template: `<div class="custom-node">{{ label }}</div>`, props: ['label'] } }) onMounted(() => { graph = new Graph({ container: container.value!, width: container.value?.clientWidth, height: container.value?.clientHeight, grid: true }) graph.addNode({ shape: 'vue-node', x: 100, y: 60, label: '节点1' }) initResizeObserver() }) // 自适应处理 const initResizeObserver = () => { const observer = new ResizeObserver(entries => { const rect = entries[0].contentRect graph.resize(rect.width, rect.height) graph.centerContent() // 内容居中 }) if (container.value) { observer.observe(container.value) } onBeforeUnmount(() => observer.disconnect()) } </script> <style scoped> .x6-container { width: 100%; height: 100vh; border: 1px solid #e2e2e2; } </style> ``` ### 三、关键实现点 1. **容器绑定**:通过`ref`获取DOM容器,需添加`!`非空断言操作符 2. **自适应逻辑**: - 使用`ResizeObserver`替代传统`window.resize`监听,可响应父容器尺寸变化[^1] - 调用`graph.resize()`同步画布尺寸 - `graph.centerContent()`保持内容居中 3. **样式控制**: ```css /* 确保父容器有明确尺寸 */ .parent-container { width: 100%; height: calc(100vh - 60px); } ``` ### 四、高级配置 ```typescript // 自定义边样式 Graph.registerEdge( 'custom-edge', { inherit: 'edge', attrs: { line: { stroke: '#A2B1C3', strokeWidth: 2, targetMarker: { name: 'block', width: 12, height: 8 } } } }, true ) // 响应式配置 const initGraph = () => { return new Graph({ // ... scroller: { enabled: true, pageVisible: false, pageBreak: false }, mousewheel: { enabled: true, modifiers: ['ctrl', 'meta'] } }) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值