vue3中正确设置ref获取的组件ts类型
在日常开发中,肯定会遇到需要使用ref来获取组件实例的情况:<template> <div class="test"> <MyDialog ref="MyDialogRef"/> </div> </template> <script setup lang="ts"> import MyDialog from "./MyDialog.vue"; const MyDialogRef = ref(); </script...
前言最近有一个想法,就是在使用rem适配大小的时候,往往我们会引入一个用于设置根元素大小的js脚本文件,但是对于这个脚本的处理根据不同情况会有不同的调用方式。以插件:amfe-flexible为例:比如我们是一个纯spa项目,一般就会在main.ts中import引入这个脚本:import "amfe-flexible";一般来说,这种做法没什么问题,因为spa的html渲染是js操作的,我们在渲染之前就引入了这个脚本,所以体验上会先通过amfe-flexible设置根元素大小,再进行html渲染,用户体验良好。随着业务的变化,我们可能会有SSR的需求,首屏loadi...
前言unplugin-auto-import这个插件用于解决在书写组件时,总是需要从vue中import引入相同依赖的重复劳动。import { computed, ref } from 'vue' const count = ref(0) const doubled = computed(() => count.value * 2)使用自动引入后就不需要手动一个个importconst count = ref(0) const doubled = computed(() => count.value * 2)对于想偷懒的人来说,还是挺不错的。插件会在代...
最近碰到一个巨奇葩的问题,项目中采用了unplugin-vue-components,但是vant的组件引入又是import手动按需引入,加上一些很奇怪的配置,导致项目配置变得复杂了,于是抽空将项目的配置全部梳理了一遍,并将import手动按需去除,全部采用自动引入的方式,通过分析打包后的包体,可以看到减少了100kb左右的大小,效果非常可观。但是问题也出在这了,当我使用自动引入的时候,vant的Dialog组件出现了问题,表现为:当我通过组件的形式使用时,弹窗会自动打开,显示还有问题,但是查看v-model:show变量是false;我开始以为是样式问题,单独引入dialog样式无效,...
前言实现一个自定义的置入按钮,然后实现置入html代码的功能,比如我们在使用外部iframe标签时,如果直接粘贴,会被识别为string值,从而导致无法正确展示内容,所以我们需要一个置入功能。我一开始想通过控制options的方式来实现,发现不太行,最后转用:先声明html结构,然后options关联的方式。教程自定义工具栏目前个人觉得最方便的方式就是先写html结构,然后options中通过container进行关联。<div id="quill-edit-toolbar" class="ql-toolbar ql-snow"> ...
前言上一篇是修改官方的图片上传行为,这次是修改官方视频按钮默认行为,你会发现官方的视频默认行为,总是采用iframe的形式,如果我们希望是原生video元素,就没办法了,于是就有了本篇教程。这次自定义和图片就略有不同了,我们不能直接这么插入:editor.insertEmbed(range.index, 'video', src, Quill.sources.USER);如果采用这种方式,会导致和官方的行为一致,变成插入的是iframe元素了。为此,我们需要了解一个新知识:Blot官方文档对于Blot的介绍很少,我们可以理解是一种行为扩展的方式,可以对用户输入的内容进...
前言quill默认图片上传是将图片转为base64字符串,这个主意很不错,但是如果考虑后端存储的大小,就不太美丽了,因为base64的字符串大小往往比实际图片大小占用还要大一些,所以一般的做法是自定义文件上传,后端返回外链地址,用链地址来代替base64,以减少富文本的内容大小。我目前的做法是将官方默认图片上传的行为改变,这样按钮样式啥的就不用自己操心了。教程修改默认按钮行为我们在初始化quill实例的时候,会传入一个options来控制样式和顶部菜单功能。import type { QuillOptionsStatic } from 'quill'; const ...
前言最近同事测试落地页发现下载触发无响应,然后我为了调试方便,给他手机从酷安上下了一个谷歌浏览器,结果安装完才打开,发现页面直接就报错了,提示:vue router SyntaxError: Unexpected token '?'我开始以为是路由出现问题了,结果查了半天发现是es的新特性??语法导致的。由于vite使用的是esbuild打包,所以我在esbuild的文档上查询到,??语法最低只支持Chrome 80版本,我一看安装的版本v78,两眼一黑。看来要做一个低版本的兼容处理了。教程vite的配置选项中有一个build选项,里面有一个target目标,表示你需...
前言今天才发现,vite使用了postcss做px转换的时候,导致index.html写的style标签里面的样式也被转换了。超级尴尬,导致静态loading的样式会大小变化一下,很难受。解决的思路还是很简单的,有两种方式:添加class黑名单,这样对应的class就不会转换了;排除指定文件,该文件不会被转换;我项目使用的是rem转换,vw的转换其实配置也差不多。解决办法rem插件postcss-pxtorem配置postcss.config.js中postcss-pxtorem的配置:module.exports = { plugins: { "pos...
全局方法挂载和类型声明全局挂载还是很简单的,照着官方的例子写就可以了,我的做法是创建了一个单独ts文件,通过app.use()的方式来进行批量挂载,代码如下:import type { App } from "vue"; /** * @description: 获取assets文件 * @param {string} path * @Date: 2023-05-05 10:05:18 * @Author: mulingyuer */ export function getAssetsFile(path: string): string { retu...
看了下vant的tab组件源码,当开启swipeable功能后,其实会对容器监听touch事件,这就导致我们在内容部分存在横向的滚动的时候,会导致同时触发touch事件,从而产生了冲突。解决办法就是二选一,要不在这个横向scroll的时候不触发swipeable,要不放弃swipeable。如果是第一种方案,我们需要对存在横向scroll的容器元素,做一个事件冒泡阻断,问题就解决了。<div @touchstart.stop @touchmove.stop @touchend.stop> scroll的div </div>
服务器返的时间是一个utc的时间字符串2022-12-01 03:00:30,我们需要将其转为我们本地时区,以东八区为准,正确的时间应该是2022-12-01 11:00:30。我当时这么写的:moment(new Date(time)).local();其实这是有问题的,首先我其实是为了防止time这个变量错误,所以使用了new Date,但其实是不对的,new Date会导致时间被转为本地时间且不会加上本地时区的8个小时。new Date("2022-12-01 03:00:30"); //Thu Dec 01 2022 03:00:30 GMT+0800 (中...
typescriptimport type { DirectiveBinding } from "vue"; export default { bind(el: HTMLElement, binding: DirectiveBinding<Function>) { //声明一个给document绑定的事件 function documentClick(event: Event) { const target = event.target as unknown as Node; if (el.contains(t...
eslint校验的一些问题(暂时无解)在初始化项目时勾选了eslint校验之后,升级vue 2.7版本后,eslint-plugin-vue这个插件需要升级到9+版本,我目前使用的版本是:"eslint-plugin-vue": "^9.4.0"具体的一些可以参考官方提供的2.7升级指南:2.7日志官方居然把这个写在了变更日志里面,按道理最好官方的文档上也有一份说明的,但是目前没有。虽然eslint的依赖更新到新版后确实解决了一些项目启动报错的问题,但是有时候我们的SFC单文件组件开发的时候,template中的一些变量绑定还是会出现波浪线警告,这...
前言使用了ts最头疼的是什么,除了类型声明应该没有第二家了,那么在vue3中如何正确的声明ts类型,代表着我们踏出了认识vue3的第一步,这非常重要,所以为此水个文章,分享给有需要的人。Volar 插件一开始我对于Volar并没有太大的需要,因为一直使用的Vetur,而且这个插件刚出来时并不完善,各种视频up讲的那个一键分屏功能其实也并不好用,虽然是个很有意思的东西,但是没有那种非要使用它的点,所以当时的我怀着这么一个疑问?为什么要用Volar ?现在我就通过两张图告诉你,它有多香!我们在template里面写代码,绑定变量最烦的是什么,就是我们写了个对象,但是忘了它的属性有哪些啊,使用...
对象扁平化其中objectDit表示的是对象的分割符/** * @description: 对象扁平化 * @param {object} data * @Date: 2022-06-01 17:41:13 * @Author: mulingyuer */ export function objectFlat(data: object, options = { objectDit: "." }): object { let newObj = {}; let process = (key: string, value: any) => { ...
前言为了兼容之前的旧浏览器版本,特别是安卓4.4这种低版本,transform是一定得增加浏览器前缀的,但是我在项目中遇到了设置无效的问题,极度蛋疼,下面是我的解决教程,当然没这个问题,看这篇文章,相信你对如果给项目增加浏览器前缀,会有很充分的认识。教程给css增加浏览器前缀,业界的做法就是使用postcss,目前webpack与vue cli他们需要安装的依赖略有不同:webpack:pnpm i postcss postcss-loader autoprefixer -D添加对应的rules{ test: /.s?css$/, use: [ ...省略...
概述一般情况下,我们的vuex数据都是静态的,store在首次初始化后数据的格式就定好了,在日常使用中也确实应该这么做。但是,随着业务的发展,vuex可能会变得非常的大,或者在多页面打包的时候,每个页面都需要vuex,但是如果把每个页面的vuex都写在一起,你会发现,原来我a页面可能只需要30个vuex的数据监听,但是会多出来其他页面的数据,这显然不应该的。所以,我们需要一个能够动态加载模块的方法,每个页面动态加载自己的vuex数据使用。api了解vuex官方提供了几个api:registerModule动态注册模块apiunregisterModule卸载一个动态模块hasModule...
安装vue2版需要安装8.x版本的,9.x的是vue3版本使用上大同小异。vue2安装:yarn add vue-i18n@8vue3安装:yarn add vue-i18n封装官方虽然支持很不错的用法,但是自定义处理是难免的。vue3文件目录结构├─ src │ ├─ language │ │ ├─ lang │ │ │ ├─ en.json │ │ │ └─ zh.json │ │ ├─ core │ │ │ ├─ i18n.ts │ │ │ ├─ customization.ts │ │ │ └─ language.ts │ │ ├─ i...
原理全局存在一个弹窗管理器,他管理着一个数组,所有的弹窗触发全部包成一个函数,交给管理器,管理器去查看队列是否有内容,如果有内容就不触发,无内容就将本次函数push进数组中,然后触发next方法弹出下一个弹窗。当弹窗关闭后,触发管理器的remove方法,数组首位出栈,触发next方法,弹出下一个弹窗示意图源码四个文件:dialogMap.ts 弹窗数据,可能这个弹窗这次需要队列,下次就不需要,通过这个配置index.ts 入口文件queueManager.ts 管理器types.ts 类型声明types.ts/* * @Author: mulingyuer * @Date: 20...
引入组件的方式传统模式import Vue from 'vue' import VueCompositionAPI from '@vue/composition-api' Vue.use(VueCompositionAPI) import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => ...
当项目需要和其他项目进行沟通的时候,往往常见的做法就是,我在a网站点击一个按钮,在链接中携带query参数啥的,然后去访问b网站页面。此时可能会有两种情况:跳转的链接就是b网站的具体链接地址。跳转的链接是b网站的一个跳板,跳板会对参数做一些操作,然后进行重定向。两种做法都各有优势:第一种省事简单,但是如果以后b网站链接层级发生变化,那么就会导致链接不可能,到时候还需要进行修改,很痛苦。第二种的话,我们需要写一个跳板页面,但是通过一些参数要求,甚至自身加上一些逻辑处理,那么他的功能性会更强一些。那么,在vue中,做一个重定向页面,怎么做?思路思路1利用路由守卫,当链接上存在某个参数的时候,...
自己去注册吧,提供的是es6导出的方法//短横线转驼峰 export const dashToHump = function (value) { const textArr = value.split("-"); return textArr.map((item, index) => { if (index === 0) return item.toLowerCase(); return item.slice(0, 1).toUpperCase() + item.slice(1); }) .join("")...
资源github:vue.draggable中文文档:vue.draggable中文文档api参考文档:sortablejsvue.draggable是基于sortablejs的vue封装,所有有些api官方并不会有过多的解释,可以去sortablejs查看下拖拽无法触发页面滚动当拖拽的内容大于页面宽高时,页面滚动就是一个必然的需求,但是vue.draggable默认情况并不能触发滚动。官方设置里有一个属性:scroll,如果为true时就能触发滚动,但是默认属性就是true;所以这个配置可以说是无效的。解决方案:cannot set scrollSensitivity19年的时候就有提...
在elment的table多选中增加单选逻辑,这个也不能说产品的问题,单选和多选应该算是比较基础的应用,但是,element并没有对单选做支持。于是我有了一个偷懒思路!前提由于table的一键全选按钮无法进行细致化操作,无法控制点击时选中的数量,只能在选中后的回调里面处理,所以,我的做法是单选时隐藏这个按钮。 selectable方法可以返回布尔值来表示当前格子是否允许勾选或者取消,其实就是禁用的意思。<el-table-column type="selection" :selectable="onSelectable"></el...
最近评论