关于vue.js:vue选项卡

<template v-if="!isLogin"> <template id="onCh"> <div v-for="(item, index) in rightMenu" :key="index" @click="addClass(index)" v-bind:class="{ ischeck: index == current }"> <router-link class="oneli icobtn" :to="{path:item.path}" exact v-if="item.ico" > <img :src="item.ico" alt="" /> <span>111{{ item.title }}</span> </router-link> <router-link class="oneli rigisterbtn" :to="{path:item.path}" exact v-else> <span>222{{ item.title }}</span> </router-link> </div> </template></template>addClass(index) { // var cun = sessionStorage.name = index; // console.log("cun",cun); // var na = sessionStorage.getItem("name",index); // console.log("na",na); this.current = na; },

May 3, 2022 · 1 min · jiezi

关于vue.js:vue插槽的理解和使用

vue插槽的了解和应用https://www.cnblogs.com/mandy...

May 2, 2022 · 1 min · jiezi

关于vue.js:Linux系统上部署-基于Spring-BootVue的前后端分离项目笔记

前言毕业设计实现后,想实际一下如何部署到Linux服务器上。次要实现办法:前端Vue我的项目打包后部署到nginx服务器上,后端SpringBoot我的项目打成jar包间接跑。本文章次要介绍:Nginx装置与配置、JDK8装置与配置、MySQL5.7装置与配置、Vue我的项目打包、SpringBoot我的项目打包 1、Linux环境筹备有条件买云服务器,没条件用VMWare。我这里用后者演示。我用的CentOS7(1)首先装置零碎镜像参考:虚拟机装置CentOS7教程(2)配置网络 Net或桥接 参考我的另一篇文章:Net模式&桥接模式的配置教程 这里演示用Net模式 2、Nginx装置与配置1)官网下载Linux版本的:http://nginx.org/en/download.... 在Linux官网下载对应版本地nginx压缩包(以tar.gz结尾),将其上传到Linux服务器上,应用如下命令解压 nginx 安装包(依据下载的nginx版本更换对应版本): tar -zxvf nginx-1.18.0.tar.gz进入nginx-1.18.0目录 cd nginx-1.18.0make 编译装置它: ./configure make make install装置 zlib 库 cd ~wget http://www.zlib.net/zlib-1.2.11.tar.gztar -zxvf zlib-1.2.11.tar.gzcd zlib-1.2.11./configuremakemake install装置 SSL yum -y install openssl openssl-devel装置 pcre yum -y install pcre-develnginx 服务的常用命令 cd /usr/local/nginx/sbin/./nginx 启动./nginx -s stop 进行./nginx -s quit 平安退出./nginx -s reload 从新加载配置文件ps aux|grep nginx 查看nginx过程这个时候拜访虚拟机配置的 ip 地址,如果能够关上上面这样一个页面,阐明 nginx 启动胜利: 配置nginx.conf文件 vim /usr/local/nginx/conf/nginx.conf减少如下配置: server { listen 80; server_name localhost; #重要 location / { root /usr/local/nginx/html/dist; #前端我的项目寄存在nginx中的地位 index index.html index.htm; try_files $uri $uri/ /index.html; #避免刷新后主动跳到自带404页面 }在批改了配置文件后须要从新加载配置文件 ...

April 30, 2022 · 2 min · jiezi

关于vue.js:聊聊我是怎么样用vite替换webpack的

