首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第三十三篇)】 Vue 中的实例及本地图片预览


Vue 世界中的实例

Vue2 中的实例

每个 Vue 应用 都是 new Vue 函数创建的一个新的实例,创建的时候将 data 作为 property 添加到响应式系统中

代码语言:javascript
复制
const vm = new Vue({
    // options
})

Vue3 中的三种实例

应用实例(Application Instance)

  • 使用 createApp 创建一个 应用实例(Application Instance)
  • 应用实例用来注册应用中的全局内容
  • 大多数方法支持链式调用,返回应用实例本身
代码语言:javascript
复制
import { createApp } from 'vue';
import App from './App.vue';
// 返回应用实例
const app = createApp(App);
app.use(Antd).use(router).use(vuex);
app.mount('#app');

组件实例(Component Instance)

  • createApp 传递的组件,称之为根组件(root component)
  • mount 方法用来将应用实例挂载到 Dom 节点上,返回的是组件实例(Component Instance)
  • 通过 refs 获取的都是组件实例
代码语言:javascript
复制
import { createApp } from 'vue';
// 根组件
import App from './App.vue';
const app = createApp(App);
// 返回组件实例
const vm = app.mount('#app');

组件内部实例(Internal Component Instance)

这是一个神奇的混合实例

  • proxy 属性,可以拿到组件实例上面的内容
  • appContext ,可以拿到应用实例上的部分属性
代码语言:javascript
复制
import { getCurrentInstance } from 'vue';
const internal = getCurrentInstance()

本地图片预览的两种方式

URL.createObjectURL(File)

  • 创建一个 DOMString,返回一个 URLURLdocument 绑定,表示指定的 file 对象
  • 如果类型不支持转换会报错
代码语言:javascript
复制
try {
  url = URL.createObjectURL(File)
} catch (error) {
  console.log('File transform error', error)
}

url 是一个以 blol 开头的地址,指向内存中存放图片的地址,使用 uft-16 字符串进行保存。

FileReader.readAsDataURL(File)

  • FileReader 上面的实例方法,读取指定的 File 对象,读取完成的时候触发回调,返回 base64 格式的字符串。
  • 如果类型不支持转换会报错
代码语言:javascript
复制
// 创建一个 FileReader 实例
const fileReader = new FileReader()
fileReader.readAsDataURL(File)
// 需要绑定事件
fileReader.addEventListener('load', () => {
  // 结果保存在 fileReader.result 中
  url = fileReader.result
})
// 错误处理事件
fileReader.addEventListener('error', () => {
  console.log('upload transform error', error)
})

url 是一个以 data 开头的 base64 格式的字符串。

两种方法比较

  • 返回值
    • URL.createObjectURL(File) 得到的是内存中存放图片的地址,使用 uft-16 字符串进行保存。
    • FileReader.readAsDataURL(File) 得到的是 base64 格式的字符串。
  • 执行机制
    • URL.createObjectURL(File) 直接返回,同步执行
    • FileReader.readAsDataURL(File) 通过回调的方式返回,异步执行
  • 内存清理
    • URL.createObjectURL(File) 存在于当前 document 中,清除方式只有 unload() 事件 URL.revokeObjectURL() 方法手动清除
    • FileReader.readAsDataURL(File) 依照 JS 垃圾回收机制自动从内存中进行清理
  • 总结
    • URL.createObjectURL(File) 得到本地内存容器的 URL 地址,同步使用,比较方便快捷,多次使用需要注意手动释放内存的问题,性能优秀。
    • FileReader.readAsDataURL(File) 胜在直接将文件转为 base64 格式,可以直接用于业务,无需二次转化格式。

Element 类型家族之间的关系

  • img dom 节点有个神奇的类型称之为 HTMLImageElement ,它是标准 webAPI 的一部分,还有很多类似的 HTML 标签类型
    • HTMLInputElement
    • HTMLDivElement
  • HTMLImageElement 继承自 HTMLElement
  • HTMLElement 继承自 Element
    • HTMLElement
    • SVGELement
  • Element 继承自 Node
    • 一个基本的抽象类,没有一个真正的 Node 对象
    • 所有对象实现的都是基于它的子类
      • Document
      • Element
      • DocumentFragment
  • Node 继承自 EventTarget
    • 是一个最基本的Dom接口
    • 可以接收事件,创建监听器等
      • ElementDocumentWindow
      • XHLHttpRequest

获取图片原始尺寸

代码语言:javascript
复制
export const getImageDimensions = (url: string | File) => {
  return new Promise<{ width: number; height: number }>((resolve, reject) => {
    const img = new Image();
    img.src = typeof url === 'string' ? url : URL.createObjectURL(url);
    img.addEventListener('load', () => {
      const { naturalWidth: width, naturalHeight: height } = img;
      resolve({ width, height });
    });
    img.addEventListener('eror', () => {
      reject(new Error('there was some problem with the image'));
    });
  });
};
下一篇
举报
领券