highlight: a11y-dark前言都曾经 2202 年了,vite曾经能够算是遍地开花了,这两年的关注度也比拟高究其原因,还是因为苦webpack久矣; 随着我的项目性能越来越多,代码越来越简单,随之而来的就是我的项目的各种慢(ps:跑个我的项目的工夫都能去茶水间打杯水回来喝一会儿了 ) 至于起因,简短来说,就是webpack须要去索引整个我的项目的文件,编译成一个或多个独自的 js 文件;而vite则是在浏览器申请对应 URL 的时候,再提供对应的文件,更具体的还是去瞅瞅 vite 的自荐吧 开搞开始进入正题 1. 批改我的项目配置终端输出npm i -D vite装置 vite 批改pageage.json中的相干命令 "dev": "vite","build": "vite build","serve": "vite preview","lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src"2. 在根目录创立vite.config.js文件import { defineConfig } from 'vite'import { createVuePlugin } from 'vite-plugin-vue2'import path from 'path'export default defineConfig({ base: './', plugins: [createVuePlugin()], server: { open: true // 启动实现之后主动关上浏览器 }, resolve: { alias: [ { find: '@', replacement: path.resolve(__dirname, 'src') } // 应用这种形式能够引入.vue文件,然而图片会404 { find: '/@', replacement: 'src' }, // 解决图片应用别名404,@符号后面须要加'/',也没有用绝对路径 ] }})3. 批改环境变量在 vite 中曾经不反对原来的process.env来拜访环境变量了 ...

April 29, 2022 · 1 min · jiezi

关于vue.js:Vue3-使用-Hook-实现数据懒加载

装置 vueusenpm i @vueuse/core -S 官网文档useIntersectionObserver | VueUse template<section class="p-2 font-medium" ref="target"> 要懒加载的 DOM 元素</section>script<script setup>import { ref } from "vue"import { useIntersectionObserver } from "@vueuse/core"const target = ref(null)const targetIsVisiable = ref(false)const { stop } = useIntersectionObserver( target, ([{ isIntersecting }], observerElement) => { // 如果进入可视区域 if (isIntersecting) { console.log("target is visible"); console.log(observerElement); stop() // 只需懒加载一次 // axios() // fn() } targetIsVisiable.value = isIntersecting console.log(targetIsVisiable.value); })</script>

April 29, 2022 · 1 min · jiezi

关于vue.js:Vuex相关

Vuex是什么Vuex是实现组件全局状态(数据)治理的一种机制,能够不便的实现组件之间的数据共享Vuex对立治理的益处1.可能在vuex中集中管理共享的数据,易于凋谢和前期保护2.可能高效的实现组件之间的数据共享,进步凋谢效率3.存储在Vuex中的数据是响应式的,可能实现报错数据和页面的同步什么样的数据适宜存储到Vuex中个别状况下,只有组件之间共享的数据,才有必要存储到Vuex中,对于组件中的公有数据,仍旧存储在组件本身的data中 //state(斯得特) 寄存全局共享的数据

April 29, 2022 · 1 min · jiezi

关于vue.js:Vue的计算属性

计算属性 computed次要是用在页面须要通过计算来取得另外一个值的时候利用留神1: 计算属性和data属性都是变量-不能重名. 用法和data雷同 留神2: 函数内变量变动, 会主动从新计算结果返回需要:计算两个数据的值<template> <div> <p>和为: {{ num }}</p><p>{{ reverseMessage }}</p></div></template> <script>export default { data() { return { a: 10, b: 20, message: "我是个字符串",};}, computed: { num() { return this.a + this.b;},reverseMessage() { return this.message.split("").reverse().join("");},},};</script>split("").reverse().join("")这一串是返回一个将一个字符串拆分数组,反序,再从新拼接回字符串的性能。 计算属性用于缓存在编译过程中第一次遇到的时候失常运行,前面只有变量的数值不变,那么就间接在缓存中读取,不须要从新计算return会把值放在缓存中,如数值变动,那么就须要从新计算了。

April 28, 2022 · 1 min · jiezi

关于vue.js:通过改造elementUI的eltree非源码实现类文档编辑器右键菜单删除文件功能

最近做我的项目遇到了一个需要,之前没写过,且对本人来说感觉实现起来有些难度,所以记录一下过程以作备忘。我的项目现页面左侧是应用el-tree实现的一个文档构造,在该文档的某个节点鼠标右键弹出菜单,能够删除对应的文件,而el-tree通过鼠标左键点击节点默认只有单选高亮。当初须要减少一个性能,通过ctrl+鼠标左键点击节点实现多选高亮,再通过鼠标右键弹出菜单时能够批量删除。交互如下图所示: 接到需要,必定就要想好这个交互怎么搞,有一些脉络,然而也不是很清晰,放心细节考虑不周,所以就去钻研了一下vscode这个性能是怎么实现的,钻研一下竞品的交互设计(偷师)是一个必修课嘛。 捣鼓了一阵就得出了大抵的交互细节。如: ctrl+左键点击节点实现多选高亮。鼠标右键显示的菜单是依据所右键的节点的内容决定的。不是所有的节点都有删除性能,也就是不是所有文件都是能够删除的,因为我的项目的某些后盾文件删除会导致整个我的项目跑不起来。然而crtl+左键多选是所有节点都能够抉择的,所以删除时须要排除掉不可删除的节点右键时其节点可能并没有被左键选中高亮,所以须要加一个判断,右键时,节点若不在高亮节点中,删除时只删除以后右键节点,反之,则批量删除高亮节点内可被删除的节点。从技术上实现的话,须要留神的是以下几点: 实现树的多选须要应用show-checkbox和node-key字段来显示复选框才可多选,因为UI设计里无复选框,所以还须要笼罩款式暗藏复选框,该字段的应用会多出类名为el-checkbox的节点,通过css来暗藏,而节点的高亮则通过高亮时新增的类名.is-checked来实现的,所以能够依据这个类名对el-tree-node__content减少背景色彩来实现高亮。因为多选高亮时父子节点的关联高亮是不合乎设计和习惯的,所以应用:check-strictly="true"严格的遵循父子不相互关联。依据@node-contextmenu="handleNodeContextMenu函数获取右键的节点,和通过树的getCheckedNodes函数获取全副已选节点的数组,通过findIndex判断右键节点是否在其中。节点的data数据内会蕴含是否能够删除的信息最初实现的代码局部内容如下: //html局部<el-tree :data="projectShowPanel" :props="treeProps" :default-expanded-keys="expandedArr" @node-click="handleNodeClick" //关键点 :expand-on-click-node="false" @node-contextmenu="handleNodeContextMenu" //关键点 @node-expand="nodeExpand" @node-collapse="nodeCollapse" show-checkbox //关键点 node-key="path" //关键点 :filter-node-method="searchNode" :indent="nodeIndent" :check-strictly="true"//关键点 ref="serverTree" ></el-tree><mouse-menu :menuList="menuList" @handleContext="handleContext" ref="mouseContext"></mouse-menu>//通过vue-context插件来实现右键菜单//css局部/deep/ .el-tree-node{ .is-checked > .el-tree-node__content { background-color: #07B6B5 !important; color: #fff !important; } > .el-tree-node__content { .el-checkbox{ display: none; } } }//JavaScript局部// 解决tree-item 被右键单击 handleNodeContextMenu(event, data, node, nodeSelf) { let datas = this.$refs.serverTree.getCheckedNodes();//获取已选节点的数据 let nodes = datas.map(data => { return this.$refs.serverTree.getNode(data.path)//获取已选节点 }); //datas和nodes还须要通过是否可删除的字段来过滤掉不可删除节点 //以下判断右键节点是否在已选节点内 let index = datas.findIndex(item => { return item.path === data.path }); //依据是否存在,通过getContextList函数生成对应菜单数组menuList if(index > -1){//若在 this.menuList = this.getContextList(data, node, datas, nodes); } else{//若不在 this.menuList = this.getContextList(data, node); } if (this.menuList.length > 0) { this.$refs.mouseContext.openContext(event, node);//若菜单数组不为空,显示右键菜单内容 } }以上代码可获取到节点的具体数据,最初再依据理论业务代码来决定具体的删除代码函数 ...

April 28, 2022 · 1 min · jiezi

关于vue.js:为什么vue-vhtml不执行script代码

文章不易,请关注公众号 毛毛虫的小小蜡笔,多多反对,谢谢。 问题有个敌人问了个问题:为啥vue中的v-html不会执行<script>中的js代码? 比方,给v-html赋予上面这个值,尽管看到DOM中有值,但却不会弹窗。<script>alert(/xss/)</script> 解释可能他还不晓得,这个不是vue的限度,而是html5中的规定。 html5中为了平安起见,不会执行innerHTML中插入的<script>的代码。 所以,如果想给v-html赋值<script>的代码,尽管能看到在dom中胜利展现,但却不会执行<script>中的js代码的。 那v-html是否进攻xss攻打?既然v-html都不会执行<script>的js代码,那是否进攻xss攻打呢? 详情 请查看:毛毛虫的小小蜡笔

April 28, 2022 · 1 min · jiezi

关于vue.js:vue3最全资源库来袭包含web移动小程序Electron常用库面试文档工具等资源

一.介绍vue3-resource专一于收集vue3相干资源,蕴含(web/挪动/小程序/桌面/罕用库/面试/文档&工具)等资源.继续更新中!!!如果这些资源对你有帮忙, 欢送star 反对下【vue3-resource】 二.特地阐明 举荐的资源全副反对vue3,因为集体精力有限,可能会脱漏很多优良的vue3开源资源或资源谬误!还请您点此被动举荐或批改倡议!!!非常感激。可点击在线预览查看具体资源, 站点部署在github,可能拜访过慢,请急躁期待。 三.资源举荐资源共分为web端、挪动端、Electron、小程序、文档&工具、罕用库、学习&面试、珍藏等8个模块,每个模块都有细分,具体查看站点. Web端UI库- 举荐支流UI资源,蕴含element-plus,Ant Design Vue等14个UI资源开箱即用中后盾 - github热门中后盾开源我的项目富文本编辑器 - 举荐罕用的富文本组件,蕴含WangEditor V5、Tinymce-vue等4个富文本编辑器Markdown编辑器 - 举荐罕用的markdown组件,蕴含Vue-markdown-editor、Md-editor-v3等3个markdown资源上传组件 - 蕴含Uppy&Vue-filepond图片/背景组件 - 蕴含图片裁剪、预览、背景、轮播、懒加载音频/视频组件 - 举荐罕用的音视频组件,蕴含XGplayer、Vue3-video-play图标库 - 丰盛的图标资源库,蕴含Iconbox、IconPark、Boxicons、Unplugin-icons等图标资源图表组件 - 优质图表组件,蕴含ECharts5、Vue-echarts、Vue-highcharts等图表资源拖拽组件 - 蕴含Vue-drag-resize、Vue.draggable.next等拖拽组件vue3我的项目配套资源 - 蕴含构建工具vite & vue cli、vue3全家桶、Nprogress.js-进度条、Screenfull.js-全屏、Vue-i18n国际化计划文件解决组件 - 蕴含Html2canvas截图、PDFvuer-PDF查看器、vue3-simple-html2pdf主动导出pdf动画库 - 蕴含Animate.css、 Wow.js、Scrollreveal.js等常见动画资源地图资源 - vue3地图适配的组件较少,欢送举荐其余组件 - 蕴含Vue-qrcode- 二维码、Vue-typical 动画输出、Vue3-clipboard- 剪贴板、Iscroll- 平滑滚动插件挪动端UI库 - 举荐罕用的UI库,蕴含Vant、NutUI 3.0、Varlet、Ionic Framework、WaveUI等优良开源UI库开源我的项目 - 举荐优良开源我的项目,帮忙您更好的学习vue3滚动组件 - 蕴含BetterScroll、Mescroll、FullPage.js等优质挪动端滚动组件配套资源 - 蕴含Fastclick,此资源还待欠缺, 欢送举荐ElectronElectron总览资源 - 此资源还待欠缺, 欢送举荐 Electron-vue-vite - Electron + Vite + Vue 整合模板 -- 构造简略,容易上手!Vite-electron-quick - ⚡️Starter template with Vite2 Vue3 and Electron 11.x /应用 Vite2 Vue3 以及 Electron 11.x 打造的疾速启动模版Electron-vue3-inote - 应用electron13+vue3.x+ts的桌面端便笺我的项目,领有丑陋的过渡动画成果,以富文本模式贮存在本地,可多开输出窗口Electron-vite-template - 本我的项目是一个由Vite和rollup组成的vue3+Vite+electron我的项目模板Electron-admin-element-vue - Electron Vue3.x Element-UI Admin小程序小程序资源总览 - 此资源还待欠缺, 欢送举荐Uni-app - uni-app 是应用 Vue 语法开发小程序、H5、App的对立框架Taro - 开放式跨端跨框架解决方案,反对应用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝/字节跳动/ QQ 小程序/H5/React Native 等利用Kbone - 一个致力于微信小程序和 Web 端同构的解决方案Vant-weapp - 轻量、牢靠的小程序 UI 组件库Nut-UI- Taro框架 - 京东格调挪动端 Vue2、Vue3 组件库罕用库资源总览 - 资源总览详情Lodash- 实用工具库 - Lodash是一个一致性、模块化、高性能的 JavaScript 实用工具库Outils- 业务代码工具库 - 前端业务代码工具库30-seconds-of-code- 代码片段 - 满足您所有开发需要的简短 JavaScript 代码片段Chancejs-随机数 - 生成随机数据的库Nanoid- ID 生成库 - 一个玲珑、平安、URL敌对、惟一的 JavaScript 字符串ID生成器Js-md5- md5加密 - md5加密,反对 UTF-8 编码encoder/decoder 库 - 前端 encoder/decoder 库Imagemin- 图片压缩 - 图片压缩库FileSaver.js- 文件下载 - 文件下载插件 很多时候下载会有兼容性问题,它能帮你解决这些问题StreamSaver.js 大文件下载 - 大文件下载Big.js - 用于任意精度十进制和非十进制算术的 JavaScript 库Bignumber.js - 用于任意精度十进制和非十进制算术的 JavaScript 库Momentjs - JavaScript 日期解决类库Dayjs - Day.js 是一个轻量的解决工夫和日期的Date-fns - JavaScript 日期解决类库JavaScript 库,和 Moment.js 的 API 设计放弃齐全一样。Qs- url参数转化 - qs是一个url参数转化(parse和stringify)的js库Numeral.js- 格式化和解决数字 - 一个用于格式化和解决数字的javascript库 ...

April 28, 2022 · 2 min · jiezi

关于vue.js:Vue的高级特性

Vue高级个性(一)Vue 的优缺点长处 创立单页面利用的轻量级Web利用框架简略易用双向数据绑定组件化的思维虚构DOM数据驱动视图毛病 不反对IE8SPA 的了解SPA是Single-Page-Application的缩写,翻译过去就是单页利用。在WEB页面初始化时一起加载Html、Javascript、Css。一旦页面加载实现,SPA不会因为用户操作而进行页面从新加载或跳转,取而代之的是利用路由机制实现Html内容的变换。长处 良好的用户体验,内容更改无需重载页面。基于下面一点,SPA绝对服务端压力更小。前后端职责拆散,架构清晰。毛病 因为单页WEB利用,需在加载渲染页面时申请JavaScript、Css文件,所以耗时更多。因为前端渲染,搜索引擎不会解析JS,只能抓取首页未渲染的模板,不利于SEO。因为单页利用需在一个页面显示所有的内容,默认不反对浏览器的后退后退。毛病3,想必有人和我有同样的疑难。 通过材料查阅,其实是前端路由机制解决了单页利用无奈后退后退的问题。Hash模式中Hash变动会被浏览器记录(onhashchange事件),History模式利用 H5 新增的pushState和replaceState办法可扭转浏览器历史记录栈。 new Vue(options) 都做了些什么如下 Vue 构造函数所示,次要执行了 this._init(options)办法,该办法在initMixin函数中注册。 import { initMixin } from './init'import { stateMixin } from './state'import { renderMixin } from './render'import { eventsMixin } from './events'import { lifecycleMixin } from './lifecycle'import { warn } from '../util/index'function Vue (options) { if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } // Vue.prototype._init 办法 this._init(options)}// _init 办法在 initMixin 注册initMixin(Vue)stateMixin(Vue)eventsMixin(Vue)lifecycleMixin(Vue)renderMixin(Vue)export default Vue查看initMixin办法的实现,其余函数具体实现可自行查看,这里就不贴出了。 ...

April 28, 2022 · 10 min · jiezi

关于vue.js:ModStartCMS-模块化建站系统-Laravel9版-v380

ModStartCMS Laravel9版 V3.8.0 模块搜寻反对,本地视频反对零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V3.8.0版本更新2022年04月24日ModStartCMS Laravel9公布v3.8.0版本,减少了以下13个个性: [新性能] 新增余额领取性能[新性能] 移除 elasticsearch 依赖(应用模块反对)[新性能] 多模块搜寻提供者切换[新性能] 系统升级文件写入权限查看校验[新性能] data-ajax-request默认为POST形式[新性能] 默认敞开性能监控日志[新性能] 渲染辅助函数[新性能] Grid 新增 Has 过滤器[新性能] UEditor反对本地视频插入[新性能] 系统升级文件写入权限查看校验[Bug修复] 模块卸载版本检测生效问题[Bug修复] 模块卸载版本检测生效问题[Bug修复] 头部菜单在特定比例下浮动异样模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download码云仓库:https://gitee.com/modstartGithub仓库:https://github.com/modstart开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

April 28, 2022 · 1 min · jiezi

关于vue.js:我不知道的Vuejs

1. v-if之key应用场景:在咱们登录的时候,用户能够应用用户账号以及用户电子邮箱进行登录,后盾接管账号及邮箱的参数都是同一个参数。 html局部 <template v-if="loginType"> <label>Username</label> <input ref="input" placeholder="Enter your username"> </template> <template v-else> <label>Email</label> <input ref="input" placeholder="Enter your email address"> </template> <button @click="chage">切换</button><div> <button @click="submit">提交</button></div> js局部 chage(){ let self = this; self.loginType = !self.loginType; }, submit(){ let self = this; alert(self.$refs.input.value) console.log(self.$refs.input.value); }这样,简略的业务就实现了。可是这样就会呈现一些待优化的问题(当咱们切换输入框时,之前输出的内容还保留着)产生这个问题的起因:Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。有时候这样也不总是符合实际需要,所以 Vue 为你提供了一种形式来表白“这两个元素是齐全独立的,不要复用它们”。只需增加一个具备惟一值的 key attribute 即可: <template v-if="loginType"> <label>Username</label> <input ref="input" placeholder="Enter your username" key="username"> </template> <template v-else> <label>Email</label> <input ref="input" placeholder="Enter your email address" key="email"> </template> <button @click="chage">切换</button> <div> <button @click="submit">提交</button> </div>2. 解析 DOM 模板之is有些 HTML 元素,诸如 <ul>、<ol>、<table> 和 <select>,对于哪些元素能够呈现在其外部是有严格限度的。而有些元素,诸如 <li>、<tr> 和 <option>,只能呈现在其它某些特定的元素外部。这会导致咱们应用这些有约束条件的元素时遇到一些问题。例如: ...

April 27, 2022 · 2 min · jiezi

关于vue.js:基于-Elementplus-Table-封装的易用-一致-友好的-Vue-Table-组件

基于 Element-plus Table 封装的易用, 统一, 敌对的 Vue Table 组件组件源码组件文档原文 Why用过 Element UI Table 的同学都晓得用 Table 组件时须要用到el-table-column,它是和 html 混写在一起的, 如果很多列的话,就须要一个个写配置, 否则就须要用到循环。如果列配置内容有依据不同条件展现不同款式内容的话, 就须要在插槽外面做判断, 比方这样两种编辑状态: 比方在插槽外面做配置, 如下代码: <el-table-column label="操作"> <template #default="scope"> <div v-if="scope.row._edit"> <el-button type="primary" @click="handleSave(scope)"> 保留 </el-button> <el-button @click="handleCancle(scope)"> 勾销 </el-button> </div> <el-button v-else type="primary" @click="handleEdit(scope)"> 编辑 </el-button> </template></el-table-column>以上这样代码也不算太简单。 然而如果咱们的需要是要切换两个 column 的程序, 比方: \那应该怎么实现呢, 大略思路就是抽离列配置成为一个 columns 数组, 用 v-for 遍历 columns, 而后在插槽外面做每一列的判断。 通過管制数组程序来调整列程序。大略代码思路如下: 残缺的在线 Demo <el-table-column v-for="column in columns" :prop="column.prop" :label="column.label"> <template #default="scope"> <div v-if="column.prop === 'name'"> <el-input v-if="scope.row._edit" v-model="scope.row[scope.column.property]" ></el-input> <span v-else>{{ scope.row[scope.column.property] }}</span> </div> <div v-if="column.prop === 'tag'"> <el-select v-if="scope.row._edit" v-model="scope.row[scope.column.property]" style="width: 120px" > <el-option v-for="option in tagOptions" :label="option.label" :value="option.value" ></el-option> </el-select> <el-tag v-else :type="scope.row.tag === '家' ? 'info' : 'success'"> {{ scope.row.tag }} </el-tag> </div> </template></el-table-column>JS 代码如下: ...

April 26, 2022 · 2 min · jiezi

关于vue.js:vue项目ip地址无法访问解决方案

1.开发环境 vue22.电脑系统 Windows11专业版3.在应用vue开发的过程中,咱们有时候须要应用手机来查看成果,然而咱们会发现无奈应用ip拜访,为什么呢?是因为Webpack中host固定为localhost,从而导致了本地IP不能拜访服务。4.解决方案如下: //把host:"localhost"改成 host:'0.0.0.0' 重新启动我的项目就能够了// host: 'localhost', host: '0.0.0.0',5.敞开专用网络的防火墙 第一步 第二步 6.本期的分享到了这里就完结啦,心愿对你有所帮忙。

April 26, 2022 · 1 min · jiezi

关于vue.js:Day-48100-Vue3-Ref和Reactive区别

(一)需要被问到,Ref和Reactive区别,不会。这里小结记录下。 (二)介绍1、共同点:都是用来创立响应式数据的;都能够创建对象类型的响应数据;2、不同点:(1)Ref次要用来创立根底数据类型的响应数据; <!-- 模板语法> <template> <div>{{state}}</div></template> //js 脚本setup(){ let state = ref(10) state.value = 11 return {state}}ref响应式原理是依赖于Object.defineProperty()的get()和set()实现的如果想创建对象类型(其实底层的实质还是reactive,零碎会主动依据咱们给ref传入的值转换成:{value:''}来实现 ref(1)->reactive({value:1})//ref函数只能操作浅层次的数据,把根本数据类型当作本人的属性值;深层次依赖于reactive(2)Reactive是用来创立援用类型的响应式数据的用法(参数必须是援用类型); <!-- 模板语法> <template> <div>{{state.name}}</div></template> //js 脚本setup(){ let state = reactive({name:'aaa'}}) state.name = 'zhangsan' return {state}}原理是是应用Proxy递归遍历对象实现的源码 参考链接https://juejin.cn/post/701332... 写在最初的话学习路上,经常会懈怠。 《有想学技术须要监督的同学嘛~》https://mp.weixin.qq.com/s/Fy... 如果有须要的搭档,能够加我微信:learningisconnecting或者能够关注我的公众号:国星聊成长(我会分享成长的办法)

April 24, 2022 · 1 min · jiezi

关于vue.js:vue自定义loading

1.开发环境 vue2.电脑系统 windows11专业版3.在开发的过程中,咱们在获取数据的时候常常会应用增加loading来让用户体验更好,上面我来分享一下。4.废话不多说,间接上代码: // template <transition name="fade"> <div class='g-loading-plan' v-if="isLoadingData"> <p class="loadingText">loading...</p> </div> </transition>// css款式如下.g-loading-plan { position: fixed; z-index: 1010; background-color: rgba(0, 0, 0, 0.6); top: 0; bottom: 0; left: 0; width: 100%; display: flex; justify-content: center; align-items: center; flex-flow: row nowrap; .loadingText { color: #fff; font-size: 24px; }}4-1.成果如下: 5.本期的分享到了这里就完结啦,心愿对你有帮忙,让咱们一起致力走向巅峰。

April 24, 2022 · 1 min · jiezi

关于vue.js:vue3x从打包部署到上线

一、前言作者采纳的我的项目架构:vue3.x + typescript + element-plus + axios,晓得这一点很重要,因为目前 vue3.x 和 element-plus 还在不断更新迭代中,可能前面又会有所变动,导致具体的解决方案也会跟着扭转。 具体版本: { "dependencies": { "axios": "^0.26.1", "element-plus": "^2.1.4", "moment": "^2.29.1", "qs": "^6.10.3", "socket.io-client": "^2.3.0", "vue": "^3.2.25", "vue-router": "^4.0.14", "vuex": "^4.0.2" }, "devDependencies": { "@types/node": "^17.0.22", "@types/qs": "^6.9.7", "@vitejs/plugin-vue": "^2.2.0", "eslint": "^8.11.0", "sass": "^1.49.10", "typescript": "^4.5.4", "unplugin-auto-import": "^0.6.6", "unplugin-vue-components": "^0.18.3", "vite": "^2.8.0", "vue-tsc": "^0.29.8" }}二、打包首次打包的话,还是惯例的先npm run build一下,看看是否顺利,如果顺利最好,当然依据作者的教训,必定会出些问题,这里就须要一一对应的解决了, 个别会遇到的问题如下: 1、TS申明援用问题/// <reference path="../node_modules/socket.io-client/dist/socket.io.js" /> TS环境下应用.js文件,须要在编译配置里增加allowJs才行,不然会报错,具体批改如下: 关上 tsconfig.json 增加如下配置: { "compilerOptions": { "allowJs": true }}2、vue3 Cannot find name 'ComponentSize'问题呈现这个问题次要是由element-plus引入的,具体解决形式如下: ...

April 24, 2022 · 1 min · jiezi

关于vue.js:vue2-中使用高徳地图amap

我的项目中须要加载地图, 抉择应用高徳地图(更易懂易用稳固些)1.首先须要在高徳地图官网申请一个开发者账号 失去一个key2.在vue2 的index.html 中加载高徳js库 //AMap <script src="https://webapi.amap.com/maps?v=1.4.8&key=caaa086bdf5666322fba3baf5a6a2c03&plugin=AMap.DistrictSearch"></script>// AMapUI<script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>3.在webpack.base.config.js 中内部库选项中引入 externals: { "AMap":"window.AMap", "AMapUI":"window.AMapUI", },4.后果是这样的 5.开始你的地图代码了 <!-- 地图 --> <div class="flex"> <div style="width:80%; height:450px;border:1px solid #dcdcdc" id="map_container"> <!-- 地图显示区 --> </div> <div style="width:20%" class="flex-column margin-left-10"> <div id="searchBar"> <input id="keyword" placeholder="请输出关键字" style="width:276px;height:30px;" /> </div> <div id="searchResults"> <!-- 后果搜寻区 --> </div> </div> </div>在mounted() 中初始化加载initMap async initMap(){ this.map = await new AMap.Map('map_container', { resizeEnable: true }) this.map.plugin(["AMap.ToolBar"],()=> { //设置位置标记为自定义标记 let toolBar = new AMap.ToolBar(); this.map.addControl(toolBar); }); //这是map上减少的图层 AMapUI.loadUI(['misc/PoiPicker'], (PoiPicker)=>{ this.poiPicker = new PoiPicker({ input: 'keyword', //搜寻关键词id placeSearchOptions: { map: this.map, pageSize: 5 }, searchResultsContainer: 'searchResults' //搜寻后果区 }) //地图上减少信息窗体 this.infoWindow = new AMap.InfoWindow({ isCustom:true, offset: new AMap.Pixel(0, -20), content: this.$refs.lbsInfoComponent.$el, //窗体内容,应用vue 组件 }) //选中搜寻后果事件 this.poiPicker.on('poiPicked', (poiResult) =>{ this.poiPicker.hideSearchResults() let source = poiResult.source let poi = poiResult.item let info = { source: source, id: poi.id, name: poi.name, location: poi.location.toString(), address: poi.address } this.infoWindow.setMap(this.map) this.infoWindow.setPosition(poi.location) this.$refs.lbsInfoComponent.initialize(info, this.lbsDistance) if (source !== 'search') { this.poiPicker.searchByKeyword(poi.name) } else { } }) }) //行政区划查问 let opts = { subdistrict: 1, //返回下一级行政区 showbiz:false //最初一级返回街道信息 } this.district = new AMap.DistrictSearch(opts) this.district.search('中国', (status, result)=>{ if(status=='complete'){ this.getData(result.districtList[0]) //加载省份 } }) },getData(data) { let bounds = data.boundaries if (bounds) { for (let bound of bounds) { let polygon = new AMap.Polygon({ map: this.map, strokeWeight: 1, strokeColor: '#CC66CC', fillColor: '#CCF3FF', fillOpacity: 0.5, path: bound }) this.polygons.push(polygon) } this.map.setFitView()//地图自适应 } let level = "" let curList = [] if(data.districtList){ for(let item of data.districtList){ level = item.level curList.push({name: item.name, center:item.center, adcode: item.adcode, cityCode: item.cityCode, level:item.level}) } } if(level === "province"){ this.provinces = curList } else if(level === "city"){ this.cities = curList } else if(level === "district"){ this.districts = curList } else if(level === "street"){ this.streets = curList } },

April 22, 2022 · 2 min · jiezi

关于vue.js:elementui中表单验证的三种方式

表单加上rules<el-form class="apply-form first-form" :model="formData" :rules="rule" ref="form"> <el-form-item label="姓名" prop="visitorName"> <el-input v-model="formData.visitorName" placeholder="请输出姓名" clearable></el-input> </el-form-item> <el-form-item label="身份证号" prop="cardCode"> <el-input v-model="formData.cardCode" :maxlength="18" placeholder="请输出身份证号" clearable></el-input> </el-form-item></el-form>对应的data()里边写rule{} data() { return { formData: { visitorName: '', cardType: 1, cardCode: '' }, rule: { visitorName: [ { required: true, message: '请输出姓名', trigger: 'blur' }, { min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur' }, { required: true, pattern: /^[\u4e00-\u9fa5_a-zA-Z0-9.·-]+$/, message: '姓名不反对特殊字符', trigger: 'blur' } ], cardCode: [ { required: true, message: '请输出身份证号', trigger: 'blur' }, { min: 15, max: 18, message: '请如实填写18位号码,以供学校保卫科核查', trigger: 'blur' }, { required: true, pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '请输出正确的身份证号码', trigger: 'blur' } ] } }}自定义校验规定: ...

April 22, 2022 · 2 min · jiezi

关于vue.js:element的table表格数据校验

当应用element的table时,后盾返回的状态是数字转态,咱们要把数字变成汉字下边三种解决形式:办法1:(直接判断值) <el-table :data="tableData" stripe style="width: 100%"> <el-table-column label="状态" align="center"> <template slot-scope="scope"> <span v-if="scope.row.type==1">启动</span> <span v-else-if="scope.row.type==2">暂停</span> <span v-else="scope.row.type==3">期待</span> </template> </el-table-column></el-table>办法2:(formatter属性测验) <el-table :data="tableData" stripe style="width: 100%"> <el-table-column label="状态" align="center" :formatter="formatter"> </el-table-column></el-table>//应用formatter(value){ let type=""; if(value==1){ type="启动" }else if(value==2){ type="暂停" }else if(value==3){ type="期待" } return type; },}办法3:(filters过滤器) <el-table :data="tableData" stripe style="width: 100%"> <el-table-column label="状态" align="center"> <template slot-scope="scope"> {{scope.row.type | types}} </template> </el-table-column></el-table>//应用filters:{ types(value){ let type=""; if(value==1){ type="启动" }else if(value==2){ type="暂停" }else if(value==3){ type="期待" } return type; }, }}

April 22, 2022 · 1 min · jiezi

关于vue.js:Vue-Nodejs-搭建文件上传管理后台

本文完整版《Vue + Node.js 搭建「文件上传」治理后盾》 本教程手把手率领大家搭建一套通过 Vue + Node.js 上传文件的后盾零碎,只有你追随本教程一步步走,肯定能很好的了解整个前后端上传文件的代码逻辑。前端咱们应用 Vue + Axios + Multipart 来搭建前端上传文件利用,后端咱们应用 Node.js + Express + Multer 来搭建后端上传文件解决利用。 当然,本教程还会教给大家如何写一个能够限度上传文件大小、有百分比进度条、可报错、可显示服务器上文件列表、可点击下载文件的前端操作界面。 最初实现的上传文件工具后盾如下图,追随本教学习,你也能够搭进去。 如果你对前端不是很相熟,不想写前端,举荐应用卡拉云搭建后盾管理系统,卡拉云是新一代低代码开发工具,不必懂任何前端技术,仅靠鼠标拖拽,即可疾速搭建包含「上传文件」在内的任何后盾管理工具。立刻试用卡拉云 1 分钟搭建「文件上传」工具。详情见本文文末。 Vue + Node.js「上传文件」前后端我的项目构造 Vue 前端局部 UploadFilesService.js:这个脚本调用通过 Axios 保留文件和获取文件的办法UploadFiles.vue:这个组件蕴含所有上传文件相干的信息和操作App.vue:把咱们的组件导入到 Vue 起始页index.html:用于导入 Bootstraphttp-common.js:配置并初始化 Axiosvue.config.js:配置 APP 端口Node.js 后端局部 resources/static/assets/uploads:用于存储上传的文件middleware/upload.js:初始化 Multer 引擎并定义中间件file.controller.js:配置 Rest APIroutes/index.js:路由,定义前端申请后端如何执行server.js:运行Node.js Express 利用✦ 前端局部 - 上传文件 Vue + Axios + Multipart配置 Vue 环境应用 npm 装置 Vue 脚手架 vue-cli npm install -g @vue/cli 而后咱们创立一个 Vue 我的项目 kalacloud-vue-multiple-files-upload ...

April 22, 2022 · 6 min · jiezi

关于vue.js:ToolJet-是什么怎么样-低代码开发平台测评

本文完整版:《ToolJet 是什么,怎么样? —— 低代码开发平台测评》 低代码开发平台曾经是程序员日常标配效率工具了,已经咱们拿到开发需要后,要先配 Vue & React 等框架环境、再选须要引入的第三方组件库,最初穿针引线,调试搭建起须要的后盾工具。这其中有数深坑等着咱们去趟,直到低代码工具呈现后,才解决这一开发窘境,让轮子本人把本人配置上。 本文介绍全球排名前 3 的顶级开源低代码开发平台 ToolJet,从多个方面测评,帮你全面理解。 ToolJet - 领有丰盛多样的可接入数据源及第三方工具调用 ToolJet 是什么?ToolJet 是一套开源的低代码开发平台框架,可疾速构建和部署企业外部工具,帮忙开发团队节俭大量开发工夫。开发者可应用 ToolJet 连贯多种常见的数据库(如 PostgreSQL、MongoDB、Elasticsearch 等)也能够间接接入 RESTful API,甚至能够间接调第三方工具(比方 Stripe、Slack、Google Sheets、Airtable 等),灵便的前端组件拖拽生成,无需懂任何前端技术。 ToolJet 怎么样?(1)ToolJet 可接入多种数据源、API及第三方工具 ToolJet 可接入三种数据源,数据库、API 及第三方工具,通过 JS 把后端调的数据与前端组件相映射,疾速搭建灵便的数据管理工具。 (2)ToolJet 拖拽生成前端组件 ToolJet 内置常见的前端组件,鼠标简略拖放即可生成。ToolJet 内置 30 多个组件,包含最重度应用的表格、图表、文本框及按钮等。齐全不须要开发者操心任何前端事物,甚至基本不懂前端的开发者也能够轻松上手。 (3)与你的团队共享开发 ToolJet 内置丰盛的权限治理,可间接通过邮件邀请你的团队退出开发。也可把曾经实现的 app 间接只读分享进来给业务团队间接应用。ToolJet 的权限零碎十分粗疏,不管你的权限设置需要如何简单,它都能轻松应答。 ToolJet 与卡拉云比照卡拉云是新一代低代码开发平台,与 ToolJet 开源低代码开发平台不同,卡拉云抉择走自研路线,无需本人入手装置部署,只需简略注册即可疾速开始应用。 卡拉云针对国内互联网利用场景进行了许多优化,不论是应用习惯上,还是利用场景上都更贴近国内用户。如集成了阿里、腾讯、华为等多家云存储、可轻松调用七牛云 API、Leancloud API、金数据、又拍云、企业微信、钉钉等常见的第三方利用接口,不便开发者间接应用。 下图为应用卡拉云搭建的外部广告投放监测零碎,仅需拖拽,1小时搞定。 卡拉云帮忙开发者解决所有非必要开发事物,免装置部署,开发者只需把精力聚焦在需要开发上,无需管任何琐事,甚至齐全能够不必懂前端,也能搭出丑陋的企业后盾管理工具。 卡拉云可一键接入包含 MySQL 在内的常见数据库及 API。可依据本人的工作流,定制开发。无需繁琐的前端开发,只须要简略拖拽即可生成所有常见的前端 UI 组件。简略易上手,配合详尽的开发文档,5分钟上手卡拉云。应用卡拉云疾速搭建企业外部工具,原来一周的开发工作量,可缩减至 1 小时,更多信息可拜访卡拉云官网。 扩大浏览: ...

April 22, 2022 · 1 min · jiezi

关于vue.js:vue-杂记①

created即通常初始化某些属性值,而后再渲染成视图 mounted在模板渲染成html后调用,通常是初始化页面实现后,再对html的dom节点进行一些操作。 <body> <div id="example1"> <demo1></demo1> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script> Vue.component("demo1",{ data:function(){ return { name:"", age:"", city:"" } }, template:"<ul><li id='name'>{{name}}</li><li>{{age}}</li><li>{{city}}</li></ul>", created:function(){ this.name="Eric" this.age = "20" this.city ="广州" var x = document.getElementById("name") // ①第一个命令台谬误 console.log(x.innerHTML); }, mounted:function(){ var x = document.getElementById("name") // ②第二个命令台正确 console.log(x.innerHTML); } }); var vm = new Vue({ el:"#example1", }) </script></body> ① 在created的时候,视图中的html还没有被渲染进去,所以此时如果间接去操作html的dom节点,肯定找不到相干的元素。② 而在mounted中,因为此时html曾经渲染进去了,所以能够间接操作dom节点,故输入了后果。

April 22, 2022 · 1 min · jiezi

关于vue.js:vue中使用elementresizedetector

1,装置 npm install element-resize-detector --save2.应用引入工具包在组件中应用或者在独自的js中应用 import resizeDetector from 'element-resize-detector'如图,当浏览器窗口发生变化时,但此时的echarts并不能执行自适应成果,这是因为切换菜单展现成果并没有触发window.onresize,所以为解决相似此问题,咱们可应用element-resize-detector 3.理论中的利用 const elementResizeDetectorMaker = require("element-resize-detector"); let erd = elementResizeDetectorMaker(); erd.listenTo(this.$refs.lineChart, () => { this.$nextTick(function () { const lineChart = this.$echarts.init(this.$refs.lineChart); //使echarts尺寸重置 lineChart.resize(); });});4.从元素中移除侦听器 RemoveListener(element,listener) 从元素中移除所有侦听器,但不齐全删除检测器。如果当前可能会增加侦听器,并且不心愿检测器再次初始化,请应用此函数 uninstall(element)最初如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 ! 收费获取源码地址:http://www.crmeb.com PHP学习手册:https://doc.crmeb.com 技术交换论坛:https://q.crmeb.com

April 22, 2022 · 1 min · jiezi

关于vue.js:vue3x路由404通配处理

vue-router3.x通配规定vue2.x对应的vue-router3.x的404路由通配形式: { path: '*', // 会匹配所有门路 name: '404', component: () => import('@/views/404/index.vue')}vue-router4.x通配规定下面的代码在vue3.x对应的vue-router4.x的路由通配中就没有成果了,须要改成这样才行: { path: '/:error*', // /:error -> 匹配 /, /one, /one/two, /one/two/three, 等 name: '404', component: () => import('@/views/404/index.vue')}匹配优先级有时候,同一个门路能够匹配多个路由,此时,匹配的优先级就依照路由的定义程序:路由定义得越早,优先级就越高。 [success] PS:404通配路由个别放到路由定义的最底部更多前端常识,请关注小程序,不定期有惊喜!

April 21, 2022 · 1 min · jiezi

关于vue.js:导入文件

April 20, 2022 · 0 min · jiezi

关于vue.js:vue3xtsvite2环境变量配置

在做我的项目环境变量配置前,能够先到官网回顾一下环境变量的根本应用,https://cn.vitejs.dev/guide/e... 一、环境模式首先环境变量是能够分模式的,罕用模式如下: .env # 所有状况下都会加载.env.local # 所有状况下都会加载,但会被 git 疏忽.env.[mode] # 只在指定模式下加载.env.[mode].local # 只在指定模式下加载,但会被 git 疏忽默认 dev 环境下应用 .env.development 环境变量配置,build 环境下应用 .env.production,所以不须要在 package.json 中再指定模式了 "scripts": { "dev": "vite --mode development", // --mode development能够省略,运行 npm run dev 主动指定 "build": "vue-tsc --noEmit && vite build --mode production", // --mode production能够省略,运行 npm run build 主动指定 "preview": "vite preview"},--mode 个别在其余非凡自定义下指定应用。 二、环境变量分类2.1 默认环境变量import.meta.env.MODE: {string} 利用运行的模式import.meta.env.BASE_URL: {string} 部署利用时的根本 URLimport.meta.env.PROD: {boolean} 利用是否运行在生产环境import.meta.env.DEV: {boolean} 利用是否运行在开发环境 (永远与 import.meta.env.PROD相同)2.2 利用级环境变量以 VITE_ 结尾,这样会被vite解决,如下: ...

April 20, 2022 · 1 min · jiezi

关于vue.js:路由拦截

router.beforeEach router.beforeEach((to: any, from: any, next: any) => { // console.log(to.path) // const token = to.query.token || '' // if (token !== '') { // localStorage.setItem('DingToken', token) // } const { permissions } = store.state console.log('permissions',permissions) if (permissions.length > 0) { const { meta } = to const index = permissions.findIndex((item: any) => { return item === meta.permissionsCode }) if (meta.permissionsCode && index !== -1) { next() return } else if (to.path !== '/default') { if (meta.noVerify) { next() } else { Message.error('无权限!') next('/') } } else if (to.path === '/default') { next() } } else { next() } return})

April 20, 2022 · 1 min · jiezi

关于vue.js:使用-Vue-TypeScript-时常用的装饰器

一、@Component 装璜器1)父组件2)子组件二、 @Emit 装璜器1)父组件2)子组件三、 @Model 装璜器1)父组件2)子组件四、 @Prop 装璜器1)父组件2)子组件五、 @Provide 装璜器 和 @Inject 装璜器1)父组件 @Provide2)子组件 @Inject六、 @Watch 装璜器————————————————版权申明:本文为CSDN博主「Upgrader」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/Upgrade...

April 20, 2022 · 1 min · jiezi

关于vue.js:vuexroutersync实例

1、装置npm i vuex-router-sync --save 2、应用import { sync } from 'vuex-router-sync'import store from './vuex/store'import router from './router'sync(store, router, {moduleName: 'RouteModule'})const app = new Vue({ router, store,}).$mount('#app');打印store.state即可看到以后路由状态 3、应用场景如果您想在一个组件中显示一条音讯,心愿在简直每一个页面上都显示“Have a nice day, Jack”,除了首页,因为首页要显示"Welcome back, Jack".借助vuex-router-sync,您能够轻松实现 const Top = { template: '<div>{{message}}</div>', computed: { message() { return this.$store.getters.getMessage; } },};const Bar = { template: '<div>{{message}}</div>', computed: { message() { return this.$store.getters.getMessage; } }};const routes = [{ path: '/top', component: Top, name: 'top' }, { path: '/bar', component: Bar, name: 'bar' },];const router = new VueRouter({ routes});const store = new Vuex.Store({ state: { username: 'Jack', phrases: ['Welcome back', 'Have a nice day'], }, getters: { getMessage(state) { return state.route.name === 'top' ? `${state.phrases[0]}, ${state.username}` : `${state.phrases[1]}, ${state.username}`; }, },});// sync store and router by using `vuex-router-sync`sync(store, router);const app = new Vue({ router, store,}).$mount('#app');不然的话,你可能须要在vue-router的钩子函数里监听,或在watch里$route,而后批改store值来实现。 ...

April 20, 2022 · 2 min · jiezi

关于vue.js:5-款最棒的-Vue-移动端-UI-组件库-特别针对国内使用场景推荐

本文完整版:《最棒的 Vue 挪动端 UI 组件库 - 特地针对国内应用场景举荐》 在 Vue 3 正式版公布一段时间后,各大组件库、框架纷纷对 Vue 3 做了反对和优化,特地是 Vue 挪动端组件库,有了跨越式的降级。几家头部大厂也全面拥抱 Vue 3 ,陆续公布了反对 Vue 3 的挪动端 UI 组件库,十分值得安利一波。本文筛选了国内罕用的 Vue 挪动端 UI 组件库,选出了 5 款来自国内互联网一线大厂或是商业化较好的企业 / 集体长期保护的收费挪动端 UI 库分享给大家。 Vant 3 - 有赞挪动 UI 组件库,反对 Vue 3 微信小程序,支付宝小程序Cube UI - 滴滴出行挪动端 UI 库,品质牢靠,标准规范,扩展性强VUX - 挪动端 UI 组件库,针对微信强势优化NUTUI 3.0 - 京东挪动端 UI 库,面向电商业务场景,反对 Vue3Vuetify 3 - 老牌 Vue UI ,基于谷歌的 Material Design 款式开发,反对 Vue3Vant 3 - 有赞挪动 UI 组件库,反对 Vue 3 微信小程序,支付宝小程序 ...

April 20, 2022 · 2 min · jiezi

关于vue.js:vue-cli2-升级vue-cli3-采坑记录

我的项目背景是一个三年前基于 element-admin 搞进去的我的项目,一开始都还挺好的,尽管启动我的项目慢了点,然而编译速度不慢,起初通过某一次需要之后,就开始编译速度很慢了,我的项目存在的问题启动速度慢编译速度慢 原我的项目依赖和文件目录文件目录 package.jsondependencies devDependencies 迁徙到cli3 之后,感觉还是不错的启动我的项目 编译速度 开始迁徙思路1: 构建一个vue cli新的我的项目,而后把依赖拷贝过来(后果做到一半搞不上来了,坑太多了,哈哈)思路2 因为当初这个我的项目是三年前我基于vue-admin-template这个我的项目来做的,我去官网看了下, 他当初降级到了vue cli3 的版本,我把他拷贝下来,而后做一下替换,应该比我的思路1,踩的坑少一点,感觉思路1也是能够做的,奈何懒得折腾,就走了捷径把迁徙步骤1. static 目录和index.html文件要拷贝到public文件夹下,static动态文件门路更改 2. 批改package.json依赖dependencies依赖比照 devDependencies依赖比照vue-template-compiler 要和vue 的版本一样,免得呈现什么诡异的问题, babel-eslint 要进行降级解决,不然会报错: TypeError: Cannot read property 'range' of null问题起因:https://segmentfault.com/a/11... 3. 替换eslint成原来我的项目的4. 批改上下文和代理文件,启动我的项目有一个正告,我的项目没有报错,开心 报错critical deependency: the request of a dependency is an expression问题起因:webpack import 动静加载组件的坑解决方案 改成require 的形式就好了改成require 的形式就好了 const load = view => () => import(@/views/callManage/${view}) 变成 const load = (view) => (resolve) => require([@/views/callManage${view}], resolve)批改publicPath,如果部署的环境是多我的项目的话,就须要 因为当初的架构是把node-saas 迁徙成dart-saas,所以要解决一些语法不兼容的问题,其实就是一个语法不兼容,还是很容易解决的,全局替换一下咯官网阐明 Module parse failed: Unexpected token问题形容,报错,说element ui 的包有问题,一脸懵逼,github走一波报错信息 ...

April 19, 2022 · 1 min · jiezi

关于vue.js:Vue3-优雅实现-useMap

前言Vue3 中咱们经常须要用到很多 hook 工具库。 这章介绍如何优雅的实现 useMap ,开启高逼格之路。 欢送大家应用体验高质量 vue3-hooks-plus 完满反对 ts 。 体验地址 实现原理Map 对象大家肯定都不生疏,那么咱们在 Vue3 中如何很优雅的应用它呢? 1、首先,它得必须具备 Map 的 可传入初始值增删查改重置清空 响应式2、既然用了 Vue3 当然要具备响应式啦!  const initialMap = initialValue ? new Map(initialValue) : new Map()  const state = ref(initialMap) as Ref<Map<K, T>>如果有初始值贼赋值初始值,否则给予空 Map。这里就有小伙伴问了,K 和 T 是啥玩意? 当然是反对 ts 了,还不会ts的小伙伴连忙安顿,这样应用vue3能力得心应手。 3、 书写 ts 类型文件 type MapValue<K, T> = Iterable<readonly [K, T]>type Actions<K, T> = { set: (key: K, value: T) => void get: (key: K) => T | undefined remove: (key: K) => void has: (key: K) => boolean clear: () => void setAll: (newMap: MapValue<K, T>) => void reset: () => void}这里的 MapValue 初始值采纳了内置 的 ES6 类型 Iterable ,并且初始值咱们心愿它是只可读的。K 和 T 别离代表 Map 的 键和值。 ...

April 19, 2022 · 2 min · jiezi

关于vue.js:将eldatepicker从开始时间后限制可选范围为6个月

之前看了很多文章都是限度一个月的<template> <div class="data-picker"> <el-date-picker type="datetimerange" v-model="serchTimes" placeholder="请抉择创立工夫" clearable size="mini" style="width: 320px" range-separator="至" start-placeholder="抉择开始工夫" end-placeholder="抉择完结工夫" :picker-options="pickerOptions" @change="changeTime" :editable="false"/></div></template><script>//这里是引入解决工夫的办法import {formatDate} from '../../utils/date'; export default { data() { return { // 设定工夫选择器的范畴 这步是要害 pickerOptions: { //首先是抉择出开始工夫,依据开始工夫给出可选的六个月工夫范畴 onPick: ({maxDate, minDate}) => { this.selectData = minDate.getTime(); if (maxDate) { // 解除限制 this.selectData = ''; } }, disabledDate:(time) => { if(!this.isNull(this.selectData)) { const curDate = this.selectData; const three = 180 * 24 * 3600 * 1000;// 6个月 const threeMonths = curDate + three; // 开始工夫+6个月 return time.getTime() < curDate || time.getTime() > threeMonths; } } }, createStartDate:'', createEndDate:'', serchTimes:null, selectData:'',};}, methods: { ...

April 19, 2022 · 1 min · jiezi

关于vue.js:Vue中vslot插槽详解

筹备工作 搭建vite装置Windi CSS 或者 Tailwind 不应用插槽<!--App.vue 父组件--><template> <div class="container flex flex-row justify-center"> <!--将title和listData数据传给子组件,上面展现了两种应用组件形式--> <Category title="动漫" :listData="cartoons"></Category> <Category title="游戏" :listData="games"/> <Category title="电影" :listData="films"/> </div></template><script>import Category from './components/category.vue'export default { name: 'App', components: { Category }, data(){ return{ cartoons:['海贼王','名侦探柯南','一人之下','未闻花名'], games:['4399','斗地主','王者光荣','战争精英'], films:['《你好,李焕英》','《夏洛特搅扰》','《你的名字》','《蜘蛛侠》'] } }}</script><style scoped>.footer a { @apply ml-10;}.container { background-image: url(https://cdn.jsdelivr.net/gh/ashunun/netbian/bian/1.jpg); @apply h-200 bg-auto bg-cover bg-contain;}</style><!-- category 组件子--><template> <div> <h3>{{ title }}分类</h3> <ul> <li v-for="(item,index) in listData" :key="index">{{item}}</li> </ul> </div></template><script>export default { name:'Category', //props接管传过来的数据 props:['listData','title']}</script><style scoped>div{ @apply bg-yellow-200 m-5 w-60 h-100 rounded-lg shadow-lg shadow-yellow-700/50;}h3{ @apply text-center bg-yellow-600 text-xl;}</style>默认插槽<!--App.vue 父组件--><template> <div class="container flex flex-row justify-center"> <!--将title和listData数据传给子组件,上面展现了两种应用组件形式--> <Category title="动漫" :listData="cartoons"> <img class="w-60" src="https://img2.baidu.com/it/u=4117582627,679171248&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500" alt=""> </Category> <Category title="游戏" > <ul> <li v-for="(g,index) in games" :key="index">{{g}}</li> </ul> </Category> <Category title="电影"> <video class="w-60" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video> </Category> </div></template><script>import Category from './components/category.vue'export default { name: 'App', components: { Category }, data(){ return{ cartoons:['海贼王','名侦探柯南','一人之下','未闻花名'], games:['4399','斗地主','王者光荣','战争精英'], films:['《你好,李焕英》','《夏洛特搅扰》','《你的名字》','《蜘蛛侠》'] } }}</script><style scoped>.footer a { @apply ml-10;}.container { background-image: url(https://cdn.jsdelivr.net/gh/ashunun/netbian/bian/1.jpg); @apply h-200 bg-auto bg-cover bg-contain;}</style><!-- category 组件子--><template> <div> <h3>{{ title }}分类</h3> <!-- 定义一个插槽,等着组件的使用者(<Category>填充内容</Category>)进行填充 --> <slot>这里能够填写默认值,当组件使用者没有进行填充时,会显示</slot> </div></template><script>export default { name:'Category', //props接管传过来的数据 props:['listData','title']}</script><style scoped>div{ @apply bg-yellow-200 m-5 w-60 h-100 rounded-lg shadow-lg shadow-yellow-700/50;}h3{ @apply text-center bg-yellow-600 text-xl;}</style>具名插槽<!--App.vue 父组件--><template> <div class="container flex flex-row justify-center"> <!--将title和listData数据传给子组件,上面展现了两种应用组件形式--> <Category title="动漫" :listData="cartoons"> <!--应用具名插槽,须要用template标签包裹着,并应用v-slot:name --> <template v-slot:center> <img class="w-60" src="https://img2.baidu.com/it/u=4117582627,679171248&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500" alt=""> </template> <template v-slot:foot> <a href="https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%B6%AF%C2%FE%CD%BC%C6%AC&fr=ala&ala=1&alatpl=normal&pos=0">更多照片</a> </template> </Category> <Category title="游戏" > <template v-slot:center> <ul> <li v-for="(g,index) in games" :key="index">{{g}}</li> </ul> </template> <template v-slot:foot> <div class="footer"> <a href="https://www.csdn.net/">手机游戏</a> <a href="https://www.csdn.net/">电脑游戏</a> </div> </template> </Category> <Category title="电影"> <template v-slot:center> <video class="w-60" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video> </template> <template v-slot:foot> <div class="footer"> <a href="https://www.csdn.net/">经典</a> <a href="https://www.csdn.net/">热门</a> <a href="https://www.csdn.net/">举荐</a> </div> </template> </Category> </div></template><script>import Category from './components/category.vue'export default { name: 'App', components: { Category }, data(){ return{ //cartoons:['海贼王','名侦探柯南','一人之下','未闻花名'], games:['4399','斗地主','王者光荣','战争精英'], //films:['《你好,李焕英》','《夏洛特搅扰》','《你的名字》','《蜘蛛侠》'] } }}</script><style scoped>.footer a { @apply ml-10;}.container { background-image: url(https://cdn.jsdelivr.net/gh/ashunun/netbian/bian/1.jpg); @apply h-200 bg-auto bg-cover bg-contain;}</style><!-- category 组件子--><template> <div> <h3>{{ title }}分类</h3> <!-- 定义一个插槽,等着组件的使用者(<Category>填充内容</Category>)进行填充 --> <slot name="center">这里能够填写默认值,当组件使用者没有进行填充时,center会显示</slot> <slot name="foot">这里能够填写默认值,当组件使用者没有进行填充时,foot会显示</slot> </div></template><script>export default { name:'Category', //props接管传过来的数据 props:['listData','title']}</script><style scoped>div{ @apply bg-yellow-200 m-5 w-60 h-100 rounded-lg shadow-lg shadow-yellow-700/50;}h3{ @apply text-center bg-yellow-600 text-xl;}</style>作用域插槽<!--App.vue 父组件--><template> <div class="container flex flex-row justify-center"> <!--将title和listData数据传给子组件,上面展现了两种应用组件形式--> <Category title="动漫" :listData="cartoons"> <!--应用具名插槽,须要用template标签包裹着,并应用v-slot:name --> <template v-slot:default="obj"> <ul> <li v-for="(g, index) in obj.cartoons" :key="index">{{ g }}</li> </ul> </template> </Category> <Category title="游戏"> <!-- 默认插槽的 slot 简便写法 --> <template v-slot="obj"> <ol> <li v-for="(g, index) in obj.games" :key="index">{{ g }}</li> </ol> <ul> <li v-for="(g, index) in obj.msg" :key="index">插槽{{ g }}</li> </ul> </template> </Category> <Category title="电影"> <!-- 解构插槽 --> <template v-slot="{ films, msg }"> <div> <h4 v-for="(g, index) in films" :key="index">{{ g }}</h4> <h3 v-for="(g, index) in msg" :key="index">插槽{{ g }}</h3> </div> </template> </Category> </div></template><script>import Category from './components/category.vue'export default { name: 'App', components: { Category }, data(){ return{ //cartoons:['海贼王','名侦探柯南','一人之下','未闻花名'], //games:['4399','斗地主','王者光荣','战争精英'], //films:['《你好,李焕英》','《夏洛特搅扰》','《你的名字》','《蜘蛛侠》'] } }}</script><style scoped>.footer a { @apply ml-10;}.container { background-image: url(https://cdn.jsdelivr.net/gh/ashunun/netbian/bian/1.jpg); @apply h-200 bg-auto bg-cover bg-contain;}</style><!-- category 组件子--><template> <div> <h3>{{ title }}分类</h3> <!-- 定义一个插槽,等着组件的使用者(<Category>填充内容</Category>)进行填充 --> <slot :cartoons="cartoons">默认插槽</slot> <slot :games="games">默认插槽</slot> <slot :films="films">默认插槽</slot> <slot :msg="msg"></slot> </div></template><script>export default { name:'Category', //props接管传过来的数据 props: ["listData", "title"], data(){ return{ cartoons: ["海贼王", "名侦探柯南", "一人之下", "未闻花名"], games: ["4399", "斗地主", "王者光荣", "战争精英"], films: [ "《你好,李焕英》", "《夏洛特搅扰》", "《你的名字》", "《蜘蛛侠》", ], msg: [",作用域", "芭比"], } }}</script><style scoped>div{ @apply bg-yellow-200 m-5 w-60 h-100 rounded-lg shadow-lg shadow-yellow-700/50;}h3{ @apply text-center bg-yellow-600 text-xl;}</style>动静插槽名<!--App.vue 父组件--><template> <div class="container flex flex-col justify-center items-center"> <Category title="游戏"> <!-- v-slot: 缩写法 # --> <template #[dynamicSlotName]="obj"> <ol> <li v-for="(g, index) in obj.games" :key="index">{{ g }}</li> </ol> </template> </Category> <button @click="change">点这切换</button> </div></template><script>import Category from "./components/category.vue";export default { name: "App", components: { Category, }, data() { return { dynamicSlotName: "1", }; }, methods: { change() { if (this.dynamicSlotName == "1") { this.dynamicSlotName = "2"; } else this.dynamicSlotName = "1"; }, },};</script><style scoped>.footer a { @apply ml-10;}.container { background-image: url(https://cdn.jsdelivr.net/gh/ashunun/netbian/bian/1.jpg); @apply h-200 bg-auto bg-cover bg-contain;}button { @apply rounded-lg p-2 w-30 cursor-pointer bg-gradient-to-r from-violet-500 to-fuchsia-500 hover:from-violet-700 text-white shadow-lg shadow-indigo-700/80 text-center; border: none;}</style><!-- category 组件子--><template> <div> <h3>{{ title }}分类</h3> <!-- 具名+作用域 插槽 --> <!--两个插槽,传递的数据不一样。--> <slot name="1" :games="games1"></slot> <slot name="2" :games="games2"></slot> </div></template><script>export default { name:'Category', //props接管传过来的数据 props: ["listData", "title"], data(){ return{ games1:['4399','斗地主','王者光荣','战争精英'], games2:['我的世界','cf','LOL','cs'] } }}</script><style scoped>div{ @apply bg-yellow-200 m-5 w-60 h-100 rounded-lg shadow-lg shadow-yellow-700/50;}h3{ @apply text-center bg-yellow-600 text-xl;}</style>和具名插槽的缩写跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #<template #center></template>残缺代码代码 ...

April 19, 2022 · 4 min · jiezi

关于vue.js:petitevue源码剖析逐行解读vuereactivity之effect

当咱们通过effect将副函数向响应上下文注册后,副作用函数内拜访响应式对象时即会主动收集依赖,并在相应的响应式属性发生变化后,主动触发副作用函数的执行。 // ./effect.tsexport funciton effect<T = any>( fn: () => T, options?: ReactiveEffectOptions): ReactiveEffectRunner { if ((fn as ReactiveEffectRunner).effect) { fn = (fn as ReactiveEffectRunner).effect.fn } const _effect = new ReactiveEffect(fn) if (options) { extend(_effect, options) if (options.scope) recordEffectScope(_effect, options.scope) } // 默认是马上执行副作用函数收集依赖,但可通过lazy属性提早副作用函数的执行,提早依赖收集。 if (!options || !options.lazy) { _effect.run() } // 类型为ReactiveEffectRunner的runner是一个绑定this的函数 const runner = _effect.run.bind(_effect) as ReactiveEffectRunner runner.effect = _effect return runner}effect函数的代码非常少,次要流程是 将基于副作用函数构建ReactiveEffect对象若为默认模式则马上调用ReactiveEffect对象的run办法执行副作用函数。不过这里咱们有几个疑难 ReactiveEffectRunner是什么?ReactiveEffect生成的对象到底是什么?显然ReactiveEffect的run办法才是梦开始的中央,到底它做了些什么?针对配置项scope,recordEffectScope的作用?ReactiveEffectRunner是什么?// ./effect.ts// ReactiveEffectRunner是一个函数,而且有一个名为effect的属性且其类型为RectiveEffectexport interface ReactiveEffectRunner<T = any> { (): T effect: ReactiveEffect}ReactiveEffect生成的对象到底是什么?// 用于记录位于响应上下文中的effect嵌套档次数let effectTrackDepth = 0// 二进制位,每一位用于标识以后effect嵌套层级的依赖收集的启用状态export left trackOpBit = 1// 示意最大标记的位数const maxMarkerBits = 30const effectStack: ReactiveEffect[] = []let activeEffect: ReactiveEffect | undefinedexport class ReactiveEffect<T = any> { // 用于标识副作用函数是否位于响应式上下文中被执行 active = true // 副作用函数持有它所在的所有依赖汇合的援用,用于从这些依赖汇合删除本身 deps: Dep[] = [] // 默认为false,而true示意若副作用函数体内遇到`foo.bar += 1`则有限递归执行本身,直到爆栈 allowRecurse?: boolean constructor( public fn: () => T, public scheduler: EffectScheduler | null = null, scope?: EffectScope | null ) { recordEffectScope(this, scope) } run() { /** * 若以后ReactiveEffect对象脱离响应式上下文,那么其对应的副作用函数被执行时不会再收集依赖,并且其外部拜访的响应式对象发生变化时,也会主动触发该副作用函数的执行 */ if (!this.active) { return this.fn() } // 若参加响应式上下文则须要先压栈 if (!effectStack.includes(this)) { try { // 压栈的同时必须将以后ReactiveEffect对象设置为沉闷,即程序栈中以后栈帧的意义。 effectStack.push(activeEffect = this) enableTracking() trackOpBit = 1 << ++effectTrackDepth if (effectTrackDepth <= maxMarkerBits) { // 标记已跟踪过的依赖 initDepMarkers(this) } else { cleanupEffect(this) } return this.fn() } finally { if (effectTrackDepth <= maxMarkerBits) { /** * 用于对已经跟踪过,但本次副作用函数执行时没有跟踪的依赖,采取删除操作。 * 即,新跟踪的 和 本轮跟踪过的都会被保留。 */ finalizeDepMarkers(this) } trackOpBit = 1 << --effectTrackDepth resetTracking() // 最初当然弹栈,把控制权交还给上一个栈帧咯 effectStack.pop() const n = effectStack.length activeEffect = n > 0 ? effectStack[n - 1] : undefined } } /** * 让以后ReactiveEffect对象脱离响应式上下文,请记住这是一去不回头的操作哦! */ stop() { if (this.active) { cleanupEffect(this) this.active = false } } }}为应答嵌套effect外部将以后位于响应上下文的ReactiveEffect对象压入栈构造effectStack: ReactiveEffect[],当以后副作用函数执行后再弹出栈。另外,尽管咱们通过effect函数将副作用函数注册到响应上下文中,但咱们仍能通过调用stop办法让其脱离响应上下文。 ...

April 19, 2022 · 6 min · jiezi

关于vue.js:组件传值之子传父

问题1,为什么应用$emit触发函数因为子组件不能间接批改父组件的数据 问题2,子传父的思路过程通过在父组件中定义一个自定义事件绑定在父组件定义的一个函数办法,通过在子组件应用this.$emit办法触发在父组件的函数办法并传值到父组件 父组件页面<template> <div> <!-- 子组件在父组件中注册应用 --> <!-- @fn='add'(自定义事件绑定一个函数办法) --> <MyComp2Child :num='num' @fn='add'></MyComp2Child> </div></template><script>methods:{ // val是接管子组件传过来的数据 add(val){ this.num+=val }</script>子传父页面methods:{ // 通过this.$emit('事件名',函数传参给父组件)add(){ this.$emit('fn',5)} }

April 18, 2022 · 1 min · jiezi

关于vue.js:Vuejs-3x-双向绑定原理

什么是双向绑定?废话不多说,咱们先来看一个 v-model 根本的示例: <input type="text" v-model="search">首先,咱们要明确一点的是:v-model 的实质是指令。因而,它跟咱们个别的自定义指令是一样的,须要实现 Vue.js 生命周期的钩子函数。 其次,v-model 实现了双向绑定,也就是:数据到 DOM 的单向流动、DOM 到数据的单向流动。 明确了下面这两点,再来看代码就清晰多了。 // packages/runtime-dom/src/directives/vModel.tsexport const vModelText: ModelDirective< HTMLInputElement | HTMLTextAreaElement> = { created() {}, mounted() {}, beforeUpdate() {}}关上 v-model 的源码咱们能够看到,它实现了对应的 Vue.js 生命周期钩子函数,实际上它就是一个内置的自定义指令。 那么,v-model 如何实现双向绑定的呢?具体来说,数据到 DOM 的单向流动以及DOM 到数据的单向流动是如何实现的。 数据到 DOM 的单向流动// packages/runtime-dom/src/directives/vModel.tsexport const vModelText: ModelDirective< HTMLInputElement | HTMLTextAreaElement> = { // set value on mounted so it's after min/max for type="range" mounted(el, { value }) { el.value = value == null ? '' : value }}数据到 DOM 的单向流动实现非常简单,一行代码就搞定了,就是把 v-model 绑定的值赋值给 el.value。 ...

April 18, 2022 · 3 min · jiezi

关于vue.js:移动端日历组件设计与实现

前言在大多数的客户端利用中,日期的抉择与操作是一个常见的性能,应用日历组件实现对于这一性能的实现,往往是一个高效的解决方案。对于日历组件的设计与开发,在常见的开源我的项目中,通常有两种设计思路: 横向切换展现,默认渲染单个月份,通过按钮或左右滑动,进行月份切换;纵向切换展现,默认渲染展现多个月份,高低滑动进行月份切换;例如增加 picker 进行视图切换,增加自定义按钮,日期单选/多选,自定义文案,日期范畴限度等等性能,这些根本都是在两种思路的根底上进行的性能扩大。 在日常的利用中,两种形式各有优劣: 横向切换,初始渲染的节点更少,渲染性能更加优异;纵向切换,有更加直观的视觉感触,更良好的交互操作;然而,鱼和熊掌不可兼得,交互体验与性能上的取舍,是一个始终都要直面的问题。随着挪动端设施的一直倒退,挪动端浏览器一直的欠缺,用户设施在兼容性与运行效率上都有显著晋升,因而,本文次要论述的,是以竖向切换形式实现的 NutUI Calendar 日历组件。 主题介绍明天的主题是 NutUI Calendar 组件的设计与实现,Calendar 组件是 NutUI 的一个日历组件,它用认为用户提供一个直观的日期抉择形式,以滑动的形式切换月份,反对单个日期与日期范畴的抉择,反对自定义日期内容等性能。明天,让咱们一起来看看,在组件的开发过程中,是如何一步步实现组件性能的。 组件设计思路日历组件,不论以何种形式设计交互,日期工夫数据的解决都是必不可少的,毕竟视图也是为数据信息服务的。在本文中采取的竖向切换展现的形式,也意味着咱们要在节点的渲染性能上做一些优化调整。所以咱们的实现思路次要有以下几点: 日期数据处理,一次性初始化原始数据,在可视区域内,分段渲染节点元素。利用虚构列表的形式,缩小节点元素的渲染开销滚动事件与边界条件的解决功能完善,丰盛 Slots,Props,Events 事件等,晋升扩展性组件的实现原理基本参数需要在解决日期数据时,咱们须要先明确咱们所需的根本工夫入参,例如:日历组件的可选工夫范畴,以后选中的工夫。通过对传入参数的解析解决,失去咱们所需的数据内容,在之后的开发过程中,实现组件内容的渲染与事件处理。 这里我画了一张图不便大家更好了解: 原始日期数据:是咱们依据日期范畴计算的原始数据以后选中日期:可视范畴的展现以后月份,须要判断选中日期是否在日期范畴内展现范畴区间:依据以后选中日期解决得出,为以后须要渲染的数据范畴容器尺寸信息:用以计算日期滚动切换时的位移信息日期数据处理日期数据的计算,须要有多个处理过程。首先,咱们须要先计算传入的日期范畴是否存在,如果不存在,默认应用最近一年的工夫范畴。之后计算存在多少个月。在依据月的数量去遍历生成日期数据。 在计算单个月日期时,每个月的第一天与最初一天的星期数是不同的,咱们须要依据不同的星期数,以前一个月与后一个月的日期进行补全。这样既能够省去计算 1 号开始地位偏移量,也能够为性能扩大做出铺垫。 // 获取单个月的日期与状态const getDaysStatus = (currMonthDays: number, dateInfo: any) => { let { year, month } = dateInfo; return Array.from(Array(currMonthDays), (v, k) => { return { day: k + 1, type: "curr", year, month, }; }); // 获取上一个月的最初一周天数,填充当月空白 const getPreDaysStatus = ( preCurrMonthDays: number weekNum: number, dateInfo: any, ) => { let { year, month } = dateInfo; if ( weekNum >= 7) { weekNum -= 7; } let months = Array.from(Array(preCurrMonthDays), (v, k) => { return { day: k + 1, type: "prev", year, month, }; }); return months.slice(preCurrMonthDays - weekNum); };};解决后的数据如下: ...

April 18, 2022 · 3 min · jiezi

关于vue.js:Vue响应式原理

首先理解vue三个外围类 observer:给对象的属性增加getter和setter,用于依赖收集和派发更新;Dep:用于收集响应式对象发的依赖关系,每个响应式对象都有一个dep实例,dep.subs=watcher[].当数据产生扭转时候,会通过dep.notify(),告诉各个watcher;watcher:观察者对象,render,watcher,computer watcher ,user watcher; 依赖收集:(1)initstate,对Computed属性初始化时,会触发computed watcher,依赖关系收集; (2)initState,对监听属性初始化的时候,触发的User watcher 依赖关系收集; (3)render,触发render watcher 依赖关系收集 派发更新:object.defineProperty (1)组件中响应式的数据进行批改,会触发setter逻辑 (2)dep.notify() (3)遍历所有的subs,调用每一个watcher的update办法 总结: 当创立vue实例时,vue会遍历data里的属性,object.defineproperty为属性增加getter和setter对数据的读取进行劫持。 观察者-订阅者(数据劫持):vueObserver 数据监听器,把一个一般的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并应用Object.defineProperty()办法把这些属性全副转成setter、getter办法。当data中的某个属性被拜访时,则会调用getter办法,当data中的属性被扭转时,则会调用setter办法。Compile指令解析器,它的作用对每个元素节点的指令进行解析,替换模板数据,并绑定对应的更新函数,初始化相应的订阅。Watcher 订阅者,作为连贯 Observer 和 Compile 的桥梁,可能订阅并收到每个属性变动的告诉,执行指令绑定的相应回调函数。Dep 音讯订阅器,外部保护了一个数组,用来收集订阅者(Watcher),数据变动触发notify 函数,再调用订阅者的 update 办法。执行流程如下: 作者:web_afei链接:https://www.jianshu.com/p/eb7...起源:简书著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

April 17, 2022 · 1 min · jiezi

关于vue.js:Vuex路由独享守卫实现根据条件重定向

如何在进入某页面之前通过条件判断是否跳转至其它页面,当时把条件标识存储在vuex中,后在router中通过路由守卫管制页面跳转,上面来看一下具体实现: vuex(省略局部代码): state:{ platformVer:"" //平台版本 }, mutations: { setPlatformVer(state, platformVer) { state.platformVer = platformVer; //更新state值 }, } actions: { setPlatformVer(state) { axios.get({ params: { code: "AuthorityPlatformVersion", //获取权限平台标识版本 data: {} } //参数 }) .then(res => { state.commit("setPlatformVer", res); }); } }vuex在action中通过setPlatformVer调用接口拿到数据后commit setPlatformVer数据到vuex中。 在页面登录后或初始加载页面时触发Vuex Action的setPlatformVer: this.$store.dispatch("setPlatformVer");router路由表: { path: "MenuManagementOld", meta: { title: "菜单治理old" }, component: resolve => require(["@/views/system/MenuManagementOld"], resolve) }, { path: "MenuManagement", meta: { title: "菜单治理" }, component: resolve => require(["@/views/system/MenuManagement"], resolve), beforeEnter: (to, from, next) => { if (store.state.platformVer == "2") { //2是老版本 跳转到老平台页面 next("/system/MenuManagementOld"); } next(); //否则持续跳转默认页面MenuManagement } },beforeEnter当进入此路由时判断,如为老版本跳到其它页面。 ...

April 16, 2022 · 1 min · jiezi

关于vue.js:g2-报错cannot-read-properties-of-null-reading-appendchild

vue + g2 在 new chart 时报错:cannot read properties of null (reading 'appendchild')" 这个问题起因是因为id为c11的div标签不存在导致的,在g2画图之前,div并未渲染 能够在画图之前用 document.getElementById 获取一下 DOM,打印进去为 null 解决办法:一、应用 this.$nextTick 办法 this.$nextTick( () => { //new chart })二、应用 setTimeout 办法 setTimeout(() => { //new chart})三、在 new chart 之前用 js 增加一个 DOM let div = document.createElement("div"); //创立 div 标签 div.id = 'pillarBox'; //设置 div 的 id属性 div.style.width = '94%'; //设置 div 的 css 款式 div.style.margin = '50px 20px 0 20px'; //设置 div 的 css 款式 let parent = document.getElementsByClassName('echart-content'); //获取父节点 parent[0].appendChild(div); //增加到父节点 if (document.getElementById('pillarBox')) { //判断是否存在容器节点 _this.pillar = new G2.Chart({ //初始化一个柱状图 container: 'pillarBox', autoFit: true, height: 400, }); }

April 15, 2022 · 1 min · jiezi

关于vue.js:Animatecss动画库使用

这篇文章是为了记录Animate.css动画库的应用办法和步骤Animate.css是一个很牛逼的动画库,能够依赖于这个库应用很炫酷的动画成果。这是Animate.css的官网(https://animate.style/) Tips:首次加载可能会比拟迟缓 第一步:装置Animate.css库首先咱们须要装置Animate.css,在控制台输出 npm install animate.css第二步:引入Animate.css库在须要应用的文件中输出 import "animate.css"第三步:应用Animate.css库在须要应用的元素节点中配置“animate__animated animate__bounce”,而后在官网找到心仪的动画,复制名称增加进指标元素节点对应的动画class属性即可,在vue中的transition标签中展现动画属性名“enter-active-class”,暗藏动画属性名为“leave-active-class”,此处以vue代码为例: <transition appear name="animate__animated animate__bounce" enter-active-class="animate__rubberBand" leave-active-class="animate__bounceOut" > <h1 class="H1css" v-show="transitionShow"> 过渡动画条子~~~~~~~~~~~~~~~~~ </h1> </transition> <button @click="transitionShow = !transitionShow">显示/暗藏</button>

April 13, 2022 · 1 min · jiezi

关于vue.js:这个API-Hub厉害了收录了钉钉企业微信等开放Api还能直接调试

01此前时不时会有一些研发小伙伴和我诉苦,说很多企业因为人力财力限度或者需要不强,会间接购买应用第三方的凋谢API,这样一来, 一则因为凋谢我的项目不是量身定制的,寻找本人适合的接口也要搜寻调研蛮多工夫。 二则这种单干形式下 API提供者通常只会提供调用权限和一份接口文档,研发童鞋调试的时候只能手动一个个把接口数据复制到调试工具,费时费力。 综合上述两大痛点,我给大家举荐的解决方案是的一个叫API Hub的我的项目。 GitHub 下面也有相似于public APIs等收录了凋谢API ,但只做了数据收录的工作,接口调试工具则只提供了调试性能,两者兼而有之的很少。 而API Hub的变革之处在于它不仅汇总整顿了热门的凋谢 API 接口,更重要的是还提供了一系列调试、mock,测试等性能,开发者间接在API Hub下面比对抉择适合的API,接着间接在API Hub中发动调试,整个流程零打碎敲,省时省力。 因而这个API Hub创意不赖,值得花点篇幅介绍给大家。 02API Hub是国产API管理工具Apifox外面绝对独立的模块。 Apifox 反对API文档治理,API 调试,API Mock,API 自动化测试,是一个后端,前端,测试都能用的一站式接口治理平台,因而它官网上写的slogan就是 Apifox=Swagger+Postman+Mock+Jmeter。 而API Hub 收录了国内各大厂商热门的API 凋谢我的项目,如企业微信API,快手凋谢API,抖音凋谢API,目前还在继续收录中;另一方面它依靠于Apifox,能提供对凋谢api 进行调试、mock等性能。 对于想要接入凋谢我的项目的开发者来说,便当是肉眼可见的: 针对特定的需要,开发者可疾速在API Hub中搜寻到相似性能的api我的项目,进行比对,筛选出最匹配本人我的项目和需要的API,进步筛选效率开发者能够间接在API Hub中发动调试API Hub中接口和文档是一体的,能够间接查看接口形容和性能API Hub中的凋谢我的项目还能够毋庸配置进行mock,满足异样场景调试的需要。上面我给大家开展讲讲要怎么用。 03绝大多数的凋谢我的项目都须要你先申请调用权限,有些凋谢API能够间接在官网上依照它的提醒申请,取得apikey、client_secret等值;有些则须要企业走购买流程,对于想要练手的能够找前者,对于企业开发者后者能够交给商务去搞定。 获取到调用权限后,就能够开始调试了。在API Hub里,能够间接查看接口文档,或者间接进入我的项目发动调试。 能够间接查看某个接口的接口文档详情,再对该接口发动调试: 也能够间接进入我的项目的调试界面: 04 API 调试和市面上的老牌调试工具Postman相比,Apifox毫不逊色——Postman反对的性能它都能反对,并且Apifox还提供了反对可视化断言,连贯数据库,调用内部函数与脚本,反对多种语言,环境变量设置等性能,调试起来也很快捷不便。 反对多种鉴权形式:前后置操作反对多种辅助性能:a.反对可视化断言,多个接口调用、参数简单的场景下便于判断返回数据是否存在问题; b.反对提取变量保留到我的项目全局变量中,可能实现接口之间的数据传递 c.反对链接数据库,能够间接应用企业的业务数据进行调试,调试的后果更加实在 d.反对自定义脚本,满足开发者的各类型的特定需要,此外也反对调用Java,Python,PHP等130种编程语言编写的内部程序; 当然,这确保电脑曾经装置相应程序运行须要的java,Python,nodejs等环境。 05 API mock前端界面往往须要对一些后端异样返回场景做异样兼容,但凋谢API对这种异样场景的调试反对时有余的。 这时候能够应用 Apifox提供的API Mock性能。调试的时候间接应用mock服务,在高级mock-新建冀望中设置body/query等参数为某个值时,接口返回你须要的特定数据 保留胜利的冀望会显示到高级mocktab下,调试前端界面时间接应用快捷调试性能即可操作 Apifox提供的mock性能十分弱小,它内置了邮箱,身份证等罕用业务数据的mock规定,应用的时候间接抉择即可mock出高度实在的业务数据。 如果你的我的项目数据有特定的数据类型,能够本人自定义mock规定,在我的项目设置-mock设置中可通过通配符或正则表达式结构出你须要的数据来调试。 ...

April 13, 2022 · 1 min · jiezi

关于vue.js:vue项目img-srcobject-module

1.开发环境 vue2.电脑系统 windows11专业版3.在vue开发的过程中,咱们常常会应用img,然而接管他人的我的项目可能会遇到img src="[object module]",上面我来分享一下。4.解决办法: // 找到webpack.base.config.js文件// 搜 url-loaderoptions:{esModule:false,}而后从新运行我的项目即可5.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰。

April 13, 2022 · 1 min · jiezi

关于vue.js:学习Vue看这篇文章就够了你都掌握了吗

Vue外围语法面试题:Vue框架的特点组件【component】式开发,能够复用代码,进步开发效率申明式编程不必操作DOM,操作数据,进步开发效率【数据发生变化,视图跟着变动,不必操作DOM,只是关怀数据】 采纳虚构DOM+优良DIFF算法,能够复用DOM总结:组件化、申明式编程、虚构DOM+优良DIFF算法 获取Vue依赖包官网下载:https://cn.vuejs.org/v2/guide... npm:npm、yarn下载 cdn:cdn下载都能够 首次理解Vue首次理解:一、Vue框架次要关注于视图(view)的一个框架二、Vue渐进式JavaScript框架总结:渐进式,Vue框架提供外围的语法,能够在外围语法根底之上欠缺我的项目性能、路由、集中式治理等等慢慢欠缺我的项目。Vue全家桶:vue+周边外围插件,统称为全家桶渐进式:Vue框架提供一些外围的语法【指令等等】我的项目当中须要应用路由性能:Vue框架没有这个性能-vue-router配置路由我的项目中须要应用一些通用组件成果:轮播图、遮罩层,element-ui我的项目当中想要集中式治理数据:vuex等等 根本用法<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <!-- 第一步:引入vue.js --> <!-- vue框架对外裸露了一个构造函数【类】Vue构造函数 function Vue(){}--> <script src="../js/vue.js"></script></head><body> <!-- 第二部:筹备容器 --> <div id="root"> <!-- 展现动态数据 ,要用双大花括号--> <!-- {{}}:插值语法,胡子语法--> <!-- 留神:插值语法只能在文本区域书写,不能再标签属性中书写--> <h2>您好,{{name}}</h2> </div> <script> //Vue对外裸露一个构造函数Vue // Vue的实例个别叫做VM // new Vue构造函数的时候须要传递一个【配置对象】 const VM = new Vue({ el:"#root",//el的属性值个别是字符串类型的css选择器,它的作用是VM与容器进行关联 data:{//data的属性值个别是对象,它的作用是给实例对象VM增加一些属性 name:'浩哥' } }); console.log(VM); /* VM:Vue类的实例,数据能够和容器进行关联 VM实例属性的属性值发生变化,视图上的数据就跟着变动 数据变动跟着视图变动 留神:VM身上的属性是【响应式数据】,数据发生变化,视图跟这变动!!! */ </script></body></html>胡子语法(插值语法)注意事项:能够书写实例的属性能够书写JS表达式表达式:最终会产生一个数值,能够书写在胡子语法外面 eg:数学运算符:+ - * / %; 比拟运算符; 逻辑运算符 ...

April 11, 2022 · 9 min · jiezi

关于vue.js:解决template-or-render-function-not-defined

Failed to mount component:template or render function not defined 报错 起因: vue-loader在解析的时候把index.js当做是文件的入口而不是index.vue解决: 文件构造 --overview --index.vue --xxx.js //把原来这里的index.js文件名批改一下报错的vueRouter的配置 { name: '首页', path: '/index', component: () => import('../views/overview/index') },解决 //加上后缀名也是能够的component: () => import('../views/overview/index.vue')Failed to mount component:template or render function not defined 报错 起因: vue-loader在解析的时候把index.js当做是文件的入口而不是index.vue解决: 文件构造 --overview --index.vue --xxx.js //把原来这里的index.js文件名批改一下报错的vueRouter的配置 { name: '首页', path: '/index', component: () => import('../views/overview/index') },解决 //加上后缀名也是能够的component: () => import('../views/overview/index.vue')Failed to mount component:template or render function not defined 报错 ...

April 10, 2022 · 1 min · jiezi

关于vue.js:展业四海服务八方明道云落地蜀陕豫鄂

随着业务规模不断扩大,明道云的客户与搭档逐步遍布全国各地。为了更高效地为全国客户提供服务,明道云在成都、西安、郑州、武汉正式落地直营办公室。 成都:四川省成都市武侯区府城小道西段 399 号天府新谷10栋17层2区 西安:陕西省西安市高新区丈八街办唐延路51号中国人寿壹核心B座7楼 郑州:河南省郑州市金水区政七街27号U+创客核心506室 武汉:湖北省武汉市洪山区光谷守业街9栋A区 随着四地办公室落成,当前明道云的每月零代码训练营、数字青年派对、区域搭档定期走访等流动都将陆续在各地开展,敬请期待!咱们也欢送各地搭档及客户做客明道云办公室。

April 10, 2022 · 1 min · jiezi

关于vue.js:装一个Vue-CLI脚手架

emmmmmmm...这是一次装置Vue CLI的步骤记录,话不多说,开整~ 筹备工作:配置镜像门路 因为地大物博,路途遥远,咱得走点近路~cmd控制台输出: npm config set registry https://registry.npm.taobao.org第一步:全局装置Vue CLI 同样地在cmd控制台输出: npm install -g @vue/cli回车执行后即可开始装置,过程中可能会呈现一些正告,这是失常景象,不必太在意哈~又是读条了,读条实现之后就是上面这样 第二步:验证 装完之后须要验证一下装置胜利了没,敞开第一步装置实现后的cmd控制台,再次开启后输出vue回车看到这样就算胜利啦! 第三步:进入想装置vue脚手架的目录并创立 在指标门路输出: vue create 你的项目名称而后须要抉择vue版本,看上面--> Tips: Manually select features 为自定义选项bable:ES6语法转换器eslint:语法查看器第四步:致力创立中... 稍等片刻,呈现上面这个样子就代表创立我的项目胜利啦! 第五步:运行创立好的我的项目 进入我的项目所在的目录,能够在cmd控制台应用cd命令进入,也能够在我的项目所在的文件夹地址栏中输出cmd回车即可,像上面这样--> 强力举荐呀,不便好使! 接着在关上的cmd命令框中输出 npm run serve即可开始编译创立的我的项目 呈现了上面这样就代表编译实现啦! 第六步:验证 关上浏览器,在地址栏中输出上图中呈现的网址,这里是http://localhost:8080/回车关上看到Vue脚手架创立好的我的项目啦! 至此便实现了Vue CLI的装置~ Over~Over~ OvO

April 9, 2022 · 1 min · jiezi

关于vue.js:nodemodules离线安装

因工作须要,所以须要在内网脱网环境进行开发Vue我的项目,那么问题来了,咱们的node_modules依赖包要怎么在内网环境部署呢? 零碎:window 10node:16.11.1npm: 8.0.0我的项目:Vue离线环境的node和npm版本须要跟外网环境的版本统一(即你从哪个环境中复制缓存)解决方案操作步骤只有两步,复制和全局装置,即: 复制本地local下的npm-cache文件,至内网环境同目录下,如果不晓得在哪里,则能够执行如下指令: npm config get cache// 可看到此门路 C:\Users\HP\AppData\Local\npm-cache // 这只是我自己电脑中的门路,依据零碎不同,略有不同能够看到咱们本地npm缓存的地位,把npm-cahe整个文件复制进去即可 应用-offline指令,即: npm install -offline此命令是应用本地缓存的依赖包进行装置 如果新增了依赖包,则须要把npm cache复制到离线环境,而后须要替换我的项目的package.json、package-lock.json文件,而后再进行install --offline即可扩大 npm的缓存机制npm install在执行时,首先构建依赖树,一次装置依赖树中的包。 如果缓存中有依赖包,就会向近程仓库确认是否过期(304查看)查看,如果过期,就应用新的返回数据刷新缓存,否则就间接应用缓存中的数据。 此外还提供了新的参数,是用户能够指定缓存应用的策略--prefer-offline: 将使npm跳过任何条件申请(304查看)间接应用缓存数据,只有在缓存无奈匹配到的时候,才去拜访网络。这样咱们将依赖包增加到我的项目的过程就会快很多。例如,npm install express --prefer-offline将当初缓存中匹配express,只有在本地缓存没有匹配到的状况下,才去联网下载。--prefer-online: 与它将强制npm从新验证缓存的数据(应用304查看),并应用从新验证的陈腐数据刷新缓存。--offline 将强制npm应用缓存或退出。如果尝试装置的任何内容尚未在缓存中,则它将呈现代码谬误。能够通过.npmrc或者npm config set来设置缓存应用的策略。一个新的npm cache verify命令,它将对你的缓存进行垃圾回收,缩小不须要的货色占据的磁盘使用量,并且会对索引和内容进行全面的完整性验证

April 9, 2022 · 1 min · jiezi

关于vue.js:vue递归轮询实现扫码支付

本文是由Vue的SPA对接到外接设备的驱动进行交互,须要从后端接口获取领取链接传输到外接设备(大屏幕的智能设施)生成二维码。(当然也能够通过领取链接本人转成二维码) 首先定义一个单选组,有两种领取形式:“微信”,“支付宝”领取形式。paySucceed为true示意领取胜利,则提醒领取胜利,暗藏掉领取单选 <el-radio-group v-model="payWay" @change="payWayChange" v-if='paySucceed === false'> <el-radio label="wechat" >微信</el-radio> <el-radio label="ali">支付宝</el-radio> </el-radio-group>payWayChange校验因为外接设备的电脑驱动服务次要是通过websocket进行数据交互的,所以须要在一开始通过webSocket.OPEN去验证websocket以后浏览器与驱动/设施是否失常连贯中,如没连贯上进行提醒并中断以后的操作。当然在校验的时候须要重置(初始化)外接设备、领取状态、定时器。 开始领取获取领取的一些参数并通过接口(getPayStatus)获取到领取的url链接,调用openQRcode传递链接到外接设备上,显示出二维码进行领取(这里能够应用qrcode的js库转成二维码图片跳转页面的模式显示出二维码)。在这里是调用openQRcode办法只是个举例,外接设备个别都会有提供本人驱动以及对接驱动的js,依照本人的理论状况来。 领取中(轮询)当二维码胜利显示后立刻调用queryStatus()利用获取到的订单号为参数进入一个领取状态的查问(应用setTimeout轮询)queryStatus外部是一个没通过包装的申请,当申请返回payStatus示意以后未领取实现,或在领取中,否则为领取胜利。每隔3秒轮询一次(尾递归queryStatus获取领取状态 胜利 or 失败): window.pollTimer = setTimeout(() => { return queryStatus(); //轮询查问领取状态3s }, 3000)在queryStatus中的申请应用了axios,是因为这里的post包装申请pending过程中主动加上了“加载中。。。”的全屏界面动画,因为轮询是一直进行的不能显示加载动画,否则会造成每次获取状态都会始终呈现加载动画敞开/显示的闪屏成果,所以这里应用原生axios 领取实现领取胜利后就进行提醒,达成递归终止条件,革除掉计时器,重置领取的状态。最初5s计时器是为了给个小提早,避免设施上领取胜利后就秒关掉了界面 ,没有显示领取胜利的问题 if ((res.payStatus == 2) || (res.payStatus == 1)) { //领取胜利,敞开弹窗 that.paySucceed = true; window.pollTimer && window.clearTimeout(window.pollTimer); //领取胜利后干些事件。。。 setTimeout(() => { that.common.cancelAll(); that.resetPay(); }, 5000) } payWayChange (val) { //革除计时器轮询状态 clearTimeout(window.pollTimer); window.pollTimer = null; if (webSocket.readyState != webSocket.OPEN) { this.$message({ message: '请正确连贯设施或设施驱动未启动,请查看', type: 'error' }); this.resetPay(); return; } this.common.cancelAll(); //敞开电子屏领取页 //参数 let params = { type: val === 'wechat' ? 'WeChatPay' : 'AliPay', data: { paymentType:1, id:'123', payMoney: '30.0', payWay: this.payWay, } } let that = this; function queryStatus () { window.clearTimeout(window.pollTimer) axios({//应用axios,不显示加载中提醒 method: 'post', url: 'getPayStatus', withCredentials: true, timeout: 0, hideLoading: true, headers: { "Content-Type": "application/json;charset=UTF-8", "token": sessionStorage.getItem('token') }, data: { typeCode: val === 'wechat' ? 'WeChat' : 'ali', token: sessionStorage.getItem('token'), data: { order: params.order, } }, }).then((res) => { if (res.payStatus == 0) { window.pollTimer = setTimeout(() => { return queryStatus(); //轮询查问领取状态3s }, 3000) } if ((res.payStatus == 2) || (res.payStatus == 1)) { //领取胜利,敞开弹窗 that.paySucceed = true; window.pollTimer && window.clearTimeout(window.pollTimer) //领取胜利后干些事件。。。 setTimeout(() => { that.common.cancelAll(); that.resetPay(); }, 5000) } }) } that.post({ params,//参数 }) .then(res => { //获取领取链接和订单信息 params = params.data; params.order = res.order; window.delayTimer = null; window.clearTimeout(window.delayTimer); window.delayTimer = setTimeout(() => { //关上领取二维码 this.common.openQRcode(encodeURI(JSON.stringify(params)) ,encodeURI(res.url)) }, 1000); queryStatus();//开始轮询领取的状态 }); }, resetPay () { this.paySucceed = false; window.pollTimer && window.clearTimeout(window.pollTimer); //革除计时器轮询状态 },

April 9, 2022 · 2 min · jiezi

关于vue.js:vue嵌套组件传参

vue父子组件参数传递咱们个别应用prop给子组件传递参数,在子组件中应用$emit触发父组件中监听的事件,并且能够附带参数。 比方咱们封装了一个名为 NestedDir 的子组件(嵌套目录的意思),内容如下(用到了element ui组件): <template> <ul class="nest_wrapper"> <li v-for="(el, index) in nested" :key="index"> <div v-if="el.type ==='dir'" class="dir"> <p>{{el.name}}</p> <div class="btn_group"> <el-button type="warning" size="mini" @click="add({id: el.id, type: 'dir'})">新增目录</el-button> <el-button type="warning" size="mini" @click="add({id: el.id, type: 'file'})">新增文件</el-button> </div> </div> <div v-if="el.type ==='file'" class="file"> <p>{{el.name}}</p> </div> <NestedDir v-if="el.children" :nested="el.children"/> </li> </ul></template><script>export default { name: "NestedDir", props: { nested: { type: Array, } }, methods: { add(el) { this.$emit('change', el) } }}</script>能够看出这个 NestedDir 接管父级传来的 nested 数组类型的数据,并且它的外部点击 新增目录、新增文件,能够触发 父级 监听的 change 事件。比拟非凡的是这个组件中调用了本人: ...

April 8, 2022 · 2 min · jiezi

关于vue.js:自定义pie外圈及内部icon等

效果图代码: <template> <div class="emergency-pie" :class="domClass"></div></template><script>export default { props: { domClass: { type: String, default: 'emergency-pie' } }, mounted () { this.init() }, methods: { init () { var uploadedDataURL = require('../../../../assets/images/manage/nei-circle.png') var uploadedDataURL2 = require('../../../../assets/images/manage/police-waiyuan.png') var seriesData = [ { name: '待处理事件', value: '400' }, { name: '已处理事件', value: '70' } ] var colorList = ['#FEE394', '#7DF6F6'] const option = { grad: { left: '2%' }, title: { text: '应急指挥', x: '43.5%', y: '55%', textStyle: { fontSize: 14, color: '#7DF6F6' } }, tooltip: { trigger: 'item', borderColor: 'rgba(255,255,255,.3)', backgroundColor: 'rgba(13,5,30,.6)', borderWidth: 1, padding: 5, textStyle: { color: 'rgba(255,255,255,1)' }, formatter: function (parms) { var str = parms.marker + '' + parms.data.name + '</br>' + '数量:' + parms.data.value + '</br>' + '占比:' + parms.percent + '%' return str } }, graphic: [ { type: 'image', id: 'logo', left: '40%', top: '30%', z: -10, bounding: 'raw', rotation: 0, // 旋转 origin: [60.5, 30.5], // 中心点 scale: [1.0, 1.0], // 缩放 style: { image: uploadedDataURL, width: 80, border: '1px solid red', height: 80, opacity: 1 } }, { type: 'image', id: 'logo2', left: '32%', top: '8%', z: -10, bounding: 'raw', rotation: 0, // 旋转 origin: [60, 30], // 中心点 scale: [1.0, 1.0], // 缩放 style: { image: uploadedDataURL2, width: 170, border: '1px solid red', height: 170, opacity: 1 } } ], series: [ { type: 'pie', z: 3, center: ['47%', '50%'], radius: ['50%', '63%'], clockwise: true, avoidLabelOverlap: true, hoverOffset: 15, itemStyle: { normal: { color: function (params) { return colorList[params.dataIndex] } } }, label: { show: true, position: 'outside', formatter: function (param) { if (param) { return [ '{a|' + param.name + '}', '{b|' + param.percent + '%}' ].join(' ') } }, rich: { a: { color: '#7DF6F6' }, b: { color: '#fff' } } }, labelLine: { // color: '#fff', normal: { length: 20, length2: 20, lineStyle: { width: 1 } } }, data: seriesData } ] } var myChart = this.$echarts.init( document.getElementsByClassName(this.domClass)[0] ) myChart.setOption(option) } }}</script><style lang="scss" scoped>.emergency-pie { width: 100%; height: 200px; display: flex; color: #fff;}</style>

April 8, 2022 · 2 min · jiezi

关于vue.js:vue的vif和vshow需要注意的问题

原文:https://mp.weixin.qq.com/s?__... 微信公众号:毛毛虫的小小蜡笔前言应该大家都晓得v-if和v-show的区别。 v-if,是有条件的渲染,当条件是true的时候,才渲染到dom节点中。当条件是false的时候,是不会渲染到dom节点中。 v-show,则不论条件是否为true,都会渲染到dom节点中,只是切换css的display来显示或暗藏而已。 场景和须要留神的问题场景1如果只是简略的tab切换,并且每个tab组件的内容不多,那绝对应用v-show会更适合。 但须要留神的问题是,页面加载后,都会触发tab组件的mounted,并且会依据组件程序来触发mounted。 Demo代码: // tab.vue<template> <el-tabs v-model="activeName"> <el-tab-pane label="tab1" name="first"> <tab1 v-show="activeName==='first'"></tab1> </el-tab-pane> <el-tab-pane label="tab2" name="second"> <tab2 v-show="activeName==='second'"></tab2> </el-tab-pane> </el-tabs></template><script>import tab1 from '../components/tab1.vue'import tab2 from '../components/tab2.vue'export default { components: { tab1, tab2 }, data: () => { return { activeName: 'first' } }, mounted() { console.log('tab') }}</script><style lang="less" scoped>.el-tabs { text-align: left;}</style>// tab1.vue<template> <div class="tab1"> {{value}} </div></template><script>export default { data: () => { return { value: 'tab1的内容...' } }, mounted() { console.log('tab1') }}</script>// tab2.vue<template> <div class="tab2"> {{value}} </div></template><script>export default { data: () => { return { value: 'tab2的内容...' } }, mounted() { console.log('tab2') }}</script>成果下图所示: ...

April 8, 2022 · 2 min · jiezi

关于vue.js:用element开发一个复杂表格

先上原型图,用element制作一个相似这样的表格,刚开始想的是用一个表格去实现,然而...想多了,最初用多个表格沉积实现,(注:只关注表格实现,表格中所有数据都是捏造的。) 1、客户根本信息表格 此表格次要做以下操作,1、删除生成表格的第一行空表格(为什么会有空行,还没明确,有晓得的搭档能够留言告知),2、合并客户名称值的列,3、将客户名称值字段靠左显示 <el-table :data="tableData" size="mini" class="mt10 tableBaseInfo" :header-row-class-name="hiddenHeaderRow" :span-method="arraySpanMethod1" :cell-class-name="setTextLeft" > <el-table-column label="客户根本信息" align="center"> <el-table-column prop="name" align="center"></el-table-column> <el-table-column prop="nameValue" align="center"></el-table-column> <el-table-column prop="month" align="center"></el-table-column> <el-table-column prop="monthValue" align="center"></el-table-column> </el-table-column> </el-table> export default { data() { return { tableData: [ { name: "客户名称", nameValue: "测试1", month: "", monthValue: "", }, { name: "客户户号", nameValue: "123456789", month: "结算月份", monthValue: "2", }, ], } }, methods: { // 暗藏表格空的行--这块的起因还没搞清楚,生成的表格会有一行是空的 hiddenHeaderRow({ rowIndex }) { if (rowIndex == 1) { //暗藏第二行 return "hiddenClass"; } }, // 合并客户根本信息表格客户名称单元格 arraySpanMethod1({ rowIndex, columnIndex }) { if (rowIndex == 0) { if (columnIndex != 0) { return [1, 3]; } } }, // 设置客户根本信息表格客户名称靠左显示 setTextLeft({ rowIndex, columnIndex }) { if (rowIndex == 0) { if (columnIndex != 0) { return "textAlignLeft"; } } }, } } 2、客户电量电费信息表格 ...

April 8, 2022 · 6 min · jiezi

关于vue.js:内部分享篇Vue2源码浅析

1、内容及模式1.介绍目录构造、找到外围入口2.介绍全局api3.以发问互动形式浏览外围源码2、目录构造.circleci 继续集成benchmarks 性能评测dist 输入目录examples 案例flow flow申明文件packages vue中的包scripts 工程化src 源码目录test 测试相干types ts申明文件3、外围源码目录├─compiler # 编译的相干逻辑│ ├─codegen│ ├─directives│ └─parser├─core # vue外围代码│ ├─components # vue中的内置组件 keep-alive│ ├─global-api # vue中的全局api│ ├─instance # vue中的外围逻辑│ ├─observer # vue中的响应式原理│ ├─util │ └─vdom # vue中的虚构dom模块├─platforms # 平台代码│ ├─web # web逻辑 - vue│ │ ├─compiler│ │ ├─runtime│ │ ├─server│ │ └─util│ └─weex # weex逻辑 - app│ ├─compiler│ ├─runtime│ └─util├─server # 服务端渲染模块├─sfc # 用于编译.vue文件└─shared # 共享的办法和常量4、打包流程及入口剖析1.package.json"build": "node scripts/build.js","build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer","build:weex": "npm run build -- weex",2.scripts/build.js// 1.获取不同的打包的配置 let builds = require('./config').getAllBuilds()// 2.进行打包build(builds)3.scripts/config.jsexports.getAllBuilds = () => Object.keys(builds).map(genConfig)//找到打包入口src/platforms/web/entry-runtime.jssrc/platforms/web/entry-runtime-with-compiler.js4.外围代码、全局API initGlobalAPI()1.import Vue from './runtime/index'2.import Vue from 'core/index'3.import Vue from './instance/index'//global-api/index.js Vue.set Vue.delete Vue.nextTick initUse(Vue) Vue.use initMixin(Vue) Vue.mixin initExtend(Vue) Vue.extend5.Vue.set / Vue.deleteexport function set (target: Array<any> | Object, key: any, val: any): any { //1.数组 应用splice触发视图更新 vue.set(arr,0,99) if (Array.isArray(target) && isValidArrayIndex(key)) { target.length = M .max(target.length, key) target.splice(key, 1, val) return val } //2.对象 是对象自身的属性,间接增加即可 if (key in target && !(key in Object.prototype)) { target[key] = val return val } const ob = (target: any).__ob__ //3.不是响应式的 不须要将其定义成响应式属性 if (!ob) { target[key] = val return val } // 4.将属性定义成响应式的 defineReactive(ob.value, key, val) ob.dep.notify() return val}export function del (target: Array<any> | Object, key: any) { // 1.数组 仍旧调用splice办法 if (Array.isArray(target) && isValidArrayIndex(key)) { target.splice(key, 1) return } const ob = (target: any).__ob__ // 2.自身没有这个属性 if (!hasOwn(target, key)) { return } // 3.删除这个属性 delete target[key] if (!ob) { return } // 4.告诉更新 ob.dep.notify()}对象只会拦挡曾经存在的属性 更改数组索引也不会引发视图更新6.Vue.nextTickconst callbacks = []; // 寄存nextTick回调let pending = false; function flushCallbacks () { // 清空队列 pending = false const copies = callbacks.slice(0) callbacks.length = 0 for (let i = 0; i < copies.length; i++) { copies[i]() }}let timerFuncexport function nextTick (cb?: Function, ctx?: Object) { let _resolve callbacks.push(() => { if (cb) { try { cb.call(ctx) // 1.将回调函数存入到callbacks中 } catch (e) { handleError(e, ctx, 'nextTick') } } else if (_resolve) { _resolve(ctx) } }) if (!pending) { pending = true timerFunc(); // 2.异步刷新队列 } // 3.反对promise写法 if (!cb && typeof Promise !== 'undefined') { return new Promise(resolve => { _resolve = resolve }) }}将回调函数存入到一个队列中,最初异步的清空这个队列timerFunc ...

April 8, 2022 · 4 min · jiezi

关于vue.js:VUE2再不记一笔就快忘了

渲染流程模板编译的过程大抵是:Vue会把用户在<template></template>标签中写的相似于原生HTML的内容进行编译,通过一系列的逻辑解决生成渲染函数,也就是render函数,而render函数会将模板内容生成对应的VNode,而VNode再通过patch过程从而失去将要渲染的视图中的VNode,也就是DOM-DIFF的过程,最初依据VNode创立实在的DOM节点并插入到视图中, 最终实现视图的渲染更新。 所谓渲染流程,就是把用户写的相似于原生HTML的模板通过一系列解决最终反馈到视图中称之为整个渲染流程。整个流程图如下: 从图中咱们也能够看到,模板编译过程就是把用户写的模板通过一系列解决最终生成render函数的过程。对应源代码中如下代码: export const createCompiler = createCompilerCreator(function baseCompile ( template: string, options: CompilerOptions): CompiledResult { // 模板解析阶段:用正则等形式解析 template 模板中的指令、class、style等数据,造成AST const ast = parse(template.trim(), options) if (options.optimize !== false) { // 优化阶段:遍历AST,找出其中的动态节点,并打上标记; optimize(ast, options) } // 代码生成阶段:将AST转换成渲染函数; const code = generate(ast, options) return { ast, render: code.render, staticRenderFns: code.staticRenderFns }})让咱们实际以下,如下最简略的模板: <body> <div id="root"></div> <script> let vue = new Vue({ el: '#root', template: '<div>count: {{count}}<button @click="add">加一</button></div>', data: { count: 0 }, methods: { add: function(){ this.count ++ } } }) </script></body>通过编译后生成渲染函数的后果为:在讲述DOM-DIFF的过程之前须要关注为什么是虚构DOM?因为实在的 DOM 节点数据会占据更大的内存,当咱们频繁的去做 DOM 更新,会产生肯定的性能问题,因为 DOM 的更新有可能带来页面的重绘或重排。咱们能够用 JS 的计算性能来换取操作 DOM 所耗费的性能。最直观的思路就是咱们不要自觉的去更新视图,而是通过比照数据变动前后的状态,计算出视图中哪些地方须要更新,只更新须要更新的中央,而不须要更新的中央则不需关怀,这样咱们就能够尽可能少的操作 DOM 了。这也就是下面所说的用 JS 的计算性能来换取操作 DOM 的性能。 ...

April 8, 2022 · 3 min · jiezi

关于vue.js:我发现了华点vue规定用普通函数定义方法为什么react又要我用箭头函数

原文首发在我的公众号,订阅可第一工夫查看我的最新文章! 大家好,我是年年! 如果应用过react和vue,应该发现过一个问题:vue通知咱们不应该把办法、生命周期用箭头函数去定义;而在react的类组件中,把办法写成箭头函数的模式却更不便。 要问其起因,大部分人都只把他当一个天经地义的规定。但把这个问题剖开,其实能很好地把筹备面试时造的火箭,在拧螺丝的时候用起来。 这篇文章能够让你在这个理论场景中去用到this的指向、作用域链以及原型。 this指向失落无论是vue还是react,都在官网文档中强调,须要留神this的指向失落。但乏味的是,为了达到同样的目标,一个是不能应用箭头函数,一个是应用箭头函数便能解决 react vue React中this的失落首先来看看react,这是一个很一般的类组件写法: class Demo extends React.Component{ state = { someState:'state' } // ✅举荐 arrowFunMethod = () => { console.log('THIS in arrow function:',this) this.setState({someState:'arrow state'}) } // ❌须要解决this绑定 ordinaryFunMethod(){ console.log('THIS oridinary function:',this) this.setState({someState:'ordinary state'}) } render(){ return ( <div> <h2>{this.state.someState}</h2> <button onClick={this.arrowFunMethod}>call arrow function</button> <button onClick={this.ordinaryFunMethod}>call ordinary function</button> </div> ) }}ReactDOM.render(<Demo/>,document.getElementById('root'))我在组件内我定义了两个办法:一个用箭头函数实现,另一个用一般函数。在调用时别离打印this,后果如下: 箭头函数中this正确指向了组件实例,但一般函数中却指向了undefined,为什么? 其实这是一个无关react的js个性,剥离react带来的心智累赘,实质上,下面的代码不过是一个「类」,简化一下,就变成了这样: class ReactDemo { // ✅举荐 arrowFunMethod = () => { console.log('THIS in arrow function:', this) } // ❌this指向失落 ordinaryFunMethod() { console.log('THIS in oridinary function:', this) } } const reactIns = new ReactDemo() let arrowFunWithoutCaller = reactIns.arrowFunMethod let ordinaryFunWithoutCaller = reactIns.ordinaryFunMethod arrowFunWithoutCaller() ordinaryFunWithoutCaller()运行一下下面这段代码,会发现后果不出意料:在一般函数中this的指向也失落了。 ...

April 7, 2022 · 1 min · jiezi

关于vue.js:看Vue源码学到的实用代码

面试常问题:判断数组和对象,上面这个办法能够疾速辨别 var _toString = Object.prototype.toString; _toString.call(value).slice(8, -1)试试 _toString.call([]) 和 _toString.call({})的区别

April 7, 2022 · 1 min · jiezi

关于vue.js:Element-Plus-for-Vue-3-入门教程

本文首发:《Element Plus for Vue 3 入门教程》 Element Plus 是为了适配 Vue 3 对 Element UI 进行的重构。Vue 3.0 的这次大版本升级,对于第三方组件库来说是一件坏事,那些曾经修修补补无数次,还无奈彻底解决的问题,在这次面向 Vue 3.0 重构时,一次性全副解决。 Element Plus 有那些降级?Element Plus 应用 Vue 3 与 TypeScript开发,提供残缺的类型定义文件,应用 Composition API 简化逻辑,升高耦合。 Element Plus 这一次应用 TypeScript + Composition API 来进行重构 应用 TypeScript 开发应用 Vue 3 Teleport 新个性重构挂载类组件应用 Vue 3 Composition API 简化逻辑,升高耦合抉择了 Day.js 这种更轻便通用的工夫日期选择器解决方案应用 Lerna 保护和治理我的项目降级适配 async-validator,popperjs 等外围依赖欠缺 52 种国际化语言反对Element Plus 与 Element UI 是什么关系?Element Plus 是为了适配 Vue 3 对 Element UI 进行的重构,就如同 vue-next 对于 vue 一样,你能够了解为不同的大版本。 ...

April 7, 2022 · 3 min · jiezi

关于vue.js:Element-Plus-和-Ant-Design-Vue-对比测评哪个更好

本文首发:《Element Plus 和 Ant Design Vue 比照测评,哪个更好?》 Vue 3 公布后,各家第三方库开始陆续重构并反对 Vue 3 ,国内两大出名框架 Element Plus 和 Ant Design Vue 也相续公布新版反对 Vue 3。到底应该怎么抉择呢?本文从多个纬度对两个框架进行比照和测评。 Element Plus 公布正式版后,下载量飙升,当然这也依靠于 Element UI 的占有率和好口碑。无关 Element Plus 的入门教程可看这篇:《Element Plus for Vue 3 入门教程》 框架版本对 Vue 的反对Element UI 反对 Vue 2Element Plus 反对 Vue 3Ant Design Vue 1.x 反对 Vue 2Ant Design Vue 3.x 反对 Vue 3Element Plus 是为了适配 Vue 3 对 Element UI 进行的重构。Vue 3.0 的这次大版本升级,对于第三方组件库来说是一件坏事,那些曾经修修补补无数次,还无奈彻底解决的问题,在这次面向 Vue 3.0 重构时,一次性全副解决。 ...

April 7, 2022 · 2 min · jiezi

关于vue.js:Vue3TSVueI18n国际化问题

Vue3 + TS + VueI18n(9.2.0)国际化时,在<script setup>中间接应用t('Common.pleaseChoose')时,发现值为空串的问题 国际化配置如下所示: 应用时如下所示: 调试并查看源码后,发现在onBeforeMount和onMounted中应用是没问题的

April 7, 2022 · 1 min · jiezi

关于vue.js:vite-更新依赖报错-Access-is-denied

尝试yarn 革除缓存,删除node_modules重新安装后运行仍然报这个谬误解决办法:降级node ,降级前我的node版本为v14.17.6 降级后为v16.14.2。参考链接

April 6, 2022 · 1 min · jiezi

关于vue.js:vxegrid-数据代理-对接-后台接口

vxe-grid 是 vxe-table组件库中的高级表格,两者之间的区别在于,vxe-table应用标签式组件,vxe-grid 应用配置式组件。在性能方面两者根本是一样的。 vxe-grid 数据代理的配置,提供的例子都是模仿数据,如果咱们有数据接口,那么就须要依据其默认格局配置即可。 比方,咱们有一接口,返回是数据格式为: { status: 200, data:{ current_page: 1, data: [...], last_page: 8590, per_page: 10, total: 85898 }}依据提供的例子,可知 vxe-grid 须要后果列表和总数 props: { // 自定义响应后果读取的字段,例如返回后果为:{result: [], page: {total: 10}} result: 'result', total: 'page.total'},那么,咱们能够配置vxe-grid的proxyConfig属性。 proxyConfig: { seq: true, // 启用动静序号代理,每一页的序号会依据当前页数变动 sort: true, // 启用排序代理,当点击排序时会主动触发 query 行为 filter: true, // 启用筛选代理,当点击筛选时会主动触发 query 行为 form: true, // 启用表单代理,当点击表单提交按钮时会主动触发 reload 行为 ajax: { seq: true, // 启用动静序号代理(分页之后索引主动计算为当前页的起始序号) query: ({page}) => { let param = { limit: page.pageSize, page: page.currentPage } return index(param).then(res =>{ console.log(res) return { result: res.data.data, page: { total: res.data.total }, } }) } }},这样就把接口对接过去了。 ...

April 5, 2022 · 1 min · jiezi

关于vue.js:reactvue国际化插件webpacki18nplugin

前言目前国际化我的项目个别都须要开发者一一去实现,耗时耗力。webpack-i18n-plugin次要解决了两个痛点问题: 提取我的项目中的国际化资源文件 在webpack中配置插件(webpack-i18n-plugin),即可提取出中文资源增加国际化代码 增加loader,批改编译代码,主动增加国际化办法$i18n,对源码无污染该国际化插件可用于vue,react我的项目,具体应用办法如下: 装置npm install webpack-i18n-plugin -Dreact我的项目中webpack配置// webpack.config.jsconst i18nPlugin = require("webpack-i18n-plugin");// 配置loaderrules: [{ test: /\.(j|t)sx?$/, loader: "webpack-i18n-plugin/loader", exclude: /node_modules/,}],// 配置pluginsplugins: [ ... new i18nPlugin(i18nConfig), ...]vue我的项目中webpack配置// vue.config.jsconst i18nPlugin = require("webpack-i18n-plugin");chainWebpack: (config) => { // 配置loader config.module.rule("i18n").test(/\.(t|j)sx?$/) .use("i18n-loader").loader("webpack-i18n-plugin/loader"); // 配置plugins config.plugin("i18n").use(i18nPlugin).tap((options) => { return [...options, i18nConfig]; });}插件配置项i18nConfigconst i18nConfig = { //国际化配置输入目录(可选) i18nDir: path.resolve(__dirname, "./i18n"), translation: { // 配置en_US 语言包 en_US: { source: [path.resolve(__dirname, "./翻译文件.xlsx")] }, ... }};

April 5, 2022 · 1 min · jiezi

关于vue.js:Vue-DevTools-使用指南-如何安装和使用-Vue-DevTools-调试-Vue-组件

本文首发:《Vue DevTools 使用指南 - 如何装置和应用 Vue DevTools 调试 Vue 组件》 Vue Devtools 是 Vue 官网公布的调试浏览器插件,能够装置在 Chrome 和 Firefox 等浏览器上,间接内嵌在开发者工具中,应用体验晦涩。Vue Devtools 由 Vue.js 外围团队成员 Guillaume Chau 和 Evan You 开发。 在本教程中,咱们首先来一起搭建一个测试实例,而后在浏览器上装置 Vue DevTools,而后大家可依据教程一步一步调试本人搭建的 APP,从而相熟应用 Vue Devtools。 另外,这个世界曾经悄悄发生变化,当初基本无需写任何前端代码,间接应用卡拉云 —— 新一代低代码开发工具帮你搭建后盾工具,卡拉云可一键接入常见数据库及 API ,无需懂前端,内置欠缺的各类前端组件,无需调试,拖拽即用。原来三天的工作量,当初 1 小时搞定,谁用谁晓得,用上早上班,详见本文文末。 咱们开始吧。 第 1 步:创立一个测试实例 APP咱们首先用 Vue 搭建一个简略的测试 APP,本教程将用这个 APP 给大家示范如何应用 Vue Devtools 工具调试 Vue APP。 搭建过程也非常简单,倡议大家跟着本教程本人也入手操作一遍,一下子就学会了。 咱们来做一套学英语的学习卡片 Ap,在接下来的章节中,咱们应用 Vue Devtools 来监测这个简略的 App 首先,咱们通过 Vue CLI 生成一个新 Vue APP,请关上你的终端,运行: ...

April 2, 2022 · 4 min · jiezi

关于vue.js:通过差异化对比学习法带你回顾Vue2快速掌握Vue3

海阔凭鱼跃,天高任鸟飞。Hey 你好!我是猫力Molly Vue3曾经公布有一段时间了,同时也失去了各大厂商和社区的反对和泛滥开发者青睐,周边生态也正在逐步完善。堪称是一片欣欣向荣的美景。本文意在通过梳理Vue2罕用api通过差异化比照Vue3,帮忙你疾速把握Vue3本文假如你曾经有肯定vue2实操教训,不会过多形容api细节 为什么要降级Vue3?两个要害的因素导致了咱们思考重写Vue新的次要版本: 支流浏览器对新的JavaScript语言个性的广泛反对。以后Vue代码库随着工夫的推移而裸露进去的设计和体系架构问题。更多细节,咱们能够听听祖师爷在知乎的答复尤雨溪亲笔:重头来过的 Vue 3 带来了什么? vue2 VS vue3(编码体感)近期做了一个对于“共享童车”的后盾管理系统我的项目,因为是新我的项目,我便大胆选定了vue3+vite+typescript+element plus作为根底技术栈。不过目前市面上并没有一款收费且好用的中后盾根底模板框架,于是我又仿照着花裤衩大佬的传送门:vue-admin-template照猫画虎的写了一个vue3版本的vue-element-admin并且利用到理论我的项目中。就我集体编码习惯而言,绝对于vue2的Option api的直观明了,vue3的Composition api能够更好的组织代码,反对自定义hooks来达到代码复用,从而取代mixin,代码格调上,也能够把相似的业务逻辑写到一个代码块,从而防止代码扩散,走读代码须要高低重复横跳。更敌对的反对了TS以及泛滥新个性的退出,也让vue3写起来更爽,更利于代码保护和拓展。联合vite应用,更是极大晋升了开发体验。总体来说,让咱们拥抱vue3吧,给vue团队点个赞 vue3比拟直观的新个性全新的Composition api让咱们换一种形式组织代码<script setup> 语法糖,使得代码更简洁能够省去template的根元素包裹标签提供了新的内置组件<teleport>,反对了组件能够挂载到任意dom节点下提供了在css中应用v-bind来引入script变量,又一个弱小的黑魔法小技巧应用createApp来创立利用实例更敌对的TS反对应用proxy代理形式来替换掉defineproperty全局和外部 API 曾经被重构为反对 tree-shakeoption api VS composition apicomposition api是vue3的一大特色,vue3对外裸露了大量函数供以咱们按需援用,随便组合 在option api中,咱们通过实例化Vue并将行为对象作为参数传入 new Vue({ data(){ return {} }, methods:{}, computed:{}, created(){}, ...})在Composition api 咱们能够通过setup作为入口函数,并返回一个对象数据裸露给模板应用 <template> <div @click="hi">{{ msg }}</div></template><script>export default { setup() { const msg = ref('Hello!') function hi() { console.log(msg) } // 裸露给模板 return { msg, hi } } }</script>setup还反对另一种写法,更加简化了代码 <template> <div @click="hi">{{ msg }}</div></template><script setup>const msg = ref('Hello!')function hi() { console.log(msg)}</script>当应用 <script setup> 的时候,任何在 <script setup> 申明的顶层的绑定 (包含变量,函数申明,以及 import 引入的内容) 都能在模板中间接应用 ...

April 1, 2022 · 2 min · jiezi

关于vue.js:教你VUE中的filters过滤器2种用法

前言Vue.js 容许咱们自定义过滤器,可被用于一些常见的文本格式化。过滤器能够用在两个中央:双花括号({undefined{ }})插值和 v-bind 表达式 (后者从 2.1.0+ 开始反对)。过滤器应该被增加在 JavaScript 表达式的尾部,由“管道”符号批示。 <!-- 在双花括号中 --><div>{{ message | capitalize }}</div> <!-- 在 `v-bind` 中 --><div v-bind:id="rawId | formatId"></div>复制代码一、全局过滤器定义一个全局过滤器很简略,只须要导出一个办法即可。 应用的时候很简略,只须要在入口文件全局引入此过滤器即可,应用 Vue.filter(key, value) 引入。 比方,Java后端返回的工夫戳准确到秒,而JS中的工夫戳是用毫秒示意,则能够定义一个转换工夫戳的全局过滤器: //main.jsimport Vue from 'vue'Vue.filter('millisecond', (value) => { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1)})复制代码在须要应用的组件应用: <div>{{1516101106 | millisecond}}</div>复制代码全局过滤器之繁多挂载 /** * dateTmp:要过滤的值 * fmtTmp:传入的参数,可接管多个参数 */<template> <!-- 2021-12-20 19:14:18 --> <div>{{ 1639998858000 | dateFormat("yyyy/MM/dd HH:mm:ss") }}</div></template> Vue.filter('dateFormat', function (dateTmp, fmtTmp) { let fmt = fmtTmp let date = dateTmp if (!fmt) { fmt = 'yyyy.MM.dd' } if (!(date instanceof Date)) { date = new Date(date) } let o = { 'M+': date.getMonth() + 1, // 月份 'd+': date.getDate(), // 日 'h+': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 小时 'H+': date.getHours(), // 小时 'm+': date.getMinutes(), // 分 's+': date.getSeconds(), // 秒 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 'S': date.getMilliseconds() // 毫秒 } let week = { '0': '日', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六' } if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) } if (/(E+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '星期' : '周') : '') + week[date.getDay() + '']) } for (var k in o) { if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) } } return fmt});复制代码全局过滤器之批量挂载 ...

April 1, 2022 · 2 min · jiezi

关于vue.js:Vue数据更新视图不更新的问题和应用

呈现这个问题的起因就是数据尽管更新了 然而其实Vue是没有监控到的网上其实有很多的解决办法最省事的方法是从新给数组赋值 当然这个方法只实用于你的数据量比拟小并且数据没有分页的状况我这里用的是this.$set 这个办法 有三个参数target key value 别离是要更改的数据(对象或数组) 要更改的键(为数组时是下标) 更改的值 我这里的业务逻辑是有订单的状态 须要用websocket来更新每个状态的条数通过循环来给状态这个对象来赋值 for(let i in this.orderStatus){ let num = res.data[i] this.$set(this.orderStatus[i],'num',num) }这样Vue就能够监听到更新了最终的成果就这样的

March 31, 2022 · 1 min · jiezi

关于vue.js:译自官方课程双向数据绑定的最佳解释

highlight: vs2015译自这篇文章:Build a Reactivity System,在我的了解上加工了那么一丢丢 还有这篇文章(其实都是一篇文章,然而这个多了几张图) 建设响应零碎在本课中,咱们将应用与 Vue 源代码中雷同的技术构建一个简略的响应零碎。 这将使您更好地了解 Vue.js 及其设计模式,并让您相熟 观察者watcher 和 Dep 类。 响应零碎当您第一次看到 Vue 的反馈零碎工作时,它看起来就像是魔法一样。 拿这个简略的应用程序为例: <div id="app"> <div>Price: ${{ price }}</div> <div>Total: ${{ price * quantity }}</div> <div>Taxes: ${{ totalPriceWithTax }}</div> </div><script src="https://cdn.jsdelivr.net/npm/vue"></script> <script> var vm = new Vue({ el: '#app', data: { price: 5.00, // 价格 quantity: 2 // 数量 }, computed: { totalPriceWithTax() { // 含税总价格 return this.price * this.quantity * 1.03 } } }) </script>不晓得为什么,Vue 只晓得如果价格发生变化,它应该做三件事: ...

March 31, 2022 · 6 min · jiezi

关于vue.js:vue3-provide-inject-父子组件传值watch监听

父组件 setup () { const data = reactive({ deviceTypesTotal: {}})provide('deviceTypesTotal', data.deviceTypesTotal)子组件 import { defineComponent, reactive, toRefs, ref, onMounted, inject , watch } from 'vue'const deviceTypesTotal = inject('deviceTypesTotal')watch(deviceTypesTotal, (newValue) => { console.log(newValue) data.deviceTypesTotal = newValue.deviceTypesTotal},{deep:true})

March 30, 2022 · 1 min · jiezi

关于vue.js:使用webpack5vue3搭建项目

<p align='center'>稳固地enalpro 创立 Web 利用 </p> 个性 Vue 3, wepack@5, pnpm,减小node_modules体积<!-- - 基于文件的路由 --> 组件自动化加载 应用 Pinia 的状态治理 UnoCSS - 高性能且极具灵活性的即时原子化 CSS 引擎 各种图标集为你所用 I18n 国际化开箱即用 应用 新的 <script setup> 语法 API 主动加载 - 间接应用 Composition API 无需引入 能够自行引入 critters 的生成要害 CSS TypeScript, 当然☁️ 零配置部署 Netlify 预配置UI 框架UnoCSS - 高性能且极具灵活性的即时原子化 CSS 引擎IconsIconify - 应用任意的图标集,浏览:IcônesUnoCSS 的纯 CSS 图标计划插件Vue RouterPinia - 间接的, 类型平安的, 应用 Composition api 的轻便灵便的 Vue 状态治理Vue I18n - 国际化编码格调应用 Composition API 地 <script setup> SFC 语法ESLint 配置为 @antfu/eslint-config, 单引号, 无分号.开发工具TypeScriptCypress - E2E 测试pnpm - 快, 节俭磁盘空间的包管理器Netlify - 零配置的部署VS Code 扩大 ...

March 30, 2022 · 1 min · jiezi

关于vue.js:手摸手实现Transition

手摸手实现Transitionxdm好,我是剑大瑞。 本篇内容旨在通过本人实现Transition组件,从而理解其外部原理。 如果你还没有应用过Transition组件或者对其不相熟,那么我倡议你能够先学习官网文档,写一些demo,当相熟了Transition组件之后,然而又对其原理有所好奇,就能够再回来学习这篇文章。官网文档传送门。前言通过官网文档能够晓得,当应用Transition组件的时候,咱们能够通过配置Transition组件的props管制组件的进场过渡、离场过渡状态、动画成果。 配置props的过程中,重要的是指定name。Vue会将name字段与不同的过渡阶段名称进行组合,在不同的阶段为咱们的dom增加类名或者移除类名。 这里借用官网的示意图: 这张图片对于Transition组件的过渡成果形容十分确切了: 当组件挂载的时候,class由v-enter-from过渡为v-enter-to。切换的两头过程咱们称它为v-enter-active。当组件卸载的时候,class由v-leave-from过渡为v-leave-to。切换的过程咱们称它为v-leave-active。在由enter-from⇒enter-to或者leave-from⇒leave-to的阶段,咱们能够指定组件的初始和最终款式。在enter-active & leave-active阶段咱们能够指定组件的过渡或者动画成果。首先咱们须要调用defineComponent API来定义一个MyTransition组件,通过setup获取插槽中的内容。 这外面有两点须要思考: MyTransition只会把过渡成果利用到其包裹的内容上,而不会额定渲染 DOM 元素,也不会呈现在可被查看的组件层级中。 就是说组件并不需要有本人的template,只做插槽的搬用工。 MyTransition组件并不需要有本人的状态,只需将用户传入的props解决后,再将解决后的newProps传给子组件即可。 就是说MyTransition组件并不需要有本人的状态,只做状态的搬运工。 Props设计然而咱们怎么设计props呢? 思考这个问题,还须要回到Transition组件的外围逻辑在于: 在组件的挂载阶段,咱们须要将enter-from至enter-to阶段的过渡或者动画成果class附加到DOM元素上。在组件的卸载阶段,咱们须要将leave-from至leave-to阶段的过渡或者动画成果class附加到DOM元素上。 那咱们是否须要通过mounted、unmounted API钩子中实现class的移除和增加呢? 答案:其实不须要。在Vue 中的Transition组件是与渲染器的patch逻辑高度依赖的。 渲染器解决形式在渲染器中,能够在mountElement函数中,解决Enter阶段的过渡或者动画成果。在remove函数中解决Leave阶段的过渡或者动画成果。 这里咱们在此简略看下这两个函数的代码: mountElement函数简略版,mountElement函数负责挂载元素。// 挂载元素节点const mountElement = (vnode,...args) => { let el; let vnodeHook; const { type, props, shapeFlag, transition, patchFlag, dirs } = vnode; // 省略局部代码... *if (needCallTransitionHooks*) { // 执行过渡钩子 transition.beforeEnter(el); } // 省略局部代码... if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { // post 各种钩子 至后置执行工作池 queuePostRenderEffect(() => { // 执行过渡动画钩子 needCallTransitionHooks && transition.enter(el); }, parentSuspense); }};remove函数简略版,remove函数次要负责从父元素中移除元素。// 移除Vnodeconst remove = vnode => { const { type, el, anchor, transition } = vnode; // 省略局部代码... const performRemove = () => { hostRemove(el); if (transition && !transition.persisted && transition.afterLeave) { // 执行transition钩子 transition.afterLeave(); } }; if (vnode.shapeFlag & 1 /* ELEMENT */ && transition && !transition.persisted) { const { leave, delayLeave } = transition; // 执行lea const performLeave = () => leave(el, performRemove); if (delayLeave) { delayLeave(vnode.el, performRemove, performLeave); } else { performLeave(); } }};move函数简略版,move函数次要负责元素的挪动,插入父元素。const move = (vnode, container, anchor, moveType, parentSuspense = null) => { const { el, type, transition, children, shapeFlag } = vnode; // 省略局部代码... if (needTransition) { if (moveType === 0 /* ENTER */) { // 执行过渡钩子 transition.beforeEnter(el); hostInsert(el, container, anchor); queuePostRenderEffect(() => transition.enter(el), parentSuspense); } else { const { leave, delayLeave, afterLeave } = transition; const remove = () => hostInsert(el, container, anchor); const performLeave = () => { leave(el, () => { remove(); afterLeave && afterLeave(); }); }; if (delayLeave) { delayLeave(el, remove, performLeave); } else { performLeave(); } } } // 省略局部代码...};通过下面的代码,能够晓得,Vue3是通过渲染器执行Transition组件自定义的钩子函数,来实现过渡成果的管制的。 ...

March 30, 2022 · 11 min · jiezi

关于vue.js:从零开始搭建Vue20项目一之快速开始

前言该样板实用于大型和庄重的我的项目,用于疾速搭建企业级的vue我的项目。 如果你只想尝试vue-loader或疾速制作出原型,请改用webpack-simple模板。 疾速开始要应用此模板,请应用vue-cli搭建我的项目。倡议应用npm 3+以取得更无效的依赖关系树。 $ npm install -g vue-cli$ vue init webpack my-project$ cd my-project$ npm install$ npm run dev 装置实现后,胜利运行: 我的项目构造.├── build/ # webpack配置文件│ └── ...├── config/│ ├── index.js # 次要我的项目配置│ └── ...├── src/│ ├── main.js # 利用入口文件│ ├── App.vue # 主应用程序组件│ ├── components/ # ui组件│ │ └── ...│ └── assets/ # 模块资源(由webpack解决)│ └── ...├── static/ # 纯动态资源(间接复制)├── test/│ └── unit/ # 单元测试│ │ ├── specs/ # 测试spec文件│ │ ├── index.js # 测试构建条目文件│ │ └── karma.conf.js # 测试跑步者配置文件│ └── e2e/ # e2e测试│ │ ├── specs/ # 测试spec文件│ │ ├── custom-assertions/ # e2e测试的自定义断言│ │ ├── runner.js # 测试跑步脚本│ │ └── nightwatch.conf.js # 测试跑步者配置文件├── .babelrc # babel 配置├── .postcssrc.js # postcss 配置├── .eslintrc.js # eslint 配置├── .editorconfig # editor 配置├── index.html # index.html模板└── package.json # 构建脚本和依赖关系前后端拆散的一个我的项目搭建的进度实现了1/3,下一步是配置跨域和申请,我是Java白羊,一只想做全栈的小羊,感激大家的观看ヾ(◍°∇°◍)ノ゙! ...

March 30, 2022 · 1 min · jiezi

关于vue.js:记录-antd-vue-表格复选框一列宽度更改

明天改我的项目款式的时候,发现用 width 无奈扭转antd vue 中 table 的复选框的宽度。 解决办法: 通过columnWidth属性来更改复选框一列的宽度后果: 更改胜利,复选框一栏宽度变小

March 29, 2022 · 1 min · jiezi

关于vue.js:Vue篇-保姆级搭建Vue项目教程

创立一个vue我的项目首先要有环境,咱们须要什么工具呢,如下 nodejsvue-cli如果有以上的工具就间接跳过装置教程。无的话跟着装置 一、 nodejs1、 去官网下载nodejs安装包,https://nodejs.org/en/,依据本人电脑去选要依照的版本,这里就不介绍了。装置也是一路next,装置到本人想要装置的地位。 2、 配置环境变量,开始菜单搜“环境变量”=》双击path=》新建=》node装置门路(依据本人理论状况来) 3、 win+R输出cmd查看是否装置胜利。(node -v npm -v) 二、 应用淘宝镜像(这样下载包的速度会快点)运行命令 npm install -g cnpm --registry=https://registry.npm.taobao.org 这样回头安装包的时候间接用cnpm就行了。 三、 装置vue-cli1、cnpm install vue-cli -g //全局装置 vue-cli如果没用淘宝镜像就是npm install vue-cli -g 2、查看是否装置胜利 四、 创立vue我的项目(办法一)抉择一个地位,你要寄存我的项目的门路,而后在此地位上cmd1、 首先装置vue/cli-init 为啥我上面是npm呢因为我装置的时候没装镜像,依据本人理论状况来就好。我上面就报错了,我就装置一下就好了2、 vue init webpack ”项目名称“ 3、 装置胜利 切换到我的项目目录而后运行 npm run dev。就ok了 我的项目目录: 五、 创立vue我的项目(办法二)1、 vue create 我的项目名 Default([Vue 3] babel, eslint)示意以Vue3为根底的模板,带eslint查看Default([Vue 2] babel, eslint)示意以Vue2为根底的模板,带eslint查看Manually select features 自定义配置留神:空格键是选中与勾销,A键是全选 TypeScript 反对应用 TypeScript 书写源码Progressive Web App (PWA) Support PWA 反对。Router 反对 vue-router 。Vuex 反对 vuex 。CSS Pre-processors 反对 CSS 预处理器。Linter / Formatter 反对代码格调检查和格式化。Unit Testing 反对单元测试。E2E Testing 反对 E2E 测试。( ) Babel //转码器,能够将ES6代码转为ES5代码,从而在现有环境执行。( ) TypeScript // TypeScript是一个JavaScript(后缀.js)的超集(后缀.ts)蕴含并扩大了 JavaScript 的语法,须要被编译输入为 JavaScript在浏览器运行( ) Progressive Web App (PWA) Support// 渐进式Web应用程序( ) Router // vue-router(vue路由)( ) Vuex // vuex(vue的状态管理模式)( ) CSS Pre-processors // CSS 预处理器(如:less、sass)( ) Linter / Formatter // 代码格调检查和格式化(如:ESlint)( ) Unit Testing //单元测试(unit tests)( ) E2E Testing // e2e(end to end) 测试(按需所取) 这些配置都依照本人的需要来,下一步细节配置,下图是我依据我的需要选的。 补:如果第一步全选话会呈现以下选项 ...

March 29, 2022 · 2 min · jiezi

关于vue.js:Echarts-折线图完全配置指南-手把手教你设置-Echarts-折线图详细教程

本文首发:《Echarts 折线图齐全配置指南》 Echarts 折线图是图表中最罕用的显示模式之一。应用 Echarts 做出根本的折线图很简略,但要是想把多组数据放在一张图表中,展现的丑陋又直观就不容易了。本文将率领大家从最根本的折线图,一步步欠缺,最终做出可读性很高的可视化图表。 依据本教程在卡拉云中搭建的折线图 Demo,你能够立刻注册卡拉云,追随本教程学习 追随本教程你将学到 1.折线外观属性 折线减少弧线平滑过渡折线图变为散状圆点实线改为虚线折线指定色彩减少数据显示表格外观属性鼠标滑过期,显示数据提示框鼠标滑过期,显示十字准心指示器鼠标滑过数据主动吸附设置 X 轴、Y 轴色彩设置 X 轴标签 45 度斜着显示设置图表背景色彩设置下载图表的功能键Echarts 折线图根底配置 本文应用低代码开发工具卡拉云作为 Echarts 折线图的演示工具,卡拉云内置包含 Echarts 图表组件在内数十种常见的前端组件,仅需拖拽即可生成。你无需懂任何前端常识,也能够疾速开发出属于本人的后盾工具。详情请见本文文末。 咱们从这个最简略的折线图动手,手把手教大家一步步学习。 option = { title: { text: '卡拉云新用户激活数据', subtext: 'Demo 虚构数据', x: 'center' }, legend: { orient: 'horizontal', x: 'left', y: 'top', data: ['猜测','预期','理论'] }, grid: { top: '20%', left: '3%', right: '10%', bottom: '5%', containLabel: true }, xAxis: { name: '月份', type: 'category', data: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月',] }, yAxis: { name: '人次', type: 'value', min:0, // 配置 Y 轴刻度最小值 max:4000, // 配置 Y 轴刻度最大值 splitNumber:7, // 配置 Y 轴数值距离 }, series: [ // 多组折线图数据 { name: '猜测', data: [454,226,891,978,901,581,400,543,272,955,1294,1581], type: 'line' }, { name: '预期', data: [2455,2534,2360,2301,2861,2181,1944,2197,1745,1810,2283,2298], type: 'line', }, { name: '理论', data: [1107,1352,1740,1968,1647,1570,1343,1757,2547,2762,3170,3665], type: 'line' } ], color: ['#3366CC', '#FFCC99','#99CC33'] }扩大浏览:《最好用的 7 款 Vue 富文本编辑器》 ...

March 29, 2022 · 5 min · jiezi

关于vue.js:Videojs-使用教程-手把手教你基于-Vue-搭建-HTML-5-视频播放器

本文首发:《Video.js 应用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器》 Video.js 是最弱小的网页嵌入式 HTML 5 视频播放器的组件库之一,也是大多数人首选的网页视频播放解决方案。简单的网页视频渲染,在引入 Video.js 后,轻松解决。本教程手把手教你搭建一套基于 Vue 的 Video.js 视频播放页。 追随本教程学习,最终你能够本人搭建一套能够播放本地视频文件及网络流媒体的网页视频播放器。学习如何批改 video.js 的默认款式来实现播放按钮自定义形态(圆形)、居中及播放工夫的显示与否, 如何播放 m3u8 格局,以及如何应用 video 的属性、事件及办法,音量增减,最终实现一个功能齐全的视频播放器。 追随本教程学习,搭建的最终 video.js HTML5 视频播放成果。 另外,这个世界曾经悄悄发生变化,当初基本无需写任何前端代码,间接应用卡拉云 —— 新一代低代码开发工具帮你搭建后盾工具,卡拉云可一键接入常见数据库及 API ,无需懂前端,内置欠缺的各类前端组件,无需调试,拖拽即用。原来三天的工作量,当初 1 小时搞定,谁用谁晓得,用上早上班,详见本文文末。 配置 Vue 环境 - 根底局部通过 npm 装置 Vue 脚手架 vue-cli npm install -g @vue/cli而后创立一个 Vue 我的项目 kalacloud-vue-video vue create kalacloud-video抉择适合的选项后,装置实现,通过 cd 命令进入 kalacloud-vue-video 目录(此目录为咱们的主开发目录),应用 npm run serve 命令,能够将我的项目运行起来。 在 Vue 中应用 videojs首先应用 npm 装置 video.js npm i video.js装置结束后,在 main.js 中进行引入 import videojs from "video.js";import "video.js/dist/video-js.css";Vue.prototype.$video = videojs;为了代码复用性,咱们来创立一个 PlayerVideo 组件。在组件中咱们别离定义 template 局部和 script 如下 最开始咱们选用默认源链接: https://playtv-live.ifeng.com...<!-- controls:向用户显示播放按钮控件 --><template> <video ref="video" class="video-js vjs-default-skin" width="600" height="400" controls > <source src="https://playtv-live.ifeng.com/live/06OLEGEGM4G.m3u8" /> </video></template>export default { data() { return { player: null, // 用来存储以后 video }; }, mounted() { // 渲染视频 this.player = this.$video(this.$refs.video); },};而后删除掉初始化 vue 我的项目默认的 App.vue 内代码,将 PlayerVideo 组件增加到 App 中,并调整播放器至两头。 ...

March 29, 2022 · 5 min · jiezi

关于vue.js:Vue3中的ref与toRef

咱们在应用vue3当中的composition api时,咱们将一个数据变成可响应式的数据时,咱们可能常常用的ref这个api,其实还存在一个toRef,这个api也能够将一个数据变成可响应式的。然而两者也存在着一些不同之处。 ref的用法: const nameRef = ref('lisa')toRef的用法: const obj = { name: 'lisa' }const nameRef = toRef(obj, 'name')你会发现toRef是须要传入两个参数,一个是指标对象,一个对象当中的属性名,它的返回后果就是属性名的可响应式数据。 你是否会感觉toRef的应用比ref麻烦许多,并且两者应用的目标是统一的,这个toRef存在就不是很有必要了。 然而,ref的原理是将穿进去的数据进行了拷贝,那就是说如果nameRef.value产生了变动,穿进去的数据是不会发生变化的。 而toRef就不是进行了拷贝操作,而是对其进行援用了,那么当你对nameRef.value的值产生扭转的时候,穿进去的数据也会相应的随之发生变化。 而两者还有一个不同之处,那就是toRef的值发生变化,然而UI界面是不会进行从新渲染,反之,应用ref的值产生了变动,UI界面是会进行从新渲染的。 综上所述:1、ref返回的值产生了变动,原始值不会变动;toRef返回的值产生了变动,原始值会变动。2、ref返回的值产生了变动,UI界面会进行从新渲染;toRef返回的值产生了变动,UI界面不会进行从新渲染。

March 28, 2022 · 1 min · jiezi

关于vue.js:Vue3当中的computed

咱们在应用vue3当中给咱们提供的api时,就像是computed,咱们通常就只会像上面这样应用: <script>import { computed } from 'vue'setup(props) { const testComputed = computed(() => test) return { testComputed }}</script>然而这样应用的话,失去的是一个readonly的数据 computed也存在另外一种用法。下面的办法,是给computed传入一个函数表达式,而咱们也能够给它传入一个对象模式的参数,就想上面的写法: <script>import { computed } from 'vue'setup(props) { const testComputed = computed({ get:()=> { return test }, set:(v) => { test = v } })}</script>当初的返回值就是一个可读写的数据了。

March 28, 2022 · 1 min · jiezi

关于vue.js:ModStartCMS模块化建站系统-v360-内容标签增强电脑手机适配

ModStartCMS是基于Laravel的全栈极速开发CMS框架,反对动静模型配置和多模板反对,轻松搭建CMS内容管理系统。 ModStartCMS公布v3.6.0版本,新性能和Bug修复累计10项,内容标签加强,电脑手机适配。 2022年03月28日ModStartCMS公布v3.6.0版本,减少了以下10个个性: ·[新性能] 启用拜访数量统计字段viewCount·[新性能] 内容搜寻减少标签搜寻,搜寻后果页面新增标签显示·[新性能] 新闻、招聘页面新增标签显示·[新性能] 首页切换器电脑端和手机端适配·[系统优化] 上传谬误时显示揭示错误信息·[系统优化] openbase_dir平安问题提醒优化·[系统优化] 上传谬误时显示揭示错误信息·[Bug修复] LayUI反复导入layer导致的弹窗抉择异样问题·[Bug修复] 一处递归寻找多级分类异样·[Bug修复] 受权登录手机端接口异样问题解决 ModStartCMS,基于 Laravel 模块化极速开发框架,基于 Apache 2.0 开源协定,收费且不限度商业应用。。 零碎演示: https://cms.demo.tecmz.com/ 下载试用: https://modstart.com/download

March 28, 2022 · 1 min · jiezi

关于vue.js:遍历数组中的数据的方法

var books = [{name:'西游记',author:'吴承恩',price: 58,count:5},{name:'三国演义',author:'罗贯中',price: 68,count: 6},{name:'水浒传',author:'施耐庵',price: 48,count:8},{name:'红楼梦',author:'曹雪芹',price: 78,count:10}](1) 通过for循环 计算总价格 let totalPrice = 0for(let i=0;i<this.books.length;i++) { this.totalPrice += this.books[i].price * this.books[i].count}(2) let totalPrice = 0for(let i in this.books) { this.totalPrice += this.books[i].price * this.books[i].count}(3) let totalPrice = 0for(let item of this.books) { // item为每一项的下标 totalPrice += item.price * item.count}(4) forEach let totalPrice = 0this.books.forEach(item => { totalPrice += item.price * item.count})(5) map 返回一个新数组 let totalPrice = 0this.books.map(item => { return totalPrice += item.price * item.count})

March 28, 2022 · 1 min · jiezi

关于vue.js:vue2双向数据绑定

双向数据绑定为vue2核心技术并且比较复杂,这里讲述下实现过程及简略源码在创立vue实例的时候vue做了三件事属性监听(Observe)属性代理(Obagent)末班编译(Compile)Observe: 为vue date上的属性增加get,set办法( 通过递归调用Object.defineProperty )注:此时每个vue实例上的属性被拜访或批改都会触发身上的getset办法,此为vue的数据劫持Obagent:通过Object.defineProperty来监听间接拜访和设置vm上的对象此时去拜访或设置vm data 上的对象注:Obagent只须要劫持顶层data上的数据Compile: 考录到循环渲染耗费性能 vue采取文档碎片的形式编译模板 注:文档碎片争议比拟大 新版非ie文档碎片的性能没问题,思考到这一点自己倡议应用模板字符串拼接的形式,在这里兼容了ie获取vue实例根节点(#app),挂在到vue实例上,通过递归的形式将根节点上所有子节点增加到文档碎片中(创立个空的文档碎片够细了吧)在递归增加文档碎片的过程中将vue data 上的值替换掉{{}},和v-model的值最初将文档碎片增加到根节点中此时实现了vue对实例上数据的渲染 vue 存在两个类 别离是 收集订阅者(Dep)和公布订阅者(Watcher)Dep:存储这所有的订阅者(watcher) 一个长期的target 和 增加wacher/更新调用watcher的办法watcher:属性有 vue实例 key 回调函数 和一个更新本人的办法收集所有的watcher在模板编译的时,在每次dom与vue 实例 data 上数据的响应 都会创立个watcher在每次创立watcher的时候,watcher指向Dep的target 而后通过触发get办法将watcher增加到sub汇合中( 触发get办法vue采纳一种取巧的形式,在每次创立watcher会携带个key,通过reduce万金油的办法去链式拜访这个值触发get办法,失去想要的后果在把dep上的target清空 )在页面数据批改的时候( set被触发时 )调用dep的notify 区循环调用watcher上的update( update 的回调会承受一个newValue,通过更新node节点达到双向绑定的成果 )

March 28, 2022 · 1 min · jiezi

关于vue.js:记录-VUE-子传父报错thisemit-is-not-a-function

报错信息: 报错起因: this指向问题我的项目里我的this指向的不是最外层的对象 Vue ,而是指向了所以无法访问到 $emit 办法解决办法: 最外层将 this 赋值给 _this而后再在监听函数中应用 this.$emit办法参考文章: https://www.freesion.com/arti...

March 28, 2022 · 1 min · jiezi

关于vue.js:swiper遇到的坑

申明对于swiper:1、Swiper 是一款收费以及轻量级的挪动设施触控滑块的js框架,应用硬件加速过渡(如果该设施反对的话)。次要应用于挪动端的网站、挪动web apps,native apps和hybrid apps。次要是为IOS而设计的,同时,在Android、WP8零碎也有着良好的用户体验,Swiper从3.0开始不再全面反对PC端。因而,如需在PC上兼容更多的浏览器,能够抉择Swiper2.x(甚至反对IE7)。2、vue-awesome-swiper是基于swiper的Vue组件。是swiper举荐的在vue中应用swiper的形式。 装置咱们在vue我的项目装置swiper时往往会应用npm i swiper命令进行装置,个别装置到的是最新版的swiper,从而会导致呈现这样的报错: 报错Module not found: Error: Can't resolve 'swiper/dist/css/swiper.css' in ...Module not found: Error: Can't resolve 'swiper/swiper-bundle.css' in ...这是因为版本变动导致css文件门路地位扭转 解决办法:卸载重新安装旧版本 npm uninstall swipernpm uninstall vue-awesome-swipernpm install swiper@4.5.1npm install vue-awesome-swiper@3.1.3总结:倡议一开始就装置vue-awesome-swiper 3.1.3版,装置对应的swiper版本 而后全副依照3.1.3版本的文档来应用即可。

March 26, 2022 · 1 min · jiezi

关于vue.js:vueelementUI写一个面包屑导航

废话少说,间接上代码。 页面布局代码: <div class="crumbsPage"> <el-breadcrumb separator="/"> <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item> <el-breadcrumb-item v-for="(item, index) in breadList" :key="index"> <span v-if="item.redirect === 'noRedirect' || index == breadList.length-1" >{{ item.meta.title }}</span> <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> </el-breadcrumb-item> </el-breadcrumb></div>js逻辑解决 export default { name: "crumbsPage", data() { return { breadList: [] }; }, watch: { $route() { this.getBreadcrumb(); } }, methods: { getBreadcrumb() { if (Object.keys(this.$route.matched[0].meta).length > 0) { this.breadList = this.$route.matched; } else { this.breadList = []; } }, handleLink(item) { this.$router.push(item.path); } }};好了,最简略的面包屑导航曾经实现了。 ...

March 25, 2022 · 1 min · jiezi

关于vue.js:vueelementUI表格多选操作后多选框依旧是选中状态问题解决

elementUI表格多选做批量解决时,如果在弹出框选中勾销时,敞开弹窗,这时须要把选中的状态全副复原,始终没有找到好的方法,前几天看文档,发现官网曾经有提供的办法,只是始终没有仔细观看文档,记录下。 只须要给表格加一个ref,而后在勾销时执行下边的代码即可。 this.$refs.dataTable.clearSelection();一句话搞定,还是要多看文档啊!!!

March 25, 2022 · 1 min · jiezi

关于vue.js:vuejs-类gannt图支持左右上下虚拟列表性能还能用demo简单做个记录

原本想网上找个相似的gannt图的插件用,然而根本不满足需要或者太重了,本人简略实现了一个,只是简略的demo,应该能够作为参考用吧! 解决了本人的需要问题:1、解决大数据绘图卡顿(导致点击,弹出层都会卡顿问题)2、实现高低、左右都能够虚构列表(大部分虚构列表列表只高低滚动或者左右滚动)3、安卓,ios 嵌入webview皆可应用4、mac os 触摸板左滑返回问题 地址:https://github.com/522011796/... 仅仅只是个demo,还存在一些问题预计,可供参考

March 23, 2022 · 1 min · jiezi

关于vue.js:Vue3-的图片懒加载自定义指令

以下文章来源于老黄的前端私房菜 ,作者黄轶黄老师背景 家喻户晓,Vue.js 的核心思想是数据驱动 + 组件化,通常咱们开发页面的过程就是在编写一些组件,并且通过批改数据的形式来驱动组件的从新渲染。在这个过程中,咱们不须要去手动操作 DOM。 然而在有些场景下,咱们还是防止不了要操作 DOM。因为 Vue.js 框架接管了 DOM 元素的创立和更新的过程,因而它能够在 DOM 元素的生命周期内注入用户的代码,于是 Vue.js 设计并提供了自定义指令,容许用户进行一些底层的 DOM 操作。 举个理论的例子——图片懒加载。图片懒加载是一种常见性能优化的形式,因为它只去加载可视区域图片,能缩小很多不必要的申请,极大的晋升用户体验。 而图片懒加载的实现原理也非常简单,在图片没进入可视区域的时候,咱们只须要让 img 标签的 src 属性指向一张默认图片,在它进入可视区后,再替换它的 src 指向实在图片地址即可。 如果咱们想在 Vue.js 的我的项目中实现图片懒加载,那么用自定义指令就再适合不过了,那么接下来就让我手把手带你用 Vue3 去实现一个图片懒加载的自定义指令 v-lazy。 插件为了让这个指令不便地给多个我的项目应用,咱们把它做成一个插件: const lazyPlugin = { install (app, options) { app.directive('lazy', { // 指令对象})}} export default lazyPlugin而后在我的项目中援用它: import { createApp } from 'vue'import App from './App.vue'import lazyPlugin from 'vue3-lazy' createApp(App).use(lazyPlugin, { // 增加一些配置参数})通常一个 Vue3 的插件会裸露 install 函数,当 app 实例 use 该插件时,就会执行该函数。在 install 函数外部,通过 app.directive 去注册一个全局指令,这样就能够在组件中应用它们了。 ...

March 23, 2022 · 4 min · jiezi

关于vue.js:后端功能快速入门生成代码

生成代码如下图所示,点击生成代码,即可为此业务表生成后端治理代码。如提醒代码生成胜利,零碎将主动刷新页面,载入新的菜单。抉择【人事管理】->【员工治理】即可治理员工信息 通过下面的操作咱们能够疾速实现员工的增删改查操作。

March 22, 2022 · 1 min · jiezi

关于vue.js:后端功能快速入门创建员工字段

字段治理业务菜单“员工治理”创立后,查看数据库能够发现,零碎主动创立了新表:cd_hr_emp,此表只有一列emp_id。为了保留更多的数据,咱们须要为此菜单定义更多的字段。选中“员工治理”点击顶部“字段治理”按钮,就能够为员工表创立更多的字段了。零碎为任何一个新建的业务表都会主动创立默认字段,当咱们治理字段时,会主动创立。 创立字段创立字段的界面如下:定义一个字段须要定义三个必填项:字段题目,字段名称,字段类型字段题目:字段在增删改查的时候的字段名称字段名称:数据库表列的名字字段类型:用于定义减少和批改表单元素的不同类型,在本平台上代表如何展现,录入和批改数据。其都默认定义了数据库表字段的数据类型。其余定义我的项目的阐明:默认值:此字段不提供值的时候默认为此字段提供的值。创立字段:“是”或者“否”,如果是不创立字段,咱们称之为虚构字段,经常与表链接无关,前面讲详细描述显示状态:用于设置是否在列表、表单中展现这个字段脱敏展现:次要用于敏感数据的脱敏展现,个别为身份证,手机号等进行设置。验证形式:设置此列不为空(is not null)和惟一(unique)束缚可录入:是否蕴含在录入表单中验证规定:表单验证规定,默认反对手机号,身份证,邮箱等规定,也能够自定义规定数据结构:定义此字段在数据库中的数据类型。字段长度:定义此字段在数据库中的类型的默认长度字段索引:定义此字段在数据库中是否创立索引,以及创立什么类型的索引字段阐明:用于开发人员间的字段阐明和正文。表单阐明:定义form表单中字段的说明性文字。如上图所示,创立了新字段“姓名”,字段名为“name”,数据类型为“varchar”,字段长度为“250” 创立性别字段性别字段存储的就是0/1或者1/2这种标记,实际上表单中体现可能是单选框或者下拉框。在创立字段的时候是能够间接定义的。下图就是创立性别字段的例子;单选框类型的字段,能够通过预约义的选项配置定义选项,也能够通过SQL数据源进行定义选项。因为,性别这类数据内容绝对固定,所以适宜采纳选项配置的形式。 创立生日字段生日的录入须要用到工夫选择器,这里抉择字段类型为“日期框”即可。具体存储的日期类型,反对下图所示的类型,请别离测试体验。依据下面的阐明,能够创立更多的字段,这里就不再一一列举了。咱们将最终定义的字段列表展现进去。 数据库中的字段 菜单中的字段 生成代码如下图所示,点击生成代码,即可为此业务表生成后端治理代码。如提醒代码生成胜利,零碎将主动刷新页面,载入新的菜单。抉择【人事管理】->【员工治理】即可治理员工信息

March 22, 2022 · 1 min · jiezi

关于vue.js:后端功能快速入门创建员工菜单

实现员工治理性能比方这里咱们创立一个员工表,实现增加,批改,删除员工信息。 创立菜单“菜单”在本疾速开发零碎中能够看做是一个业务表,或者一个与多个表关联的业务表。通过创立菜单操作,能够进行各个方面的设置。点击左侧菜单【菜单治理】上图所示,菜单分为两种状况: 目录性能菜单:只是菜单中的父菜单名称而已,不代表任何业务。业务性能菜单:对应一个业务性能。创立菜单目录为了治理员工,咱们创立“人事管理”目录菜单。如下图所示,为了仅仅创立目录,而不要创立数据库表,【生成代码】必须抉择“否”;【创立数据表】必须抉择“否”。 创立业务菜单创立治理员工的业务菜单。如下图所示,父菜单目录为“人事管理”,菜单名为“员工治理”。拜访门路:Hr/Emp;输出拜访门路后,会主动生成产生的Vue组件的门路。组件门路:admin/hr/emp/index.vue表名:主动生成表名,规定是拜访门路的小写字母,并用下划线连贯。主键ID:表的主键列名创立数据库表:因为是业务表,须要操作数据,所以抉择“是”抉择链接库:如果是采纳多库操作,这里能够抉择特定的链接,默认不须要操作。页面构造:零碎反对三种页面构造: el-table列表:采纳Element-UI的表格组件,因其大量数据的性能堪忧,还有第二个抉择。ag-grid列表:采纳ag-grid收费性能,实现El-table相似的性能,特点是大量数据操作性能良好。form表单:即配置页面,能够向表中存储数据,参照【根本配置】页面

March 22, 2022 · 1 min · jiezi

关于vue.js:关于前后端分离及初始化配置

一个Web利用零碎前端和后端有两种合作形式: 服务端渲染:服务端将网页间接生成,浏览器拿到的是残缺的网页,其中是蕴含数据的。前后端拆散:浏览器拿到HTML页面,而后再和后端通信取得数据。两者相比拟各有优缺点: 数据量,绝对于服务端渲染,前后端拆散中只传输数据,而服务端渲染相比传输的数据量会大一些。体验:前后端拆散相比服务端渲染多了一个数据渲染的过程,所以,前后端拆散可能呈现首屏渲染问题。耦合:前后端拆散传输的是数据,前端只负责申请和渲染数据,提供数据由后端实现。服务端渲染传输的是HTML蕴含数据,也就是服务端渲染要把所有事件都做了。交互管制:网页间存在跳转交互,前后端拆散中其页面管制齐全由前端实现。SEO:前后端拆散通常采纳SPA形式,对网页爬虫不敌对。前后端拆散的逻辑是前端人员只关怀前端页面和性能的实现,后端人员只对外提供一个api接口,而后和前端约定好数据格式之后,前后端开发人员就能够各干各的,互不烦扰。前端人员只须要依据后端人员提供的api接口,获取数据并在前端展现,而后端人员只须要依照约定的数据格式,封装数据,并提供接口。 RDS疾速开发零碎前后端拆散介绍 后端系统为规范的Thinkphp我的项目 前端零碎为规范的Vue我的项目ui目录内的内容如下: 我的项目配置无论是通过下载 或者 git clone 取得的源码,都须要进行依赖装置。因为前端后拆散,即前端是独立的我的项目(vue我的项目),后端也是独立的我的项目(thinkphp我的项目)所以,须要别离为其我的项目装置依赖。 前端依赖装置// 进入我的项目目录cd uiyarn install 或者 npm install后端依赖装置// 进入我的项目目录composer install数据库配置首先创立数据库,假如我的项目数据库为 my_rds: // 应用命令行或者数据库客户端执行如下命令CREATE DATABASE my_rds DEFAULT CHARACTER SET utf8mb4;导入数据库定义文件应用数据库客户端导入data.sql文件默认我的项目根目录下没有环境配置文件。须要创立环境配置文件: touch .env// 文件内容APP_DEBUG = true[APP]DEFAULT_TIMEZONE = Asia/Shanghai[LANG]default_lang = zh-cn[DATABASE]type = mysqlhostname = 127.0.0.1database = database_nameusername = usernamepassword = passwordhostport = 3306charset = UTF8prefix = cd_配置文件中设置的数据库登录信息,须要和理论服务器环境保持一致。 其余配置我的项目根目录下的/config/my.php,能够配置诸多选项。 反对配置单设施登录或者多设施登录: multiple_login (config/my.php)反对验证码的开关: verify_status (config/my.php)应用短信验证码:批改“短信网关”局部 (config/my.php)应用云存储:批改“云存储”局部开发微信小程序:mini_program (config/my.php)开发微信公众号利用:official_accounts (config/my.php)开发微信领取利用:wechat_pay (config/my.php)反对系统维护中的数据库备份:mysqldump (config/my.php)默认状况,以上选项大部分都没有具体配置。 本地开发留神:为了可能进行代码生成,目录ui是不能改名的。 命令行中切换到我的项目目录,启动thinkphp我的项目:php think run命令行中切换到ui目录下。启动前端vue我的项目:npm run serve这样就能够开发了,无论是批改前端还是后端,都能够立刻在浏览器中看见。在下面的步骤3,就是启动后端我的项目。默认监听8000端口,如果你的不是,请通过-p参数设置 ...

March 22, 2022 · 1 min · jiezi

关于vue.js:关于RDS快速开发系统

通过本零碎的理解和应用,能够疾速的进行业务开发,大大提高开发效率。理论开发中有很多的业务代码是重复性的,其原理是雷同的,只是不同的业务表会存在具体数据的不同,RDS疾速开发零碎,将这种重复性的内容进行抽取,通过对业务表的定义,能够疾速实现业务开发。 一键生成CRUD代码通过对业务表的定义,能够主动生成此业务表数据的增删改查。如下图所示,为业务表的定义:如下图所示,为通过定义业务表,生成的CRUD界面 丰盛的操作方法除了惯例的增删改查操作外,还有其余常见操作方法,比方导入,导出,批改明码,设置值,跳转链接,弹窗链接等。能够疾速实现罕用性能。 罕用Form表单零碎提供了罕用的表单类型,能够实现输入框,单/复选,文本域,文件/图片上传,富文本编辑器等 一键生成API接口针对业务表的API接口生成能够通过复制后端业务表,主动生成API接口,同时能够生成API接口参考文档。生成的API接口反对Token认证,短信验证,数据缓存等反对。 表格性能及状态放弃零碎反对element-ui的表格和ag-grid表格;el-table是零碎默认的表格,针对体现简单且数据量不大的状况。ag-grid表格,次要针对大量数据的查问和过滤。如果领有ag-grid商业许可证,能够充分利用ag-grid的弱小性能。 表格状态放弃无论是el-table还是ag-grid,零碎都反对保留列的显示和暗藏,列的宽度,分页大小。用户一旦设置了列的暗藏或显示,设置列宽,设置分页大小,零碎都将主动存储这些设置。 标签栏状态放弃关上的标签栏,会在页面刷新后持续放弃,不会因为页面刷新导致标签生效。 零碎UI设置放弃能够依据本人终端的分辨率及显示大小,设置零碎UI 首页统计与快捷启动器零碎首页能够展现罕用操作零碎首页能够通过定义SQL查问语句,实现统计数据的首页显示。能够定义统计卡片,图图表(折线图,柱状图,饼状图) 顶部菜单设置顶级菜单展现零碎次要性能菜单在零碎的侧栏,反对三级菜单;为适配更多的菜单性能,零碎反对在顶部展现一级菜单,点击后侧栏展现此一级菜单的子菜单。 快捷启动菜单展现零碎顶部能够展现首页显示的快捷菜单。上述两项性能,只能二选一。 敌对的二次开发反对自定义的业务表生成的业务代码以独立的文件存在,能够设置生成的代码是否笼罩旧代码,能够释怀的在生成的代码上进行批改,而不必放心代码被笼罩掉(后端代码);前端代码为防止笼罩能够将代码改名存储,而后敞开前端代码的生成操作即可不便的进行二次开发。

March 22, 2022 · 1 min · jiezi

关于vue.js:vue-生命周期简述

Vue2,Vue3 的生命周期比拟多。 以下是Vue3生命周期的内容:setup() :开始创立组件之前,在beforeCreate和created之前执行。创立的是data和methodonBeforeMount(): 组件挂载到节点上之前执行的函数。onMounted(): 组件挂载实现后执行的函数。onBeforeUpdate(): 组件更新之前执行的函数。onUpdated(): 组件更新实现之后执行的函数。onBeforeUnmount(): 组件卸载之前执行的函数。onUnmounted(): 组件卸载实现后执行的函数。onActivated(): 比方从 A 组件,切换到 B 组件,B 组件激活时执行。onDeactivated(): 比方从 A 组件,切换到 B 组件,A 组件隐没时执行。onErrorCaptured(): 当捕捉一个来自子孙组件的异样时激活钩子函数。注:应用<keep-alive> 组件会将数据保留在内存中,比方咱们不想每次看到一个页面都从新加载数据,就能够应用组件解决。vue3应用生命周期须要独自从vue中援用,并且只能在setup函数内调用 因为vue2比拟容易了解,且与vue3基本上没有区别,所以只解释vue3生命周期,vue2参考vue3。以下为两者生命周期比照: Vue2--------------vue3beforeCreate -> setup()created -> setup()beforeMount -> onBeforeMountmounted -> onMountedbeforeUpdate -> onBeforeUpdateupdated -> onUpdatedbeforeDestroy -> onBeforeUnmountdestroyed -> onUnmountedactivated -> onActivateddeactivated -> onDeactivatederrorCaptured -> onErrorCaptured

March 22, 2022 · 1 min · jiezi

关于vue.js:Vue项目启动方式

March 22, 2022 · 0 min · jiezi

关于vue.js:通过vue3学习react17二-父组件调用子组件方法Refts

明天次要学习ref办法去调用子组件的办法, react hook和vue 单文件都应用到 喜爱的能够点赞 ReactuseRef 仅能用在 FunctionComponent,createRef 仅能用在 ClassComponent。 应用useRef子组件(Child.tsx)# Child.tsxexport interface ChildProps { count: number; setCount: (params: ChildProps["count"]) => void;}const Child = (_props: any, ref: any) => { let [count, setCount] = useState(0); useImperativeHandle(ref, () => ({ count, setCount, })); return ( <div> <p>{count}</p> </div> );};export default Child;# orexport interface ChildProps { count: number; setCount: (params: ChildProps["count"]) => void;}interface refInterface { cRef: React.MutableRefObject<ChildProps | undefined>;}const Child: React.FC<refInterface> = (props) => { const { cRef } = props; let [count, setCount] = useState(0); useImperativeHandle(cRef, () => ({ count, setCount, })); return ( <div> <p>{count}</p> </div> );};export default Child;父组件(Parent.tsx)# Parent.tsxfunction Parent() { const childRef = useRef<ChildProps>(); const updateChildState = () => { // changeVal就是子组件裸露给父组件的办法 childRef.current?.setCount(childRef.current?.count + 1); }; return ( <div> <Child ref={childRef}></Child> <button onClick={updateChildState}>按钮</button> </div> );}createRef子组件(Child.tsx)import React, { useState } from "react";interface ChildInterface { count: number;}class Child extends React.Component<unknown, ChildInterface> { constructor(props: React.FC) { super(props); this.state = { count: 0, }; } render() { return ( <div> <p>{this.state.count}</p> </div> ); } setCount = (params: number) => { this.setState({ count: params, }); };}export default Child;父组件(Parent.tsx)import Child from "./Child";class Parent extends React.Component { childRef: RefObject<Child>; // childRef: LegacyRef<Child> | undefined; constructor(props: React.FC) { super(props); this.childRef = createRef(); } render() { return ( <div> <Child ref={this.childRef}></Child> <button onClick={this.updateChildCount}>按钮</button> </div> ); } updateChildCount = () => { let { setCount, state } = this.childRef.current as Child; setCount(state.count + 1); };}export default Parent;Vue3父组件兼容二个写法 ...

March 22, 2022 · 2 min · jiezi

关于vue.js:ModStartCMS-Laravel9-模块化建站系统-v350-多图字段支持系统优化升级

ModStartCMS是基于Laravel的全栈极速开发CMS框架,反对动静模型配置和多模板反对,轻松搭建CMS内容管理系统。 ModStartCMS Laravel9公布v3.5.0版本,新性能和Bug修复累计24项,多图字段反对,系统优化降级。 2022年03月21日ModStartCMS Laravel9公布v3.5.0版本,减少了以下24个个性: ·[新性能] 栏目默认分页可配置 ·[新性能] 表单减少 LayoutTab 布局,可多 Tab 切换 ·[新性能] 模块配置 suggest 配置,倡议装置模块 ·[新性能] 集成 XGPlayer 视频播放器 ·[新性能] 文件上传减少 MD5 文件字段,不便去重解决 ·[新性能] 后盾链接抉择找回明码 ·[新性能] 模型新增多图字段类型 ·[新性能] 用户VIP页面不登录拜访不受限 ·[新性能] 用户VIP界面优化,减少主题目和副标题 ·[新性能] 后盾利用详情显示零碎名称 ·[新性能] UEditor 粘贴图片主动上传性能 ·[新性能] 非凡空白字符解决 ·[系统优化] 内容页面编辑布局优化 ·[系统优化] layer 屡次引入导致的显示问题 ·[系统优化] 后盾界面显示优化降级 ·[系统优化] 优化弹窗反复导入的异样问题 ·[系统优化] 表格无数据时内容优化(减少图标) ·[系统优化] 表格刷新主动跳转到顶部优化 ·[系统优化] 标签款式显示方式 ·[Bug修复] 后盾链接抉择同类别不能主动合并问题 ·[Bug修复] 后盾浮动确定区域左侧宽度问题调整 ·[Bug修复] 内容模板治理中曾经设置列表显示然而理论当中无奈显示 ·[Bug修复] 内容列表页侧导航反对排序问题 ·[Bug修复] 内容列表文件、日期字段显示异样问题 ModStartCMS Laravel9,基于 Laravel 9 模块化极速开发框架,基于 Apache 2.0 开源协定,收费且不限度商业应用。 ...

March 22, 2022 · 1 min · jiezi

关于vue.js:env-文件配置详解

.env 文件配置文件阐明.env:全局默认配置文件,无论什么环境都会加载合并。 .env.development:开发环境的配置文件 .env.production:生产环境的配置文件 .env.test:测试环境的配置文件 留神:前三个文件的文件名必须按下面形式命名,不能乱起名,否则读取不到文件。内容格局NODE_ENV=productionVUE_APP_BAIDU_URL=https://www.baidu.comVUE_APP_VARIABLE_XXX= '66666'NODE_ENV 通常这个变量用来辨别开发与生产环境,加载不同的配置。 留神:属性名必须以 VUE_APP_ 结尾,如:VUE_APP_XXX加载vue 会依据启动命令主动加载绝对应的环境配置文件。 开发环境加载 .env 和 .env.development 。 生成环境加载 .env 和 .env.production 。 测试环境加载 .env 和 .env.test 。 优先级环境配置文件 > 全局配置文件 当全局的配置文件和环境的配置文件有雷同配置项时,环境的配置项会笼罩全局的配置项 应用process 对象是一个 global (全局变量),提供无关信息,管制以后 Node.js 过程。 能够应用 process.env.xxx 来拜访属性。 例子vue.config.js process.env.NODE_ENV // testprocess.env.VUE_APP_BAIDU_URL // https://www.baidu.comprocess.env.VUE_APP_VARIABLE_XXX // '66666'.env.test文件 NODE_ENV=testVUE_APP_BAIDU_URL=https://www.baidu.comVUE_APP_VARIABLE_XXX= '66666'package.json配置 "scripts": { "serve": "vue-cli-service serve", "build:test": "vue-cli-service build --mode test", "build": "vue-cli-service build", },打包 npm run build:test# ORyarn build:test

March 21, 2022 · 1 min · jiezi