关于vue.js:从函数式组件引发的性能思考

简介vue函数式组件大部分人在开发过程中用到的不多,就连官网文档地位搁置的也比拟费解,然而在咱们对我的项目做性能优化时,却是一个不错的抉择。本文将对函数式组件初始化过程做一个系统性的论述,通过本文,你将理解到以下内容: 什么是函数式组件函数式组件与一般组件间的差别vue类似性能优化点什么是函数式组件函数式组件即无状态组件,没有data、computed、watch,也没有生命周期办法,组件中也没有this上下文,只有props传参。在开发中,有很多组件仅仅只用到了props和插槽,这部分组件就能够提炼为函数式组件。借用官网demo,最简略的函数式组件如下: Vue.component('my-component', { functional: true, // Props 是可选的 props: { // ... }, // 为了补救短少的实例 // 提供第二个参数作为上下文 render: function (createElement, context) { // ... }})函数式组件与一般组件间的差别组件实例化过程大抵分为四步,状态初始化 --> 模板编译 --> 生成VNode --> 转换为实在DOM。接下来比照一般组件与函数式组件罕用配置项,比拟下差别。 性能点名称一般组件函数式组件形容vmYN组件作用域hooksYN生命周期钩子dataYN数据对象申明computedYN计算属性watchYN侦听器propsYY属性childrenYYVNode 子节点的数组slotsYY一个函数,返回了蕴含所有插槽的对象scopedSlotsYY作用域插槽的对象injectionsYY依赖注入listenersYY事件监听parentYY对父组件的援用从上表中能够看出,一般组件与函数式组件最大的差异在于函数式组件没有独立作用域,没有响应式数据申明。没有独立作用域,会有以下长处: 没有组件实例化(new vnode.componentOptions.Ctor(options)),函数式组件获取VNode仅仅是一般函数调用 无公共属性、办法拷贝无生命周期钩子调用函数式组件间接挂载到父组件中,缩短首次渲染、diff更新门路 函数式组件在父组件生成VNode时,函数式组件render办法会被调用,生成VNode挂载到父组件children中,patch阶段可间接转换成真是DOM,一般组件则在createElm时,走组件初始化流程。diff更新时,函数式组件调用render,间接创立一般VNode,而一般组件创立的VNode的是蕴含组件作用域的,diff操作时,还有额定调用updateChildComponent更新属性、自定义事件等,调用链路会比拟长。vue性能优化点函数式组件带来的性能晋升次要体现在缩短渲染门路与缩小组件嵌套层级,前者与浏览器重绘回流有殊途同归之处,后者能够升高工夫复杂度。 无论何种性能优化,能从代码层面做优化的,无疑是代价最小的,尽管有时成果不是很显著,然而千里之行;始于足下。在vue中,有不少与上述类似的点,能够晋升代码执行效率。 正当申明data中数据,确保data中申明数据都是必须的很多时候有一些数据没必要申明在data中,比方须要组件内共享,但不须要响应式解决的数据。data中的数据,对象都会对其深度优先用Object.defineProperty申明,数组也会拦挡基本操作办法。不必要的申明会造成无意义的数据劫持。 正当应用computed与watchcomputed与watch最大的区别在于computed是惰性加载的。惰性加载次要体现在两个方面: 依赖状态产生扭转时,不会立刻触发,只是扭转以后Watcher实例的dirty属性值为true当对计算属性值取操作时,当且仅当watcher.dirty === true时,才会触发计算以上两点个性,可能防止一些不必要的代码执行,具体代码如下所示: // src\core\instance\state.jsfunction createComputedGetter (key) { return function computedGetter () { // 获取实例上的computed属性的watcher实例 const watcher = this._computedWatchers && this._computedWatchers[key] if (watcher) { // 当且仅当computed依赖属性发生变化 && 对计算属性进行取操作,才会调用Watcher的update办法,将dirty置为true if (watcher.dirty) { // 调用get办法,获取到computed的值 watcher.evaluate() } if (Dep.target) { watcher.depend() } return watcher.value } }}// src\core\observer\watcher.jsupdate () { // computed watcher lazy === true if (this.lazy) { // 标记懒执行是否可执行状态,false不执行计算属性计算 this.dirty = true } else if (this.sync) { // 同步执行 this.run() } else { // 将以后watcher放入到watcher队列 queueWatcher(this) }}v-for绑定key值v-for循环定义key值目标是便于精准找到diff比对节点,防止一些无意义的比对。 ...

July 17, 2021 · 1 min · jiezi

关于vue.js:Vue自定义组件使用Elementui表单校验

个别状况下(form中的组件都是element提供的组件)在应用elm的表单校验时咱们是这么应用的: // 栗子.vue<template> <el-form :model="formData" :rule="rules" ref="formRef"> <el-form-item prop="inputValue"> <el-input v-model="formData.inputValue"></el-input> </el-form-item> <el-form-item> <el-button @click="submit">提交</el-button> </el-form-item> </el-form></template><script>export default { .......省略 data() { return { formData: { inputValue: '' }, rules: { inputValue: [ { required: true, message: '请输出流动名称', trigger: 'blur' }, ] } } }, methods: { submit() { this.$refs.formRef.validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } }); } }}</script> 然而当咱们在<el-form-item>组件中增加自定义的组件时,你还持续依照下面这中用法是有效的,翻阅element-ui源码就能发现其中起因。 element-ui的form组件的表单验证是由<el-form-item>组件配合触发的,在el-form-item中的源码如下: // el-form-item源码mounted() { if (this.prop) { this.dispatch('ElForm', 'el.form.addField', [this]); let initialValue = this.fieldValue; if (Array.isArray(initialValue)) { initialValue = [].concat(initialValue); } Object.defineProperty(this, 'initialValue', { value: initialValue }); this.addValidateEvents(); // 增加校验事件 }},methods: { onFieldBlur() { // blur 事件回调 this.validate('blur'); // 触发validate }, onFieldChange() { // change事件回调 if (this.validateDisabled) { this.validateDisabled = false; return; } this.validate('change'); // 触发validate }, addValidateEvents() { const rules = this.getRules(); if (rules.length || this.required !== undefined) { this.$on('el.form.blur', this.onFieldBlur); // ****重点****:监听el.form.blur事件,执行onFieldBlur回调 this.$on('el.form.change', this.onFieldChange); } }, validate(trigger, callback = noop) { // 校验办法 this.validateDisabled = false; const rules = this.getFilteredRule(trigger); // 过滤合乎校验触发事件的校验对象 if ((!rules || rules.length === 0) && this.required === undefined) { callback(); return true; } this.validateState = 'validating'; // 切换校验状态 const descriptor = {}; if (rules && rules.length > 0) { rules.forEach(rule => { delete rule.trigger; // 删除rule对象里的trigger属性,因为validator.validate的配置项里不须要trigger属性 }); } descriptor[this.prop] = rules; const validator = new AsyncValidator(descriptor); // 实例化校验器 const model = {}; model[this.prop] = this.fieldValue; validator.validate(model, { firstFields: true }, (errors, invalidFields) => { // 校验 this.validateState = !errors ? 'success' : 'error'; // 切换校验状态 this.validateMessage = errors ? errors[0].message : ''; callback(this.validateMessage, invalidFields); this.elForm && this.elForm.$emit('validate', this.prop, !errors, this.validateMessage || null); // 向外裸露validate事件,就是element-ui form组件API文档里的validate事件 }); }}从源码能够看出,<el-form-item>组件触发校验的办法是validate,而这个办法须要在onFieldBlur和onFieldChange这两个回调函数里触发,而这两个函数的触发形式是通过在addValidateEvents中监听el.form.blur和el.form.change事件来触发(源代码:this.$on('el.form.blur', this.onFieldBlur)),所以归根结底是要触发这两个事件。 ...

July 17, 2021 · 3 min · jiezi

关于vue.js:使用VueDataVECharts打造新冠肺炎疫情数据大屏可动态刷新

原文地址:应用Vue+DataV+Echarts打造新冠肺炎疫情数据大屏(可动静刷新) 源码查看:https://blog.lanweihong.com/posts/29267/ 效果图演示仅适配 1080P 屏幕,应用浏览器拜访后按 F11 进入全屏可看最佳显示成果。 疫情实在数据演示地址:演示地址-实在数据模仿数据演示地址:演示地址-模仿数据 前端框架和类库Vue.jsApache EChartsDataVaxiosElementMock代码实现创立我的项目应用 Vue Cli 创立 Vue 我的项目,没有 Vue Cli 的应用以下命令装置: npm install -g @vue/cli创立我的项目: vue create datav-covid-19装置依赖# 装置 DataVnpm install @jiaminghi/data-view# 装置 echartsnpm install echarts -S# 装置 element-uinpm i element-ui -S# 装置 vue-routernpm install vue-router# 装置 mockjsnpm install mockjs --save-dev# 装置 axiosnpm install axios# 装置 echarts-liquidfillnpm i echarts-liquidfill引入注册在我的项目中引入,编辑 main.js: import Vue from 'vue'import App from './App.vue'import dataV from '@jiaminghi/data-view'import * as echarts from 'echarts'import 'element-ui/lib/theme-chalk/index.css';import axios from 'axios'// 引入 echarts 水球图import 'echarts-liquidfill'import VueRouter from 'vue-router'import { Icon, Row, Col, Table, TableColumn, Button, Dialog, Link} from 'element-ui';// 注册 echartsVue.prototype.$echarts = echartsVue.config.productionTip = false// 注册 axiosVue.prototype.axios = axios// 注册 dataVVue.use(dataV)// 注册路由Vue.use(VueRouter)// 按需注册其余 element-ui 组件Vue.use(Icon)Vue.use(Row)Vue.use(Col)Vue.use(Table)Vue.use(TableColumn)Vue.use(Button)Vue.use(Dialog)Vue.use(Link)new Vue({ render: h => h(App),}).$mount('#app')编写组件因为篇幅无限,为了浏览体验,这里以 累计排名 组件为例,其余的组件请看 Github 上的代码。 ...

July 16, 2021 · 5 min · jiezi

关于vue.js:vsCode插件-zreader-笔趣阁-搜索无效-bug修复

最近笔趣阁的搜寻性能呈现了403 forbidden的问题 于是导致vsCode插件z-reader在线查问笔趣阁文章时有效 看了下源码简略的改了下 将搜寻页面应用m.biquge.com替换 并批改元素抓取js后胜利修复 这里分享一下办法: 1.找到z-reader本地门路C:\Users\XXXX.vscode\extensions\aooiu.z-reader-1.0.3 2.批改其中 \out\reader\driver\biquge\index.js 而后保留 3.从新关上vsCode或者new Window至此功败垂成 这里附上代码 "use strict";var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); });};Object.defineProperty(exports, "__esModule", { value: true });const got = require("got");const cheerio = require("cheerio");const TreeNode_1 = require("../../../explorer/TreeNode");const DOMAIN = 'https://www.sobiquge.com';const DOMAIN_M = 'https://m.sobiquge.com';class ReaderDriver { hasChapter() { return true; } search(keyword) { return __awaiter(this, void 0, void 0, function* () { const result = []; try { const res = yield got(DOMAIN_M + '/search.php?q=' + encodeURI(keyword)); const $ = cheerio.load(res.body); $('.result-list .result-item.result-game-item').each(function (i, elem) { const title = $(elem).find('a.result-game-item-title-link span').text(); //const author = $(elem).find('.result-game-item-info .result-game-item-info-tag:nth-child(1) span:nth-child(2)').text(); const path = $(elem).find('a.result-game-item-pic-link').attr().href; result.push(new TreeNode_1.TreeNode(Object.assign({}, TreeNode_1.defaultProblem, { type: '.biquge', name: `${title}`, isDirectory: true, path }))); }); } catch (error) { console.warn(error); } return result; }); } getChapter(pathStr) { return __awaiter(this, void 0, void 0, function* () { const result = []; try { const res = yield got(DOMAIN + pathStr); const $ = cheerio.load(res.body); $('#list dd').each(function (i, elem) { const name = $(elem).find('a').text(); const path = $(elem).find('a').attr().href; result.push(new TreeNode_1.TreeNode(Object.assign({}, TreeNode_1.defaultProblem, { type: '.biquge', name, isDirectory: false, path }))); }); } catch (error) { console.warn(error); } return result; }); } getContent(pathStr) { return __awaiter(this, void 0, void 0, function* () { let result = ''; try { const res = yield got(DOMAIN + pathStr); const $ = cheerio.load(res.body); const html = $('#content').html(); result = html ? html : ''; } catch (error) { console.warn(error); } return result; }); }}exports.readerDriver = new ReaderDriver();//# sourceMappingURL=index.js.map————————————————PS:原本发在csdn的 后果发现公布之后拿原题目都没法在csdn里搜寻到本人的文章 就很离谱 弃了 csdn博客链接:https://blog.csdn.net/qq_2526... ...

July 16, 2021 · 2 min · jiezi

关于vue.js:spring可以解决框架什么问题

spring是一个一站式的轻量级的java开发框架,外围是管制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、长久层(jdbcTemplate)等都提供了多种配置解决方案;springMvc是spring根底之上的一个MVC框架,次要解决web开发的门路映射和视图渲染,属于spring框架中WEB层开发的一部分;springMvc和springBoot: springMvc属于一个企业WEB页游开发的MVC框架,涵盖面包含前端视图开发、文件配置、后盾接口逻辑开发等,XML、config等配置绝对比拟繁琐简单;springBoot框架绝对于springMvc框架来说,更专一于开发微服务后盾接口,不开发前端视图 fhadmin.cn ,同时遵循默认优于配置,简化了插件配置流程,不须要配置xml,绝对springmvc,大大简化了配置流程;springBoot和springCloud: spring boot应用了默认大于配置的理念,集成了疾速开发的spring多个插件,同时主动过滤不须要配置的多余的插件,简化了我的项目的开发配置流程,肯定水平上勾销xml配置,是一套疾速配置开发的脚手架,fhadmin.cn ,能疾速开发单个微服务;spring cloud大部分的性能页游插件都是基于springBoot去实现的,springCloud关注于全局的微服务整合和治理,将多个springBoot单体微服务进行整合以及治理; springCloud依赖于springBoot开发,而springBoot能够独立开发;总结: Spring 框架就像一个家族,有泛滥衍生产品例如 boot、security、jpa等等。但他们的根底都是Spring的ioc、aop等. ioc 提供了依赖注入的容器, aop解决了面向横切面编程,而后在此两者的根底上实现了其余延长产品的高级性能;springMvc次要解决WEB开发的问题,是基于www.sangpi.comServlet 的一个MVC框架,通过XML配置,对立开发前端视图和后端逻辑;因为Spring的配置非常复杂,各种XML、JavaConfig、servlet解决起来比拟繁琐,为了简化开发者的应用,从而创造性地推出了springBoot框架,默认优于配置,简化了springMvc的配置流程;但区别于springMvc的是,fhadmin.cn ,springBoot专一于单体微服务接口开发,和前端解耦,尽管springBoot也能够做成springMvc前后台一起开发,然而这就有点不合乎springBoot框架的初衷了;对于springCloud框架来说,它和springBoot一样,重视的是微服务的开发,然而springCloud更关注的是全局微服务接口的整合和治理,相当于治理多个springBoot框架的单体微服务;

July 16, 2021 · 1 min · jiezi

关于vue.js:如何切入社交电商搭建相关商城系统的注意事项

不知从什么时候开始,咱们手机上的微信群聊、朋友圈成为营销广告争抢的香饽饽。尤其是近两年,社交电商基于微信生态,凭借微信低成本的获客形式,异军崛起。如何切入社交电商为什么当初社交电商这么火呢?实质上来讲是因为渠道离消费者最贴近且黏度又高,精简了从引入到转化流量这一过程,而这正是社交电商赖以生存、倒退的根底。那么,企业该如何切入社交电商?搭建电商平台又须要思考哪些因素呢?上面就搭建社交类型的商城零碎简要剖析一下。一、开发语言电商软件开发语言次要以java、php、.net为主。思考性能与老本因素,大部分企业会抉择java或php。通常采纳不同的开发语言,商城零碎的稳定性、安全性、流畅性也各不相同。企业应从理论需要登程综合考量,抉择适宜本人的电商软件。二、商城类型电商平台的经营模式包含自营模式(b2c商城)、加盟模式(b2b2c商城)。按反对的客户端又可划分为:手机app商城、小程序商城、微信商城、html5商城等多种商城类型,从目前企业应用状况来看,大部分会以b2c或b2b2c模式为根底,当然企业更多的应该联合本身倒退状况考量。三、性能需要商城零碎的性能通常会蕴含商品治理、订单治理、促销治理、会员治理、物流治理、数据统计和营销治理等性能,除此之外,若企业还想增加一些个性化性能,就须要通过额定的定制开发来实现了。四、二次开发一个好的商城零碎可能极大的促成企业的业务扩张。在一直的倒退过程中,商城平台也须要依据市场环境进行二次开发调整,以一直满足消费者与平台业务的需要变动。如果商城零碎不反对二次开发,那就很容易让平台的倒退处于被动。所以从久远来看,抉择的商城软件必须提供源码,以便反对前期的二次开发。五、业余水平咱们常说“做事件要找业余的”。搭建商城零碎亦是如此,那么咱们该如何去判断软件提供商是否业余呢?倡议大家能够抉择CRMEB商城零碎。注于挪动互联网软件设计、研发、销售为一体的高新技术企业。社交电商的劣势在于更高的效率。在交易过程中,更贴近消费者,这是社交电商模式胜利的关键所在。

July 16, 2021 · 1 min · jiezi

关于vue.js:promise是什么

本文次要的目标是为大家介绍promise在前端的用法是怎么的,尽管有不少的解释文档,但对于老手来说并不敌对。这里就给大家用最简略的大白话解释一下,并配上例子,废话不多说开始明天的介绍。 作用:解决回调天堂问题,将函数嵌套的代码形式改为平级的。 当一个回调函数嵌套一个回调函数的时候,就会呈现一个嵌套构造,当嵌套的多了就会呈现回调天堂的状况。 为了能更加清晰的领会promise,咱们须要先察看一段游戏代码。所以上述函数嵌套调用的游戏代码能够批改为: 代码段有四个函数,f1,f2,f3,f4均为函数,且后一个函数作为前一个函数的参数,而后进行嵌套调用。最终从调用的语法来看,代码十分复杂,咱们把回调函数这样调用称为回调天堂。 Pomise的作用就是将嵌套的调用形式改为平级的。也就是说从调用的后果上来看,最终实质上是没有任何区别,Pormise只是扭转了语法的书写规定。这就是Pomise的根本应用办法。 Promise的语法规定如下: 这里promise对象能够将以前通过形参传递的回调函数,用then办法来进行传递。其实www.diuxie.compromise次要解决的是异步操作,如常见的如ajax申请。咱们的每一个异步事件,在执行的时候,都会有三种状态,执行中,胜利,失败。这也就解释了为什么then办法为什么会有两个参数,参数1代表胜利时执行的回调函数,参数2代表失败时的执行状态。 这样实现的性能和上述代码的性能是齐全一样的,然而解决了函数嵌套调用的麻烦。 论断:Pomise的作用就是将嵌套的调用形式改为平级的,用于解决异步操作。

July 15, 2021 · 1 min · jiezi

关于vue.js:在线教育直播课和录播课各自有什么优缺点

对于刚接触在线教育的学员来说,他们难以分辨不同名称的网课到底有什么区别?实际上,在线教育的课程次要分为录播课和直播课。上面大家跟着欢拓云直播小编来认识一下它们的优缺点吧。 1、在线教育直播课程的优缺点长处如下:第一,强互动。强互动是直播的个性。在直播课堂上,师生同时在线,就能够进行实时互动,高度还原线下课堂场景,比方学生能够应用“举手”性能来向老师发问,老师就能够及时答复,为学生答疑。第二,灵活性高。老师能够在直播后盾中剖析学生的学习数据,进而调整本人的教学计划,也能够通过线上补充更多的知识点。 毛病如下:第一,上课工夫固定。上课工夫不会因为学生没来就扭转,因而,学生要合理安排工夫,对学生的上课工夫很高。第二,小班免费较高。因为是小班模式,学生人数过少但课程内容会更适宜学生,为学生提供个性化的学习计划,因而小班免费较高。第三,对不适应直播的老师不敌对。因为直播性能过多,老手直播老师和不常常玩电子产品的老师很可能会不适应直播授课的节奏,进而导致上课状态下滑。 2、在线教育录播课程的优缺点长处如下:其一,可自在安顿上课工夫。因为录播课程能够随时进行随时播放,学生能够任意安顿适合的工夫来学习。其二,常识输入到位。因为录播课程是通过前期的剪辑,那么学生就能够看到老师比拟好的上课状态,那么常识输入也就更好了。其三,免费较低。因为录播课程是依照大班的价格来定的,那么学生能够通过更低的价格来购买这些课程。 毛病如下:其一,互动性差。因为录播课程是提前录制好的视频,老师是不可能与学生在课程中做互动的,学生只能通过评论区来与老师沟通。其二,不足相应的常识补充。因为录播课程的内容曾经是确定的并且工夫无限,老师解说的常识深度有余,不能补充更多的常识。不过,以后的在线教培机构通常是联合直播和录播的劣势来做在线教育课程的,毕竟二者的作用同样重要。如果您想领有本人的常识付费零碎,可抉择CRMEB,CRMEB专一于挪动互联网软件设计、研发、销售为一体的高新技术企业,咱们将竭诚为您服务。

July 15, 2021 · 1 min · jiezi

关于vue.js:echarts修改tooltip默认样式使用formatter函数拼接加工

echarts给到的默认款式略为有点奢侈,本文记录一下批改tooltip默认款式,忘了的时候来查查看一下默认tooltip款式图 批改过后的tooltip款式图 代码如下<template> <div class="echartsBox" id="main"></div></template><script>export default { data() { return { xData: ["孙悟空", "猪八戒", "沙和尚", "唐僧", "白龙马", "白骨精", "狐狸精"], yData1: [115, 198, 88, 77, 99, 123, 36], yData2: [88, 89, 77, 66, 100, 145, 53], yData3: [18, 55, 42, 63, 77, 85, 58], grid: { // 网格线配置 show: true, lineStyle: { color: ["#e9e9e9"], width: 1, type: "solid", }, }, }; }, mounted() { // 在通过mounted调用让echarts渲染 this.echartsInit(); }, methods: { echartsInit() { let main = document.getElementById("main"); // 获取dom元素作为eacharts的容器 this.$echarts.init(main).setOption({ xAxis: [ { type: "category", // 类别 data: this.xData, // x轴类别对应的值 splitLine: this.grid, // 给x轴加上网格线 }, ], yAxis: { type: "value", splitLine: this.grid, // 给y轴加上网格线 axisLabel: { formatter: function (value, index) { return value + "分"; }, }, }, tooltip: { trigger: "axis", // 鼠标移入到柱子外面就会有一个提醒,默认是item形式,如果有多个柱状图,堆在一块item就不太好了,集体喜爱axis形式的 triggerOn: "mousemove", // 什么时候触发提醒小图标,点击click的时候,或者鼠标滑过的时候,默认是mousemove鼠标滑过 /* formatter能够以字符串模板形式写,也能够用回调函数写,不过字符串模板略有限度,咱们应用回调函数会灵便点 */ formatter: function (params) { console.log("--x轴类目对应的参数数组--", params); // 比方当鼠标hover到孙悟空同学这一列的时候,这个params数组寄存的每一项数据别离是语数外三门问题的具体信息 var res = // 字符串模式的html标签会被echarts转换渲染成数据,这个res次要是画的tooltip里的上局部的题目局部 "<div style='margin-bottom:5px;padding:0 12px;width:100%;height:24px;line-height:24px;background:pink;border-radius:3px;'><p>" + params[0].name + " </p></div>"; for (var i = 0; i < params.length; i++) { //因为是个数组,所以要遍历拿到外面的数据,并退出到tooltip的数据内容局部外面去 res += `<div style="color: #fff;font-size: 14px; padding:0 12px;line-height: 24px"> <span style="display:inline-block;margin-right:5px;border-radius:2px;width:10px;height:10px;background-color:${[ params[i].color, // 默认是小圆点,咱们将其批改成有圆角的正方形,这里用的是模板字符串。并拿到对应色彩、名字、数据 ]};"></span> ${params[i].seriesName} ${params[i].data}分 </div>`; } return res; // 通过这么一加工,最终返回进来并渲染,最终就呈现了咱们所看的成果 }, }, legend: { // legend 是对series进行筛选,所以data中每一项就是series中的每一项的标识,所以就是以name为标识 data: ["语文问题", "数学问题", "英语问题"], }, series: [ { name: "语文问题", data: this.yData1, type: "bar", // 类型为柱状图 barWidth: 40, // 柱状图的宽度 label: { // 展现具体柱状图的数值 show: true, }, barGap: "0", /* 留神,如果想要把数据堆在一块,重叠搁置,只须要在series数组中的每个对象中都退出stack属性,stack英文单词的释义是: 一叠,一摞,一堆的意思,设置stack的属性值是什么倒无所谓,然而要让其stack的属性值保持一致,保持一致,才会重叠到一块。 */ stack: "值无所谓,但要保持一致", }, { name: "数学问题", data: this.yData2, type: "bar", // 类型为柱状图 barWidth: 40, // 柱状图的宽度 label: { // 展现具体柱状图的数值 show: true, }, /* 留神,如果想要把数据堆在一块,重叠搁置,只须要在series数组中的每个对象中都退出stack属性,stack英文单词的释义是: 一叠,一摞,一堆的意思,设置stack的属性值是什么倒无所谓,然而要让其stack的属性值保持一致,保持一致,才会重叠到一块。 */ stack: "值无所谓,但要保持一致", }, { name: "英语问题", data: this.yData3, type: "bar", // 类型为柱状图 barWidth: 40, // 柱状图的宽度 label: { // 展现具体柱状图的数值 show: true, }, /* 留神,如果想要把数据堆在一块,重叠搁置,只须要在series数组中的每个对象中都退出stack属性,stack英文单词的释义是: 一叠,一摞,一堆的意思,设置stack的属性值是什么倒无所谓,然而要让其stack的属性值保持一致,保持一致,才会重叠到一块。 */ stack: "值无所谓,但要保持一致", }, ], }); }, },};</script><style lang="less" scoped>.echartsBox { width: 900px; height: 500px;}</style>就不写步骤了,间接看正文不便些

July 14, 2021 · 2 min · jiezi

关于vue.js:Vue性能优化技巧

函数组件因为组件的生命周期解决在框架层面上非常耗时,所以,倡议平时尽量应用函数型组件。这样,能够防止不必要的性能损失。只有在模板上申明functional属性,就能够实现函数式组件了: <template functional> <div> <div v-if="value" class="on"></div> <section v-else class="off"></section> </div></template><script> export default { props: ['value'] }</script>局部变量平时在援用computed数据进行计算的时候,能够多应用局部变量,这样能够防止多次重复计算。 <template> <div :style="{ opacity: start / 300 }">{{ result }}</div></template><script>export default { props: ['start'], computed: { base () { return 42 }, result () { // 赋值给局部变量,避免反复计算 const base = this.base; let result = start for (let i = 0; i < 1000; i++) { result += Math.sqrt(Math.cos(Math.sin(base))) + base * base + base + base * 2 + base * 3 } return result }, },}</script>活用v-show,缩小v-if对于须要频繁切换的视图来说,应用v-show比v-if更加节约性能。因为v-show能够防止dom节点的销毁和重建 ...

July 14, 2021 · 2 min · jiezi

关于vue.js:积分商城系统有什么优势

现在微信服务流量的价值逐步扩充,利用互联网弱小的社交劣势,建设不便、智能化的网络营销渠道。作为积分商城私域营销中常见的高效营销平台,具备很高的开发价值。积分商城是什么?积分是商城推出的会员处分打算,是指会员用户在平台生产或其余流动后取得的积分处分。积分购物的目标是通过积分的获取和生产与会员建设关系,继续刺激和进步忠诚度,达到产品销售、客户治理、客户保护的目标。积分商城开发的劣势利用会员等级,进步生产价值:积分商城个别与会员商城相结合。积分商城能够为每位注册用户建设从青铜到钻石的身份等级体系,建设独立会员身份,通过积分增减进行身份降级和降级,不同的身份等级权利。这样会员用户能够感触到额定的生产价值和身份价值。积分折扣兑换,进步用户粘度:商城内所有商品都参加积分兑换流动,通过平台购物、浏览或共享的一系列工作,用户能够取得肯定的积分,并作为现金或其余形式间接兑换商品。合乎身份的权利和积分折扣兑换能够进步用户的平台粘性,继续刺激再购买。开发积分商城零碎怎么做?创立会员等级等级越高的会员,相干用户越少,给等级会员的增长能源就越大。会员级别通过经验值和积分高低浮动,一般而言积分和经验值来自“购买金额、购物频率、互动、信用”等行为,逐步将普通用户造就为外围用户。建设工作体系通过正当的工作,如建设线上线下综合会员积分核心,老手工作(注册会员积分、首单双积分等)、每日工作(登录积分、浏览页面积分等)、其余工作(参加流动积分、问卷调查积分等)构建“积分获取生产体系”,不能设计得太简单。明确兑换准则让用户明确积分操作的意义。例如哪些等级的用户享有什么样的积分规定,每种商品对应的积分数等,积分如何生产(平台生产扣除、游戏扣除、手动干涉扣除、歹意退货积分扣除、平台积分生效等)等,都须要明确细分。用户能够查问积分,用本人的积分在线替换礼物,或者生成兑换代码线下核销,依据品牌需要将会员设置为门店兑换。还能够兑换平台权利,如积分兑换商品券、优惠券等,使会员们可能找到明确的兑换价值。增加交互方式除了积分购物折扣外,还能够进行积分转盘、积分盲盒、积分翻卡抽奖等其余游戏交互生产,不仅能够满足购物这种支流积分生产形式,还能够满足其余用户的需要。大大提高与客户的互动,进步用户和品牌的粘度。数据收集剖析后盾须要对每日商品订购数量、每日生产积分、人气积分兑换商品、页面浏览工夫等用户行为进行剖析,营销人员能够把握积分生产风向,理解会员用户的生产趋势偏好,进行营销调整。积分商城能够转化用户的价值,与微信生态系统的公众号、朋友圈广告、社群进行强有力的独特营销,在商家的在线营销经营中作为强有力的补充发明更大的价值。如果您想领有本人的直播商城零碎,可抉择CRMEB,CRMEB专一于挪动互联网软件设计、研发、销售为一体的高新技术企业,咱们将竭诚为您服务。 如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star: http://github.crmeb.net/u/fanfan 不胜感激 !

July 14, 2021 · 1 min · jiezi

关于vue.js:导出时错误捕获

背景:在实现导出性能的时候,后端返回的是二进制文件流,当导出失败有报错信息时发现无奈提醒到后盾返回的message,于是就找到了FileReader来解决这个问题。1.理解FileReader定义 FileReader容许Web程序读取文件,所以能够通过这个来转化Blob数据。 接下来,看是如何实现的 exportReport () { var params = this.$refs.query.handleParams(); afterSale.downloadLocalFirstInsRateList({ filters: params, pageIndex: this.pageNum, pageSize: this.pageSize, sorts: [] }).then(res => { let that = this; this.sameParams = res; let reader = new FileReader(); reader.readAsText(res); reader.onload = function (res) { if (res.target.result.indexOf('statusCode') !== -1) { if (JSON.parse(res.target.result).statusCode === 500) { that.$Message.error(JSON.parse(res.target.result).message); } } else { const fileName = '本地首保率剖析报表.xlsx'; const link = document.createElement('a'); link.href = window.URL.createObjectURL(that.sameParams) link.download = fileName; link.click() window.URL.revokeObjectURL(link.href); } }; }).catch(error => { console.log(error); this.loading = false; }); },首先第一步:new一个FileReader对象第二步:调用FileReader的办法 readAsText第三步:回调函数onload 读取胜利时 获取res.target.result代表返回的后果,此时就将Blob数据转换成了json格局的数据。 ...

July 13, 2021 · 1 min · jiezi

关于vue.js:ssm框架应该如何操作

导入开发包asm-3.2.0.RELEASE.jarasm-3.3.1.jarc3p0-0.9.jarcglib-2.2.2.jarcom.springsource.net.sf.cglib-2.2.0.jarcom.springsource.org.aopalliance-1.0.0.jarcom.springsource.org.apache.commons.logging-1.1.1.jarcom.springsource.org.aspectj.weaver-1.6.8.RELEASE.jarjackson-core-asl-1.7.2.jarjackson-mapper-asl-1.7.2.jarjavassist-3.17.1-GA.jarjavax.servlet.jsp.jstl.jarjsf-api.jarjsf-impl.jarjstl-impl.jarjunit.jarlog4j-1.2.17.jarmybatis-3.2.2.jarmybatis-spring-1.2.0.jarmysql-connector-java-5.1.26-bin.jarorg.hamcrest.core_1.1.0.v20090501071000.jarorg.springframework.transaction-3.2.2.RELEASE.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jarspring-aop-3.2.0.RELEASE.jarspring-beans-3.2.0.RELEASE.jarspring-context-3.2.0.RELEASE.jarspring-core-3.2.0.RELEASE.jarspring-expression-3.2.0.RELEASE.jarspring-jdbc-3.2.0.RELEASE.jarspring-orm-3.2.0.RELEASE.jarspring-test-3.2.0.RELEASE.jarspring-web-3.2.0.RELEASE.jarspring-webmvc-3.2.0.RELEASE.jar整合Spring与Mybatis相干的配置文件log4j.properties Rules reminder: DEBUG < INFO < WARN < ERROR < FATAL Global logging configurationlog4j.rootLogger=debug,stdout My logging configuration...log4j.logger.cn.jbit.mybatisdemo=DEBUG Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n log4j.logger.org.apache.ibatis=DEBUGlog4j.logger.org.apache.jdbc.SimpleDataSource=DEBUGlog4j.logger.org.apache.ibatis.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapclientDelegate=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG myBatis-config.xml文件 通过package, 能够间接指定package的名字, mybatis会主动扫描你指定包上面的javabean,并且默认设置一个别名,默认的名字为非限定类名来作为它的别名。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 通过别名简化对类的应用 --><typeAliases><!-- <typeAlias type="cn.itcast.scm.entity.Dept" alias="Dept" /> --> <!-- 通过package, 能够间接指定package的名字, mybatis会主动扫描你指定包上面的javabean, 并且默认设置一个别名,默认的名字为非限定类名来作为它的别名。 --><package name="zhongfucheng.entity"/> </typeAliases> <!-- <mappers> <mapper resource="cn/itcast/scm/entity/DeptMapper.xml" /></mappers> --></configuration>1.applicationContext.xml 配置数据源,记得去掉myBatis-config.xml的数据源相干配置 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/scm?useUnicode=true&amp;characterEncoding=UTF-8" /> <property name="user" value="root" /> <property name="password" value="root" /></bean><!-- 配置session工厂 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:myBatis-config.xml" /> <!--配置扫描式加载SQL映射文件,记得去掉mybatis-config配置--><!-- <property name="mapperLocations" value="classpath:zhongfucheng/dao/*.xml"/>--></bean><!-- 配置事务管理器,治理数据源事务处理 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean><!-- 配置事务告诉 --><tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <!-- 默认只解决运行时异样,可加rollback-for="Exception/Throwable"等解决所有异样或包含谬误 --> <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="*" propagation="SUPPORTS" /> </tx:attributes></tx:advice><!-- 配置切面织入的范畴,后边要把事务边界定在service层 --><aop:config> <aop:advisor advice-ref="advice" pointcut="execution(* cn.itcast.scm.service.impl.*.*(..))" /></aop:config><!-- 配置SessionTemplate,已封装了繁琐的数据操作 --><bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /></bean><!-- <context:component-scan base-package="*" /> --><!-- 主动扫描组件,要把controller去除,他们是在spring-mvc.xml中配置,如果不去除会影响事务管理。 --><context:component-scan base-package="cn.itcast"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- 配置 转换器,对于在basePackage设置的包(包含子包)下的接口类,如果接口类的全类名在Mapper.xml文件中和定义过命名空间统一, 将被转换成spring的BEAN,在调用 的中央通过@Autowired形式将能够注入接口实例 --><!-- ...

July 13, 2021 · 2 min · jiezi

关于vue.js:Vue组件需要理解掌握的内容

Vue组件组件用于封装页面的局部性能,将性能的构造、款式、逻辑代码封装为整体。 进步性能的复用性与可维护性,更好的专一于业务逻辑。 组件应用时为自定义HTML标签模式,通过组件名作为自定义标签名 <div id="app"> // 一般 html 标签 <p></p> // Vue.js组件 <my-com></my-com></div>组件详情组件注册组件通信组件插槽内置组件组件注册 组件注册文章入口组件通信 组件间传递数据的操作,称为组件通信问题子组件如何获取父组件中的数据?父组件如何得悉子组件得数据变更?更加简单的组件关系?组件通信文章入口组件插槽 组件插槽能够便捷的设置组件内容。例如父组件给子组件进行内容设置,可能须要父组件调用很多次子组件内容,当然通过props传入设置不是不能够,然而咱们心愿间接在标签内设置,更加简洁 <div id="app"> <com-a> 示例内容 <span>组件的主题内容</span> </com-a></div>组件插槽文章入口内置组件 内置组件文章入口

July 13, 2021 · 1 min · jiezi

关于vue.js:Vue内置组件介绍

内置组件动静组件动静组件实用于多个组件频繁切换的解决。<component>用于将一个 ‘元组件’ 渲染为动静组件,以is属性值决定渲染哪个组件。is 设置内容是个组件名称 <div id="app"><component :is="'ComA'"></component> // 动静组件</div>用于实现多个组件的疾速切换,例如选项卡成果。 var ComA = { template: `<div>A组件内容 <input type="text"></div>`}var ComB = { template: `<div>B组件内容 <input type="text"></div>`}var ComC = { template: `<div>C组件内容 <input type="text"></div>`}new Vue({el:"#app",data:{ titles:['ComA','ComB','ComC'], currentCom:'ComA'},components:{ ComA,ComB,ComC}})<div id="app"><button v-for= 'title in titles' :key='title' @click="currentCom = title"> {{title}}</button><component :is="currentCom"></component></div> is个性 is属性会在每次切换组件时,Vue都会创立一个新的组件实例。(tab切换时会销毁老组件,创立新组件) 例如:给子组件内增加一个输入框,输出内容后切换发现不会被保留keep-alive组件次要用于保留组件状态或防止组件从新渲染。是一个形象组件:它本身不会渲染一个 DOM 元素,也不会呈现在组件的父组件链中问题 动静组件component 的频繁切换回导致组件的从新渲染且无奈保留状态解决 用标签包裹,不对组件进行从新渲染,保留组件外部状态(缓存)is绑定的是属性/计算属性 。不是办法! <keep-alive><component :is="currentCom" ></component></keep-alive>批改下面的tab切换 <div id="app">...<keep-alive> <component :is="currentCom"></component></keep-alive></div>属性 官网地址 include属性 用于指定哪些组件会被缓存,具备多种设置形式。如果include是属性绑定,能够为他设置字符串,数组或者正则 include="ComA,ComB,ComC" 留神不能加空格:include="['ComA','ComB','ComC']" 能够间接写数组,也能够放data中。:include="/Com[ABC]/"exclude属性 不蕴含max属性,最多缓存多少个 <keep-alive include="ComA,ComB,ComC"><component :is="currentCom"></component></keep-alive><keep-alive :include="['ComA','ComB','ComC']"><component :is="currentCom"></component></keep-alive><keep-alive :include="/Com[ABC]/"><component :is="currentCom"></component></keep-alive>异步组件Vue 容许你以一个工厂函数的形式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件须要被渲染的时候才会触发该工厂函数,且会把后果缓存起来供将来重渲染异步组件async-example在1s后传递配置模板 ...

July 13, 2021 · 2 min · jiezi

关于vue.js:Vue-组件插槽

组件插槽单个插槽如果咱们心愿组件标签能够像HTML标签一样设置内容,那么组件的应用灵便度会很高。 <div id="app"><p>示例内容</p><com-a>实力内容2</com-a></div>但平时咱们书写的组件,组件首尾标签中书写的内容会被摈弃。(下面的“实力内容2”)咱们须要通过<slot>进行插槽设置。 Vue.component('com-a',{template:` <div> <p>示例内容</p> <slot></slot> // 插槽 </div>`})自定义组件内增加内容,替换slot标签,一般文本和标签都可设置胜利 <div id="app"><com-a> 示例内容 <span>组件主体</span></com-a></div>留神: 模板内容的渲染地位 以后构造模板属于父组件的视图外部所以内容,代码,数据都是由父组件进行模板渲染的插槽是父组件给子组件设置的,数据是父组件的数据(当然也能够应用子组件数据,通过作用域插槽前面讲)父级组件模板的所有内容都是在父级作用域中编译执行,子组件模板的内容在子组件作用域内编译执行 <div id="app"><com-a>这里只能拜访父组件的数据{{ parValue }}</com-a></div>new Vue({data:{ parValue:'父组件数据' },components:{ComA}})var ComA={template:`<div> <p>组件A:{{ value }}</p> <slot></slot></div>`,data(){return { value:'子组件数据'}}}插槽的作用是组件对以后子组件的内容进行便捷设置,内容由父组件进行设置如果父组件并没有传入数据,咱们能够在<slot>中为插槽设置默认值,也称为后备内容。 var ComA={template:` <div> <p>组件A:</p> <slot>这是默认文本</slot> // 默认值 </div>`,data(){ return { value:'子组件数据' }}}<div id="app"><com-a></com-a> // 插槽没接管到值,显示默认值</div>具名插槽如果组件中有多个地位须要设置插槽,据须要给<slot>设置name,称为具名插槽。子组件构造内内设置多个插槽 Vue.component('ComA',{ template:` <div> <header> <slot name="header"></slot> // 具名 </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer> </div> `})父组件应用插槽,传入数据 template 是占位符,不显示标签v-slot 只能在template中设置未设置具名的插槽,默认为default默认slot能够简写,所有没有被v-slot指定的插槽内容都被认为是 默认插槽内容具名能够简写为#header #footer具名插槽只能调配具名对应的内容,无奈显示默认内容个别内容比拟多的插槽局部,设置为 default 模式 <com-a><template v-slot:header> // 设置 <h1>组件头部内容</h1></template><template v-slot:default> // 默认 <p>组件主体内容</p></template><template v-slot:footer> <p>组件底部内容</p></template></com-a>简写模式 ...

July 13, 2021 · 1 min · jiezi

关于vue.js:Vue-组件通信方式

父组件向子组件传值通过子组件的 props 选项承受父组件的传值props内的数据能够在模板内间接应用留神:props不要与data 存在同名属性,会产生笼罩问题子组件设置形式 Vue.component('my-com',{ props:['title'], // 父类中要绑定的属性 template:'<h>{{ title }}</h>'})父组件设置形式 给自定义组件设置属性 <div id="app"><my-com title="实例内容1" ></my-com> // 动态属性设置,无奈操作批改<my-com :title="'实力内容2'"></my-com> // 动静属性设置:表达式(个别不通过动静属性绑定动态值,无奈操作批改)<my-com :title="item.title"></my-com> // 动静属性设置:数据(父组件数据更新会使子组件同步更新)</div>new Vue({...data:{ item:{title:"实力内容3"}},components:{ "my-com":{ props:["title"], template:` <div> <h3>{{ title }}</h3> </div> ` }}})Props命名规定倡议prop命名应用camelCase,父组件绑定时应用kebab-case。为什么?子组件中,props内如果用kebab-case,如果prop作为属性应用不能加"-",如果prop为"my-title"这种状况,应用时在插值内须要改成"{{ myTitle }}"解决父组件中,属性是在html中书写的,html的属性是不辨别大小写,因而camelCase会被辨认成camelcase,可能并不是咱们想要的camel-case 后果子组件 Vue.component("my-com",{ props:["myTitle"], // {myTitle:String} 写法也可 template:` <div> <h3>{{ myTitle }}</h3> <a :href="myTitle"></a> // 除了应用在插槽中,在绑定动静属性中也能够 </div> `})父组件 <div id="app"> <my-com my-title="实例内容1" ></my-com> <my-com :my-title="'实力内容2'"></my-com> <my-com :my-title="item.title"></my-com></div>父传子的单向数据流父子组件间的所有prop都是单向上行绑定的。意味着只能父向子传,不能反向影响(子影响父) 解释: 父组件的数据批改会主动绑定到子组件中,并更新子组件,子组件的操作无奈反向影响父组件如果子组件要解决prop数据,该当存储在 data 或 computed 中后操作 Vue.component("my-com",{props:['initialTitle'],template:'<h3> {{ myTitle }} </h3>',data(){ return { myTitle:this.initialTitle // 把属性存下来,解决后放入插值中 }}})<div id="app"><my-com :initial-title= "value"></my-com></div>var vm = new Vue({data:{ value:'北京欢送你',},}).$mount("#app")组件也是vue实例,无论实例内的 属性怎么批改, myTitle 数据怎么变,都不会对父的数据产生影响解决 props 数据形式, this.myTitle = "其余内容"间接批改 props 数据会产生正告 this.initialTitle = "其余内容" ,倡议用 data 或者 computed 代替间接批改 (我没呈现) ...

July 13, 2021 · 2 min · jiezi

关于vue.js:Vue-组件注册方式

全局注册全局注册的组件在注册后能够用于任意实例或组件中。留神:全局注册必须设置在根 Vue 实例创立之前 Vue.component('组件名',{ /** 选项对象 */ })例如 Vue.component('my-component',{ template:'<div>全局组件</div>'})new Vue({el:"#app",data:{}})<div id="app"><my-component><my-component></div>组件根底实质上,组件是可复用的 Vue 实例,所以它们可与new Vue 接管雷同的选项,例如data、method以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。组件根底中次要解说:组件命名规定,template选项,data选项组件命名规定(创立组件时的设置规定) kebab-case:"my-component"PascalCase:"MyComponent"留神:无论采纳哪种命名形式,在DOM中都只有kebab-case能够应用。 Vue.component('my-component-a',{ template:'<div>全局组件</div>'})Vue.component('MyComponentB',{ template:'<div>全局组件</div>'})<div id="app"> <my-component-a></my-component-a> // ok <my-component-b></my-component-b> // ok <MyComponentB></MyComponentB> // error 会认为残缺的一个单词</div>template选项 template选项用于设置组件的构造,最终被引入根实例或其余组件中。模板中语法与根实例中构造统一,能够执行vue相干指令操作,插值表达式等template只能有一个根元素 Vue.component("MyComponentA",{template:` <div> <h3>组件A 的题目内容 {{ 1+2*3 }}</h3> </div>`})data选项 data选项用于存储组件的数据,与根实例不同,组件的 data选项必须为函数,数据设置在返回值对象中。组件并不一定是单个呈现(一个组件一个性能的封装),为了确保多个组件实例内的数据是互相独立的而不是共用的,须要通过作用域隔离函数外部领有独立作用域,函数屡次调用,造成多个外部独立作用域,作用域内数据不会相互影响这种实现形式是为了确保每个组件实例能够保护一份被返回对象的独立的拷贝,不会相互影响。 Vue.component("MyComA",{template:` <div> <h3> {{ title }} </h3> <p> {{ content }} </p> </div>`,data:function(){ return { title:'题目', content:'内容' }}})每个组件都是独立的,批改某个组件实例数据,其余不会被影响 部分注册部分注册的组件只能用在以后实例或组件中。留神 DOM 写法永远 kebab-casecomponents内组件 键名是 kebab-case 带连字符要加引号 new Vue({...components:{ 'my-component-a':{ template:'<div>{{ title }}</div>' data(){ return { title:"a title 内容" } } }, 'MyComponentB':{ template:'<div>{{ title }}</div>' data(){ return { title:"b title 内容" } } }}})<div id="app"><my-component-a></my-component-a> // ok<my-component-b></my-component-b> // ok</div>部分注册形式2:独自配置组件选项对象 ...

July 13, 2021 · 1 min · jiezi

关于vue.js:Vue-API总结

本文次要用于了解vue api内容,查缺补漏,对于根本api,此处不做解释。 全局配置通过 Vue.config设置 silentoptionMergeStrategiesdevtoolserrorHandlerwarnHandlerignoredElementskeyCodesperformanceproductionTipVue.config.errorHandlerVue.config.errorHandler = function(err, vm, info) { console.log(`组件${vm.$vnode.tag}产生谬误:${err.message},${info}`)}mounted() { b },log 组件xxx产生谬误:b is not defined,mounted hook全局APIVue.extendVue.nextTickVue.setVue.deleteVue.directiveVue.filterVue.componentVue.useVue.mixinVue.compileVue.observableVue.versionVue.extend应用根底 Vue 结构器,创立一个“子类”。参数是一个蕴含组件选项的对象留神 data 选项是特例,须要是函数 // 创立结构器var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } }})// 创立 Profile 实例,并挂载到一个元素上。new Profile().$mount('#mount-point')<div id="mount-point"></div>// 渲染成<p>Walter White aka Heisenberg</p>Vue.nextTickDom更新循环完结后执行的提早回调,Vue 在更新 DOM 时是异步执行的 只有侦听到数据变动,Vue 将开启一个队列,并缓冲在同一事件循环中产生的所有数据变更如果同一个 watcher 被屡次触发,只会被推入到队列中一次。这种在缓冲时去除反复数据对于防止不必要的计算和 DOM 操作是十分重要的案例:此时批改msg。 vm.msg = "11"console.log("原信息":msg)Vue.nextTick(function (){ console.log("更新后":msg)})2.1新增反对promise ...

July 13, 2021 · 3 min · jiezi

关于vue.js:Java-设置PDF跨页表格重复显示表头行

在创建表格时,如果表格内容呈现跨页显示的时候,默认状况下该表格的表头不会在下一页显示,在浏览体验上不是很好。上面分享一个办法如何在表格跨页是显示表格的表头内容,这里只须要简略应用办法 grid.setRepeatHeader( true); 即可。具体参考如下办法步骤。 导入Jar 包这里导入的是Free Spire.PDF for Java的jar包,下载后,解压文件,在Java程序中将解压门路下lib文件中的spire.pdf.jar导入Java程序。import com.spire.pdf.*; import com.spire.pdf.graphics.*; import com.spire.pdf.grid.PdfGrid; import com.spire.pdf.grid.PdfGridRow; import java.awt.*; public class RepeatTableHeaderRow { public static void main(String[] args) { //新建一个PDF文档 PdfDocument pdf = new PdfDocument(); //增加一页 PdfPageBase page = pdf.getPages().add(); //创立PdfGrid类的对象 PdfGrid grid = new PdfGrid(); //设置单元格填充 grid.getStyle().setCellPadding(www.diuxie.comnew PdfPaddings(1,1,1,1)); //增加表格列数 grid.getColumns().add(3); //增加表头行及表格数据 PdfGridRow[] pdfGridRows = grid.getHeaders().add(1); for (int i = 0; i < pdfGridRows.length; i++) { pdfGridRows[i].getStyle().setFont(new PdfTrueTypeFont(new Font("Arial", Font.PLAIN,12), true));//指定字体 pdfGridRows[i].getCells().get(0).setValue("NAME"); pdfGridRows[i].getCells().get(1).setValue("SUBJECT"); pdfGridRows[i].getCells().get(2).setValue("SCORES"); pdfGridRows[i].getStyle().setTextBrush(PdfBrushes.getRed()); /*pdfGridRows[i].getStyle().setFont(new PdfCjkStandardFont(PdfCjkFontFamily.Hanyang_Systems_Gothic_Medium, 14f));//绘制中日韩字体的办法 pdfGridRows[i].getCells().get(0).setValue("이 름"); pdfGridRows[i].getCells().get(1).setValue("科 目") ; pdfGridRows[i].getCells().get(2).setValue("ほしとり"); pdfGridRows[i].getStyle().setTextBrush(PdfBrushes.getBlue());*/ }设置手游的反复表头(表格跨页时) ...

July 12, 2021 · 1 min · jiezi

关于vue.js:CS530

CS530, Spring 2019, Program Assignment #226 Feb 2019You and your team shall develop, test, and deliver a disassembler program for theXE variant of the SIC/XE family of machines.XE DISASSEMBLER REQUIREMENTS:The XE disassembler program shall open an XE object file, <filename>.obj and itsaccompanying symbol file, <filename>.sym, then it will disassemble the object code,and generate an XE source file, <filename.sic> and XE listing file, <filename>.lisusing the disassembled code. The symbol file, <filename>.sym will contain theSYMTAB and LITTAB the assembler generated when assembling the object file.Your executable program shall be named ‘xed’. To run your program, the user shallprovide the filename on the command line when starting/running the disassembler: % xed <filename>the disassembler will then use “filename” for the name of the source file itgenerates, <filename>.sic, and the accompanying listing file, <filename>.lis.Note, the symbol file <filename>.sym will be provided with the object code file.If neither the <filename>.obj or <filename>.sym are present, the xed program shallgracefully exit.TEAMS:You shall work in teams of two - three people on this project. You may choose touse pair programming, dividing work up, or other methods for work completion, thatis up to you although I strongly encourage you to attempt pair programming!ADDITIONAL REQUIREMENTS:README file - you shall create a README file; consult the instructions for READMEfile content on the course Blackboard. Also, your source files SHALL CONTAINsufficient comments for making the source easy to read. Points will be taken offfor poorly (or non) commented source or inadequate README file documentation.Compiler and make (and Makefile) – You shall use C/C++ (gcc/g++) and use make tocompile your program for this assignment; you will need to create a Makefile foryour project, consult the example Makefile(s) on the course Blackboard. Name theexecutable, ‘xed’ (XE Disassembler).Test files – You should prepare and include test files used during the developmentand test of your project.Software Design Document - You are required to perform software design of thissystem. Include a software design document and turn it in with your project.Note, you will not be held to formal design specification/formatting or use any ofthe formal methods. Turn in a file which contains your software design. You mayinclude a kanban (and stories), models, drawings, descriptions, diagrams or similartools you used for your system/software design. This is a significant part of yourgrade and needs to be adequately captured in your documentation. Include adescription of how your team was organized and how effectively you worked togetherand areas for improvement.Make sure that all files (README, source files, header files, Makefile) containseach team member’s names and RedIDs!TURNING IN YOUR WORK:The assignment is due at 1730, Monday, 22 April 2019Your project shall include C/C++ source files, an include/header file, a Makefile,and a README file. ONLY ONE MEMBER OF YOUR TEAM TURNS IN THE PROJECT. To turn inyour project, each team shall select one person, all files shall be in thatperson’s class account on edoras in a directory named “a2” (~/a2). Leave any testfiles in this directory as well. BE SURE ALL TEAM MEMBERS NAMES AND CLASS ACCOUNTSARE IN THE README FILE. Finally, the designated person turns in the project byuploading a tarball with all project files to Blackboard and entering any commentsin the assignment’s turnin.WX:codehelp ...

July 11, 2021 · 3 min · jiezi

关于vue.js:vue-项目-如何部署到-Apache-服务器上

vue我的项目在开发环境下,让我的项目运行起来,是通过npm run dev命令,原理是在本地搭建了一个express服务器。 然而在服务器上是必须要通npm run build命令来对整个我的项目进行打包,打包后会在我的项目目录下生成一个dist文件夹: 如果间接将 dist 文件间接放到服务器。 这个文件目录是曾经解决好的,能失常关上的目录文件。我这服务器外面用的文件名是 ak 其中遇到的问题和须要解决的有以下几个: 配置路由配置 vue.config.jsApache 服务器配置 .htaccess 文件1.配置路由,我这里是应用的 history const router = new VueRouter({ routes, mode: 'history', base: '/ak' // 服务器文件})配置 vue.config.js, 我这里的 vue-cli 是 3.x 以上,都是要手动配置// vue.config.jsmodule.exports = { publicPath: './',}配置到这里放到服务器外面是能关上的, 然而只有刷新一下,页面就会失落。所以要在服务器外面配置 .htaccess 文件。 配置 .htaccess 文件<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /ak/ RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /ak/index.html [L]</IfModule>#这个配置的作用就是把所有服务器上不存在申请全副转发到index.html下来这里如何要是搁置其余的文件, 只有将对应的 ak 文件换成所需的 文件即可。 ...

July 10, 2021 · 1 min · jiezi

关于vue.js:彻底搞懂-filterwatchcomputed

过滤器 filterfilter 作用: 可被用于一些常见的文本格式化 应用形式:增加在 JavaScript 表达式的尾部,由“管道”符号批示 全局注册(main.js) // main.jsimport Vue from 'vue';import Demo from './demo.vue';import { Button, Modal } from 'ant-design-vue';import { translate } from '@ctrip/ebk-utils';import { APPID } from '@/service/config';Vue.config.productionTip = false;// antdv 组件Vue.use(Button);Vue.use(Modal);// 多语言 filterVue.filter('translate', function(value) { return translate(value, APPID);});new Vue({ render: h => h(Demo)}).$mount('#app');部分注册 <template> <p>{{ 'Key.Comment.174' | translate }}</p></template><script>import { translate } from '@ctrip/ebk-utils';import { APPID } from '@/service/config';export default { data() { return { }; }, filters: { translate(val) { return translate(value, APPID); } }};</script>当全局过滤器和部分过滤器重名时,会采纳部分过滤器。 ...

July 10, 2021 · 2 min · jiezi

关于vue.js:Java虚拟机能够获得什么

 Runtime类用于示意Java虚拟机运行时的状态,它用于封装Java虚拟机过程。每次应用“java”命令启动Java虚拟机时都会对应一个Runtime实例,并且只有一个实例,应用程序会通过该实例与其运行时的环境相连。应用程序不能创立本人的Runtime实例,若想在程序中取得一个Runtime实例,能够通过getRuntime()办法获取与之相干的Runtime对象,具体形式如下: Runtime run = Runtime.getRuntime(); 因为Runtime类封装了Java虚拟机过程,因而,能够通过该类的实例对象来获取以后虚拟机的相干信息。接下来通过一个案例来演示Runtime类的应用,如文件1所示。 public class Example12 { public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); // 获取Java程序关联的运行时对象 System.out.println("处理器的个数: " + rt.availableProcessors() + "个"); System.out.println("闲暇内存大小: " + rt.freeMemory() / 1024 / 1024 + "M"); System.out.println("最大可用内存大小: " + rt.maxMemory() / 1024 / 1024 + "M"); } } 运行后果如图1所示: 01 文件1中,通过“Runtime.getRuntime();”办法创立了一个Runtime的实例对象,并别离调用该对象的availableProcessors()办法、freeMemory()办法和maxMemory()办法,将以后虚拟机的处理器个数、闲暇内存大小和可用最大内存大小的信息打印进去。 须要留神的是,因为每台计算机的配置和性能不同,该文件的打印后果也会有所不同。另外,闲暇内存大小和可用最大内存大小都是以字节为单位计算的,文件1中程序的运行后果曾经换算成了以兆(M)为单位的值。 Runtime类中提供了一个exec()办法,该办法用于执行一个游戏代理的DOS命令,从而实现和在命令行窗口中输出DOS命令同样的成果。例如,能够通过运行“notepad.exe”命令关上一个Windows自带的记事本,程序代码如文件2所示。 import java.io.IOException; public www.walajiao.comclass Example13 { public static void main(String[] args) throws IOException { Runtime rt = Runtime.getRuntime(); // 创立Runtime实例对象 rt.exec("notepad.exe"); // 调用exec()办法 } } ...

July 9, 2021 · 1 min · jiezi

关于vue.js:wordbreak和wordwrap有什么区别

大家都晓得在CSS3中减少了很多新的属性,其中word-break和word-wrap就是用来给文本换行应用的,然而两者有什么区别很多小伙伴都不是很分明。明天就来通知你他们到底有什么不同,应该用在哪里。 word-break它的属性值一共有3个,其中的几个属性值的含意具体解释如下: normal:示意默认值,即默认的的换行规定。 break-all:示意强行换行,意思就是容许任意非文本间(比方网址类型的等)的单词断行。 keep-all: 也示意换行,但不容许文本中的单词换行,只能在半角空格或连字符处换行。 其中,在这三个属性值中,break-alwww.diuxie.coml这个属性值是所有浏览器都反对,然而 keep-all就不这样了,尽管有肯定的倒退和提高,但目前挪动端还不适宜应用word-break : keep-all。 它有两个属性值,其中的几个属性值的含意具体解释如下: normal:就是默认值,就是失常的换行规定。 break-word:示意一行单词中切实没有其余靠谱的换行点的时候才进行换行。 其实大家会发现,word-break和word-wrap其实是长得比拟像的,而且属性值也有类似之处,其实word-wrap属性也是很有故事的,它之前因为和 word-break长得太像,难免会让人记不住或搞混,所以在CSS3标准里,这个属性的名称被批改了,叫作 overflow-wrap。尽管这个新属性名称改了下,显得语义更精确,但www.diuxie.com也更容易区别和记忆。另外,在 Chrome和 Safari等WebKit内核的浏览器仅反对这个新属性。因而,尽管换了个难看好用的新名字,然而为了兼容性,目前还是乖乖地应用word-wrap 吧。通过上面上面持续来唠唠这连个属性的到底有啥区别呢?word-break: break-all和 word-wrap: break-word。首先,两者长相神似,都有 word,都有break,手游的地位都还一样,一个有两个break,一个有两个word;其次,两者的性能作用也相似,这两个申明都能使间断英文字符换行,那么它们的区别到底是什么? 上面给大家举个例子阐明一下: 综上所述,word-break: break-all;的作用是所有的都换行,很王道的那种,毫不留情,一点儿空隙都不放过的那种换行,而 word-wrap:break-word则略微温顺点儿,带有一点怜悯之心,如果这一行文字有能够换行的点,如空格之类的,就不打英文单词或字符的主见了,在这些换行点换行,至于对不对齐、好不好看则不关怀,因而,很容易呈现一片一片空白区域的状况。 以上就是word-break和word-wrap属性区别的介绍了,同学们在开发过程中依据理论状况去抉择即可。

July 9, 2021 · 1 min · jiezi

关于vue.js:搭建vue-cli4x-注意事项持续更新

最近闲着没什么事,想搞下vue3玩玩,真没想到几年不玩,差点被它玩死。括号也怪我笨括号完了;写给就为关注的人儿!进入正题 首先失常的create 没什么好说的, 须要留神一点进入cli3当前 全局装置cli指令由 原来的vue-cli 变成了@vue/cli,对于长时间未关注的小伙伴来说,须要看一下不然是装置不上的或者装置仍旧是cli2的版本;第二点是咱们create只有在main.ts文件中 import Vue from "vue"曾经不存在了取而代之的是import { createApp } from 'vue', 挂载也改成了createApp(App).mount('#app')的链式调用, 其余根本不变;第一个坑来了,根底的框架有了,咱们须要装置ui,之前始终都是用的element-ui,如果你还是依照之前的习惯装置,就会报错,起因是element-ui随着vue3的降级也进行了大版本升级(不兼容了),新的ui叫 Element Plus。有ui咱们会习惯性的做一个按需加载的配置,因为之前框架搭建的时候抉择的css编译是less,然而官网的按需加载引入的款式是scss,于是依照官网指引:乐不可支的npm install -D sass-loader sass之后,我的项目报错了:明明代码都没写,怎么就报Syntax Error: TypeError: this.getOptions is not a function, 捅咕一大圈才找到起因, 是因为npm install -D sass-loader sass装置的sass 和 scss-loader 版本太高 不反对(难堪)!升高版本重新安装就好了。

July 9, 2021 · 1 min · jiezi

关于vue.js:详细讲解vue中祖孙组件间的通信之使用attrs和listeners的方式篇幅略长建议收藏

问题形容vuex 对于vuex,笔者之前写过一篇文章。链接附上:https://segmentfault.com/a/11...vue实例bus事件 vue实例bus其实不仅仅能够用在祖孙组件间通信,也能够用在兄弟组件间通信,应用范畴还是挺宽泛的,对于vue实例bus的用法,笔者之前也写过一篇文章,是以兄弟组件间通信为例的。链接附上:https://segmentfault.com/a/11...$attrs和$listeners 这种形式也还能够的,请持续往下浏览官网定义$attrs和$listeners咱们先看一下官网是如何定义的,截图奉上: 官网地址也附上吧 https://cn.vuejs.org/v2/api/?...吐槽一下,官网的定义稍微有些艰涩难懂。上面咱们将结合实际的例子,来解释$attrs和$listeners的用法。所以咱们须要先搭建一个我的项目,构造就是祖孙组件数据传递 我的项目构造我的项目结构图咱们晓得我的项目的最外层的vue组件就是App.vue组件,咱们把App.vue组件当做爷组件、而对应fu.vue就是父组件,同时sun.vue就是孙子组件。也就是爷、父、子的这种祖孙关系组件。咱们在这样的构造中去实现爷组件到孙子组件中的数据传递。 $attrs的用法$attrs我的了解就是: 失常状况下:父组件通过v-bind绑定一个数据传递给子组件,子组件通过props接管到就能够在子组件的html中应用了。然而,如果父组件v-bind传递给子组件,子组件没有用props接管呢?留神:这个时候,父组件传递过去的数据就会被挂载(赋值)到这个子组件自带的对象$attrs下面,所以:$attrs就是一个容器对象,这个容器对象会寄存:父组件传过来的且子组件未应用props申明接管的数据代码层面了解咱们应用上述搭建的我的项目,把App.vue当做父组件,fu.vue当做子组件。(实际上,我的项目中这二者别离是爷组件、父组件,不过爷父组件,其实也是父子组件的关系,也能够用)爷组件代码在爷组件中,咱们给父组件传递4个数据,msg1、msg2、msg3、msg4,其数据类型别离是字符串、字符串、数组、对象 <template> <div id="app"> 我是爷组件 <fu :msg1="msg1" :msg2="msg2" :msg3="msg3" :msg4="msg4" ></fu> </div></template><script>import fu from "./views/fu.vue";export default { components: { fu, }, data() { return { msg1: "孙悟空", msg2: "猪八戒", msg3: ["白骨精", "玉兔精", "狐狸精"], msg4: { name: "炎帝萧炎", book: "斗破天穹", }, }; },};</script><style lang="less" scoped>#app { width: 950px; height: 600px; box-sizing: border-box; border: 3px dashed #e9e9e9; background-color: #cde; margin: 50px;}</style>父组件代码在父组件中咱们只在props中接管msg1,另外三个咱们不在props中接管。于是另外三个未在props中接管的,会主动被寄存在$attrs这个容器对象中去。同时,咱们通过$attrs对象也能够拿到对应的爷组件中传递过去的,未在props中接管的数据值,也能够在html中应用。 <template> <div class="fatherClass"> 我是父组件 <h2>{{ msg1 }}</h2> <h2>{{ $attrs.msg2}}</h2> <h2>{{ $attrs.msg3}}</h2> <h2>{{ $attrs.msg4}}</h2> </div></template><script>export default { name: "DemoFather", props: { msg1: { type: String, default: "", }, }, mounted() { console.log('fu组件实例',this); },};</script><style lang="less" scoped>.fatherClass { width: 850px; height: 400px; background-color: #baf; margin-left: 50px; margin-top: 50px;}</style>咱们先看一下上述爷父组件代码最终的效果图:确实是fu.vue组件中未在props中申明接管的爷组件传递过去的数据,都寄存在$attrs这个对象外面了。为了更直观的看到成果,咱们能够在mounted钩子中打印this组件实例,在这个实例上,咱们也能够看到$attrs中的寄存的数据。打印效果图如下:由此,验证了上述那句话:$attrs就是一个容器对象,这个容器对象会寄存:父组件传过来的且子组件未应用props申明接管的数据那这个和咱们的祖孙组件之间的数据传递有关系吗?有关系,关系很大! ...

July 8, 2021 · 2 min · jiezi

关于vue.js:antdesign-Table组件错位对不齐

1.纵向/列对不齐1.1.有列(column)没有设置宽度:表头固定时,导致表头宽度计算错误,表头列和内容列对不齐 1.2.语句/单词过长: antd依据语义/单词断句换行,理论列宽超出了设置的宽度,导致列对不齐; 1.3.开启了单选性能:单选列表头宽度计算错误,导致列对不齐 2.横向/行对不齐2.1.固定(fixed)列的高度高于一般列:一般列的高度与fixed列的高度不同,导致行对不齐;反之没问题 3.列间有空白间隙/留白3.1.列数不固定、需适配不同尺寸屏幕:需适配4种状况:小屏列少、小屏列多、大屏列少、大屏列多为了适配小屏多列,咱们会fixed某些列,column设置的width由比例变为px。当切到大屏时,同样列数宽度可能铺不满表格 3.2.scroll.x计算错误:antd文档: 倡议指定 scroll.x 为大于表格宽度的固定值或百分比。留神,且非固定列宽度之和不要超过 scroll.x 集体倡议:设置scroll.x为所有列的总宽度,包含fixed列. (这里有一条咱们本人零碎的代码须要查看的点:查看TableContainer组件是否留有buffer,有的话移除) 4.双滚动条4.1.macOS在零碎偏好设置为 “显示滚动条-滚动时”会呈现双滚动条 ————————————————版权申明:本文为CSDN博主「超级小码丽」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/baozhuo...

July 8, 2021 · 1 min · jiezi

关于vue.js:sharedpoollatch可以解决哪些问题

应用那个shared pool latch.txt --//我的测试环境很小,仅仅1个shared pool latch.如果存在多个,一条sql语句应该会应用那个shared pool latch.--//依照后面的学习,猜想应该于hash_value , bucket_size , _kghdsidx_count 相干,测试看看。--//注:个别缺省bucket_size =2^(9+8) =131072 1.环境:SCOTTbook> ver1PORT_STRING VERSION BANNER x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SCOTTbook> select * from dept where deptno=20; DEPTNO DNAME LOC 20 RESEARCH DALLASSCOTTbook> hashHASH_VALUE SQL_ID CHILD_NUMBER HASH_HEX 95129850 80baj2c2ur47u 0 5ab90fa SYSbook> hide _kgl_bucket_countNAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD _kgl_bucket_count Library cache hash table bucket count (2^_kgl_bucket_count * 256) TRUE 9 9 FALSE FALSE ...

July 8, 2021 · 4 min · jiezi

关于vue.js:日历组件展示内容超长滚动展示

最近有个用vue写的日历组件,日历内显示的内容有超长须要滚动显示的:次要的思路就是:1、监听内容变动2、判断内容长度与父级宽度3、给内容增加animation html <div class="calendar_status"> <div>{data.defvalue.text}</div> <div class="calendar_status_text">{data.defvalue.value.status} </div></div>css /* 单元格异样文字款式 */ .calendar_status_text { color: red; overflow: hidden; white-space: nowrap; } /* 超长滚动显示 */ .calendar_status { overflow: hidden; /* 减少scroll类 */ & > .scroll { text-overflow: unset; overflow: visible; animation: move 4s linear infinite; } } @keyframes move { 0% { transform: translateX(100%); } 100% { transform: translateX(-100%); } }js checkScroll () { this.$nextTick(() => { // 获取选中元素 let selectedItems = [...document.querySelectorAll('.calendar_status')] selectedItems.forEach(item => { let child = item.querySelector('.calendar_status_text') if (child.scrollWidth > item.offsetWidth) { // 判断child文字宽度 child.classList.add('scroll') } else { child.classList.remove('scroll') } }) }) },参考文档:https://www.jianshu.com/p/2f8... ...

July 8, 2021 · 1 min · jiezi

关于vue.js:自定义事件的触发dispatchEvent

一、element.dispatchEvent()对于规范浏览器,其提供了可供元素触发自定义事件的办法:element.dispatchEvent().。不过,在应用该办法之前,咱们还须要做其余两件事,即创立和初始化。 document.createEvent()event.initEvent()element.dispatchEvent()举个例子:var dom = document.querySelector('#id')dom.addEventListener('alert', function (event) { console.log(event)}, false); // 创立var evt = document.createEvent("HTMLEvents");// 初始化evt.initEvent("alert", false, false);// 触发, 即弹出文字dom.dispatchEvent(evt);1、createEvent()createEvent()办法返回新创建的Event对象,反对一个参数,示意事件类型,具体见下表: 参数 参数事件接口初始化办法HTMLEventsHTMLEventinitEvent()MouseEventsMouseEventinitMouseEvent()UIEventsUIEventinitUIEvent()2、initEvent()initEvent()办法用于初始化通过DocumentEvent接口创立的Event的值。 反对三个参数:initEvent(eventName, canBubble, preventDefault)别离示意: 事件名称是否能够冒泡是否阻止事件的默认操作3、dispatchEvent() dispatchEvent()就是触发执行了,dom.dispatchEvent(eventObject)参数eventObject示意事件对象,是createEvent()办法返回的创立的Event对象。 二、自定义事件1、Event自定义事件的函数有 Event、CustomEvent 和 dispatchEvent // 向 window派发一个resize内置事件window.dispatchEvent(new Event('resize')) // 间接自定义事件,应用 Event 构造函数:var event = new Event('build');var elem = document.querySelector('#id')// 监听事件elem.addEventListener('build', function (e) { ... }, false);// 触发事件.elem.dispatchEvent(event);2、CustomEventCustomEvent 能够创立一个更高度自定义事件,还能够附带一些数据,具体用法如下: var myEvent = new CustomEvent(eventname, options);其中 options 能够是: { detail: { ... }, bubbles: true, //是否冒泡 cancelable: false //是否勾销默认事件}其中 detail 能够寄存一些初始化的信息,能够在触发的时候调用。其余属性就是定义该事件是否具备冒泡等等性能。 ...

July 8, 2021 · 1 min · jiezi

关于vue.js:在-Vue3中封装一个-routerlinks-支持内外链接都能跳转

作者:Written by Daniel Kelly译者:前端小智起源:vueschool有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。 <router-link> 标签是用于在Vue应用程序的不同页面之间跳转,但它不是跳转到内部链接,相同,咱们个别应用 <a> 标签。 兴许只有我这么认为,但很多时候,我无奈跟上这种差别。其余时候,链接可能是动静的,即来自数据库或用户提供的某个数据源。在这种状况下,你基本不晓得链接是内部的还是外部的,在每个可能应用链接的中央手动做一个v-if是如许苦楚。 如果只用一个组件来解决所有外部和内部的链接,那不是很好吗? 侥幸的是,扩大<router-link>组件非常简单,只需将它包装到咱们本人的定制组件中。Ok,咱们须要构建一个AppLink组件来解决链接,无论是内部的还是外部的。 AppLink组件AppLink组件的 props 要蕴含 router-link 的所有 props。为什么? 因为这样咱们组件的“接口”就能够模拟 Router Link 的接口,无需再记住另一个API。 咱们能够通过从Vue Router导入 RouterLink 并将其 props 解构到咱们的组件中,如下所示: // AppLink.vue<script>import {RouterLink} from 'vue-router'export default{ props:{ ...RouterLink.props }}</script>在 template 中,创立 router-link 并将 props 传递给它,咱们还须要传入slot ,这个能够在 router-link 插入内容。 // AppLink.vue<template> <router-link v-bind="$props"><slot /></router-link></template>到目前为止,咱们曾经解决了所有外部链接,那内部链接呢? 如前所述,内部链接应用a标签,因而咱们将其增加到template中。 像 router link 一样,并将传入的 to 值赋值给 href。 // AppLink.vue<template> <a :href="to"><slot/></a> <router-link v-bind="$props"><slot/></router-link></template>这样外部和内部链接都有了对应的解决,须要留神的是,以上内容仅实用于 Vue3,因为它蕴含多个根元素。 ...

July 8, 2021 · 1 min · jiezi

关于vue.js:Java虚拟机中获得Runtime实例的方法是什么

Runtime类用于示意Java虚拟机运行时的状态,它用于封装Java虚拟机过程。每次应用“java”命令启动Java虚拟机时都会对应一个Runtime实例,并且只有一个实例,应用程序会通过该实例与其运行时的环境相连。应用程序不能创立本人的Runtime实例,若想在程序中取得一个Runtime实例,能够通过getRuntime()办法获取与之相干的Runtime对象,具体形式如下: Runtime run = Runtime.getRuntime(); 因为Runtime类封装了Java虚拟机过程,因而,能够通过该类的实例对象来获取以后虚拟机的相干信息。接下来通过一个案例来演示Runtime类的应用,如文件1所示。 public class Example12 { public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); // 获取Java程序关联的运行时对象 System.out.println("处理器的个数: " + rt.availableProcessors() + "个"); System.out.println("闲暇内存大小: " + rt.freeMemory() / 1024 / 1024 + "M"); System.out.println("最大可用内存大小: " + rt.maxMemory() / 1024 / 1024 + "M"); } } 运行后果如图1所示: 01 文件1中,通过“Runtime.getRuntime();”办法创立了一个Runtime的实例对象,并别离调用该对象的availableProcessors()办法、freeMemory()办法和maxMemory()办法,将以后虚拟机的处理器个数、闲暇内存大小和可用最大内存大小的信息打印进去。 须要留神的是,因为每台计算机的配置和性能不同,该文件的打印后果也会有所不同。另外,闲暇内存大小和可用最大内存大小都是以字节为单位计算的,文件1中程序的运行后果曾经换算成了以兆(M)为单位的值。 Runtime类中提供了一个exec()办法,该办法用于执行一个DOS命令,从而实现和在命令行窗口中输出DOS命令同样的成果。例如,能够通过运行“notepad.exe”命令关上一个Windows自带的记事本,程序代码如文件2所示。 import java.io.IOException; public class Example13 { public static void main(String[] args) throws IOException { Runtime rt = Runtime.getRuntime(); // 创立Runtime实例对象 rt.exec("notepad.exe"); // 调用exec()办法 } } ...

July 7, 2021 · 1 min · jiezi

关于vue.js:还没开始写盘点-ES12-新特性

https://dev.to/cenacr007_hars...

July 7, 2021 · 1 min · jiezi

关于vue.js:当-Vue-只有-5kb尤雨溪发布新作-petitevue针对渐进增强进行优化

前端程序员想必对尤雨溪及其开发的 Vue 框架不生疏。Vue 是一套用于构建用户界面的渐进式 JavaScript 框架,在 2014 年公布后取得了大量开发者的青眼,目前已更新至 3.0 版本。与其它大型框架不同的是,Vue 被设计为能够自底向上逐层利用。Vue 的外围库只关注视图层,不仅易于上手,还便于与第三方库或既有我的项目整合。另一方面,当与现代化的工具链以及各种反对类库联合应用时,Vue 也齐全可能为简单的单页利用提供驱动。 最近,尤雨溪公布了一款针对渐进加强(progressive enhancement)进行优化的 Vue 发行版——petite-vue,大小仅有约 5kb。与规范 Vue 相比,petite-vue 具备雷同的模板语法和响应式心理模型,而二者的差异在于 petite-vue 专门针对在服务器框架渲染的一个现有 HTML 页面上 “sprinkle” 大量交互进行了优化。 petite-vue 的亮点不仅在于体积小,还在于它可能应用针对渐进加强的最优实现,后者是它与规范 Vue 的次要区别,也是其次要劣势。尤雨溪走漏 petite-vue 与 Vue 1 的工作原理相似,但实现细节更优:petite-vue 遍历理论 DOM,并利用 @vue/reactivity 连贯 (attach) 细粒度 reactive effects,因而其更新可准确到达各个binding。 petite-vue 我的项目公布后取得了大量关注,间断多日呈现在 GitHub Trending 榜单上,在数日内即取得 2300 颗星。 我的项目地址:https://github.com/vuejs/peti... 接下来咱们来看 petite-vue 的更多细节。 次要个性petite-vue 具备以下个性: 大小仅为约 5.8kbVue 兼容的模板语法基于 DOM (mutates in place)由 @vue/reactivity 驱动 如何应用?petite-vue 能够不通过 build 步骤间接应用,只需从 CDN 处加载即可: ...

July 7, 2021 · 1 min · jiezi

关于vue.js:组件-对props双向绑定sync修饰符

子组件代码 父组件代码 大多数状况下,父组件通过v-bind(:)的形式批改子组件的props对象中的属性来达到父改子的目标;反过来,子改父则通过语法糖: .sync修饰符的形式批改,代码例子如上述 .sync 修饰符(用于子组件批改父组件)是@update:changeTitle="obj.title = $event" 语法糖,其原理就是将event对象传入到子组件 如何实现:1)子组件首先定义个props属性: props: { title: { type: String, default: "",},},其次定义一个emit:this.$emit("update:changeTitle", newTitle); 2)父组件如果实现双向绑定,则须要:1.v-bind 作为单向子组件批改其属性,这里不做具体代码阐明,用的太熟了2.应用语法糖作为子组件批改父组件其属性::title="obj.title" // props,父组件批改子组件:changeTitle.sync="obj.title" // 通过点击子组件的办法,批改父组件 2)场景二,子向父单向批改子组件代码: 父组件代码:当点击按钮后,这里的msg属性值会产生扭转 能够试想下子改父的需要场景,大略逻辑就是这样,具体用法的看业务需要。。。

July 7, 2021 · 1 min · jiezi

关于vue.js:前端vue面试题附答案

前端vue面试题,附答案vue视频教程系列:腾讯Vue实战问卷网站视频教程视频教程:点击查看 残缺教程目录:点击查看 最新 Vue+Spring 游览我的项目视频教程:点击查看 残缺教程目录:点击查看 Vue3.0(正式版) + TS 仿知乎专栏企业级我的项目视频教程:点击查看 残缺教程目录:点击查看 Vue3.0+TS打造企业级组件库 前端中高级开发者必修课视频教程:点击查看 残缺教程目录:点击查看 基于VantUI的Vue挪动端电商我的项目实战视频教程:点击查看 残缺教程目录:点击查看 vue 中应用了哪些设计模式1.工厂模式 - 传入参数即可创立实例 虚构 DOM 依据参数的不同返回根底标签的 Vnode 和组件 Vnode 2.单例模式 - 整个程序有且仅有一个实例 vuex 和 vue-router 的插件注册办法 install 判断如果零碎存在实例就间接返回掉 3.公布-订阅模式 (vue 事件机制) 4.观察者模式 (响应式数据原理) 5.装璜模式: (@装璜器的用法) 6.策略模式 策略模式指对象有某个行为,然而在不同的场景中,该行为有不同的实现计划-比方选项的合并策略 Vue模版编译原理晓得吗,能简略说一下吗?简略说,Vue的编译过程就是将template转化为render函数的过程。会经验以下阶段: 生成AST树优化codegen首先解析模版,生成AST语法树(一种用JavaScript对象的模式来形容整个模板)。 应用大量的正则表达式对模板进行解析,遇到标签、文本的时候都会执行对应的钩子进行相干解决。 Vue的数据是响应式的,但其实模板中并不是所有的数据都是响应式的。有一些数据首次渲染后就不会再变动,对应的DOM也不会变动。那么优化过程就是深度遍历AST树,依照相干条件对树节点进行标记。这些被标记的节点(动态节点)咱们就能够跳过对它们的比对,对运行时的模板起到很大的优化作用。 编译的最初一步是将优化后的AST树转换为可执行的代码。 Vue.js的template编译简而言之,就是先转化成AST树,再失去的render函数返回VNode(Vue的虚构DOM节点),具体步骤如下: 首先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的形象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创立编译器的。另外compile还负责合并option。 而后,AST会通过generate(将AST语法树转化成render funtion字符串的过程)失去render函数,render的返回值是VNode,VNode是Vue的虚构DOM节点,外面有(标签名、子节点、文本等等) 理解nextTick吗?异步办法,异步渲染最初一步,与JS事件循环分割严密。次要应用了宏工作微工作(setTimeout、promise那些),定义了一个异步办法,屡次调用nextTick会将办法存入队列,通过异步办法清空以后队列。 computed 的实现原理computed 实质是一个惰性求值的观察者。 computed 外部实现了一个惰性的 watcher,也就是 computed watcher,computed watcher 不会立即求值,同时持有一个 dep 实例。 ...

July 7, 2021 · 2 min · jiezi

关于vue.js:建议收藏-你想知道的Vue3核心源码这里都有

写作不易,未经作者容许禁止以任何模式转载!如果感觉文章不错,欢送关注、点赞和分享!继续分享技术博文,关注微信公众号  前端LeBronEffect和Reactiveeffect作为Vue响应式原理中的外围,在Computed、Watch、Reactive中都有呈现 次要和Reactive(Proxy)、track、trigger等函数配合实现收集依赖,触发依赖更新 Effect 副作用依赖函数Track 依赖收集Trigger 依赖触发Effecteffect能够被了解为一个副作用函数,被当做依赖收集,在响应式数据更新后被触发。 Vue的响应式API例如Computed、Watch都有用到effect来实现 先来看看入口函数 入口函数次要是一些逻辑解决,外围逻辑位于createReactiveEffectfunction effect<T = any>( fn: () => T, options: ReactiveEffectOptions = EMPTY_OBJ): ReactiveEffect<T> { // 如果曾经是effect,则重置 if (isEffect(fn)) { fn = fn.raw } // 创立effect const effect = createReactiveEffect(fn, options) // 如果不是惰性执行,先执行一次 if (!options.lazy) { effect() } return effect}createReactiveEffectconst effectStack: ReactiveEffect[] = []function createReactiveEffect<T = any>( fn: () => T, options: ReactiveEffectOptions): ReactiveEffect<T> { const effect = function reactiveEffect(): unknown { // 没有激活,阐明调用了effect stop函数 if (!effect.active) { // 无调度者则间接返回,否则执行fn return options.scheduler ? undefined : fn() } // 判断EffectStack中有没有effect,有则不解决 if (!effectStack.includes(effect)) { // 革除effect cleanup(effect) try { /* * 开始从新收集依赖 * 压入stack * 将effect设置为activeEffect * */ enableTracking() effectStack.push(effect) activeEffect = effect return fn() } finally { /* * 实现后将effect弹出 * 重置依赖 * 重置activeEffect * */ effectStack.pop() resetTracking() activeEffect = effectStack[effectStack.length - 1] } } } as ReactiveEffect effect.id = uid++ // 自增id,effect惟一标识 effect.allowRecurse = !!options.allowRecurse effect._isEffect = true // 是否是effect effect.active = true // 是否激活 effect.raw = fn // 挂载原始对象 effect.deps = [] // 以后effect的dep数组 effect.options = options // 传入的options return effect}// 每次effect运行都会从新收集依赖,deps是effect的依赖数组,须要全副清空function cleanup(effect: ReactiveEffect) { const { deps } = effect if (deps.length) { for (let i = 0; i < deps.length; i++) { deps[i].delete(effect) } deps.length = 0 }}TrackTrack这个函数常呈现在reactive的getter函数中,用于依赖收集 ...

July 7, 2021 · 12 min · jiezi

关于vue.js:vue必会面试题答案

vue必会面试题+答案vue视频教程系列:腾讯Vue实战问卷网站视频教程残缺教程目录:点击查看 最新 Vue+Spring 游览我的项目残缺教程目录:点击查看 Vue3.0(正式版) + TS 仿知乎专栏企业级我的项目残缺教程目录:点击查看 Vue3.0+TS打造企业级组件库 前端中高级开发者必修课残缺教程目录:点击查看 基于VantUI的Vue挪动端电商我的项目实战残缺教程目录:点击查看 Vue为什么没有相似于React中shouldComponentUpdate的生命周期?考点: Vue的变动侦测原理 前置常识: 依赖收集、虚构DOM、响应式零碎 根本原因是Vue与React的变动侦测形式有所不同 React是pull的形式侦测变动,当React晓得发生变化后,会应用Virtual Dom Diff进行差别检测,然而很多组件实际上是必定不会发生变化的,这个时候须要用shouldComponentUpdate进行手动操作来缩小diff,从而进步程序整体的性能. Vue是pull+push的形式侦测变动的,在一开始就晓得那个组件产生了变动,因而在push的阶段并不需要手动管制diff,而组件外部采纳的diff形式实际上是能够引入相似于shouldComponentUpdate相干生命周期的,然而通常正当大小的组件不会有适量的diff,手动优化的价值无限,因而目前Vue并没有思考引入shouldComponentUpdate这种手动优化的生命周期. Vue中的key到底有什么用?key是为Vue中的vnode标记的惟一id,通过这个key,咱们的diff操作能够更精确、更疾速 diff算法的过程中,先会进行新旧节点的首尾穿插比照,当无奈匹配的时候会用新节点的key与旧节点进行比对,而后超出差别. diff程能够概括为:oldCh和newCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量互相比拟,一共有4种比拟形式。如果4种比拟都没匹配,如果设置了key,就会用key进行比拟,在比拟的过程中,变量会往两头靠,一旦StartIdx>EndIdx表明oldCh和newCh至多有一个曾经遍历完了,就会完结比拟,这四种比拟形式就是首、尾、旧尾新头、旧头新尾.精确: 如果不加key,那么vue会抉择复用节点(Vue的就地更新策略),导致之前节点的状态被保留下来,会产生一系列的bug.疾速: key的唯一性能够被Map数据结构充分利用,相比于遍历查找的工夫复杂度O(n),Map的工夫复杂度仅仅为O(1).vue和react的区别=> 相同点: 1. 数据驱动页面,提供响应式的试图组件2. 都有virtual DOM,组件化的开发,通过props参数进行父子之间组件传递数据,都实现了webComponents标准3. 数据流动单向,都反对服务器的渲染SSR4. 都有反对native的办法,react有React native, vue有wexx=> 不同点: 1.数据绑定:Vue实现了双向的数据绑定,react数据流动是单向的 2.数据渲染:大规模的数据渲染,react更快 3.应用场景:React配合Redux架构适宜大规模多人合作简单我的项目,Vue适宜小快的我的项目 4.开发格调:react举荐做法jsx + inline style把html和css都写在js了 vue是采纳webpack + vue-loader单文件组件格局,html, js, css同一个文件Vue模版编译原理晓得吗,能简略说一下吗?简略说,Vue的编译过程就是将template转化为render函数的过程。会经验以下阶段: 生成AST树优化codegen首先解析模版,生成AST语法树(一种用JavaScript对象的模式来形容整个模板)。 应用大量的正则表达式对模板进行解析,遇到标签、文本的时候都会执行对应的钩子进行相干解决。 Vue的数据是响应式的,但其实模板中并不是所有的数据都是响应式的。有一些数据首次渲染后就不会再变动,对应的DOM也不会变动。那么优化过程就是深度遍历AST树,依照相干条件对树节点进行标记。这些被标记的节点(动态节点)咱们就能够跳过对它们的比对,对运行时的模板起到很大的优化作用。 编译的最初一步是将优化后的AST树转换为可执行的代码。 Vue.js的template编译简而言之,就是先转化成AST树,再失去的render函数返回VNode(Vue的虚构DOM节点),具体步骤如下: 首先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的形象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创立编译器的。另外compile还负责合并option。 而后,AST会通过generate(将AST语法树转化成render funtion字符串的过程)失去render函数,render的返回值是VNode,VNode是Vue的虚构DOM节点,外面有(标签名、子节点、文本等等) 理解nextTick吗?异步办法,异步渲染最初一步,与JS事件循环分割严密。次要应用了宏工作微工作(setTimeout、promise那些),定义了一个异步办法,屡次调用nextTick会将办法存入队列,通过异步办法清空以后队列。 说说Vue的生命周期吧什么时候被调用? beforeCreate :实例初始化之后,数据观测之前调用created:实例创立万之后调用。实例实现:数据观测、属性和办法的运算、 watch/event 事件回调。无 $el .beforeMount:在挂载之前调用,相干 render 函数首次被调用mounted:了被新创建的vm.$el替换,并挂载到实例下来之后调用改钩子。beforeUpdate:数据更新前调用,产生在虚构DOM从新渲染和打补丁,在这之后会调用改钩子。updated:因为数据更改导致的虚构DOM从新渲染和打补丁,在这之后会调用改钩子。beforeDestroy:实例销毁前调用,实例依然可用。destroyed:实例销毁之后调用,调用后,Vue实例批示的所有货色都会解绑,所有事件监听器和所有子实例都会被移除每个生命周期外部能够做什么? ...

July 7, 2021 · 3 min · jiezi

关于vue.js:vue-元素样式修改

这里是应用谬误。ref有两种状况:第一,如果在一般的 DOM 元素上应用,援用指向的就是 DOM 元素。第二,如果用在子组件上,援用就指向组件实例。你这种状况,就是第二种,利用在组件上,那么如果想要获取dom,须要应用this.$refs.wrap.$el来获取组建的跟容器dom节点,而后设置款式。当然如果你想设置slot外面的元素,那么在拿到 根容器dom节点后,就能够通过失常的querySelector等办法获取你想要的任何dom节点了如果还有问题,欢送再次探讨。? // this.$nextTick(() => { // let height = this.$refs.bgImg.offsetHeight; // let width = this.$refs.bgImg.offsetWidth; // this.$refs.bgImg.style.height = (height * this.num) / 100 + "px"; // this.$refs.bgImg.style.width = (width * this.num) / 100 + "px"; // });

July 6, 2021 · 1 min · jiezi

关于vue.js:vue3x相对于2x常用的写法变化整理

欢送大家关注我的技术博客:style'me的集体博客以下对于vue3x我的项目创立到启动的一些变动,供大家参考,如果您筹备应用3x版本作为我的项目开发,相干配置建议您降级到更高的版本,比方: 1、在3x版本中如果您应用element-ui,建议您抉择element-plus,这是专门为vue3x定制的版本2、vue-router建议您降级到4.0版本以上,更好的兼容vue3x3、vuex建议您降级到4.0版本以上,更好的兼容vue3x4、若您想在我的项目中应用sass,建议您装置sass和sass-loader即可,sass-loader版本倡议在10.1.1版本,这样能力更好的兼容vue3x /*装置element-plus*/cnpm install element-plus -S/*装置路由4.0版本以上*/npm install vue-router@4/*装置vuex4.0版本以上*/npm install vuex@4/*装置sass和sass-loader*/npm install sass sass-loader@10.1.11、装置区别 /*2x vue我的项目脚手架装置办法*/vue int webpack projectName/*3x vue我的项目脚手架装置办法*/vue create projectName2、我的项目挂载区别 /*2x main.js挂载*/import Vue from "vue"import App from "./App.vue"new Vue({ render: h => h(App)}).$mount("#app")/*3x main.js挂载*/import { createApp } from "vue"import App from "./App.vue"createApp(App).mount("#app")3、插件挂载和全局注册应用区别 /*2x 插件挂载和全局注册应用*/import Vue from "vue"import App from "./App.vue"Vue.use(ElementUI, axios,animated)/*2x注册全局插件应用prototype*/Vue.prototype.$echarts = echartsnew Vue({ render: h => h(App)}).$mount("#app")/*3x 插件挂载和全局注册应用*/import { createApp } from "vue"import App from "./App.vue"const app = createApp(App)/*3x注册全局插件应用app.config.globalProperties*/app.config.globalProperties.$echarts = echartsapp.use(ElementPlus,{locale})app.use(router)app.use(store)app.mount("#app")上面图片是vue2x和vue3x再我的项目挂载和插件应用上得一些api的变动 ...

July 6, 2021 · 1 min · jiezi

关于vue.js:Vue3全家桶升级指南二reftoReftoRefs的区别

ref是对原始数据的拷贝,当批改ref数据时,模板中的视图会产生扭转,然而原始数据并不会扭转。toRef是对原始数据的援用,批改toRef数据时,原始数据也会产生扭转,然而视图并不会更新。在vue3中定义一个根底类型的响应式数据个别应用ref,定义一个援用类型的响应式数据个别应用reactive。 import {ref,reactive} from "vue"export default { setup(){ let num=ref(0) let obj=reactive({name:'张三',age:18}) return {num,obj} }}这样在模板中应用的时候,就能够间接通过{{num}},{{obj.name}},{{obj.age}}获取数据了。 根底类型的数据没有问题,然而援用类型的值在模板中这样写就比拟累赘了,咱们也能够间接解构进去,在模板中就能够间接应用{{name}}和{{age}}了。 import {ref,reactive} from "vue"export default { setup(){ let num=ref(0) let obj=reactive({name:'张三',age:18}) let {name,age}=obj return {num,name,age} }}toRef是将对象中的某个值转化为响应式数据 toRef(obj,key) import {toRef} from "vue"export default { setup() { let obj = { name: '张三', age: 18 }; let newObj = toRef(obj, 'name'); setTimeout(() => { newObj.value = '李四'; console.log(obj, newObj); //obj中的name和newObj都变成李四了,然而视图显示还是张三,不会变动 }, 2000); return { obj, newObj }; },};</script>toRef是对原始数据的援用,批改toRef数据时,原始数据也会产生扭转,然而视图并不会更新。 ...

July 6, 2021 · 1 min · jiezi

关于vue.js:Vue-常用自定义指令

1、元素点击范畴扩大指令 v-expandClick应用该指令能够隐式的扩大元素的点击范畴,因为借用伪元素实现,故不会影响元素在页面上的排列布局。 可传入的参数为:上右下左扩大的范畴,单位 px,默认向外扩大 10px。指令的代码如下: export default function (el, binding) { const s = document.styleSheets[document.styleSheets.length - 1] const DEFAULT = -10 // 默认向外扩大10px const ruleStr = `content:"";position:absolute;top:-${top || DEFAULT}px;bottom:-${bottom || DEFAULT}px;right:-${right || DEFAULT}px;left:-${left || DEFAULT}px;` const [top, right, bottom, left] = binding.expression && binding.expression.split(',') || [] const classNameList = el.className.split(' ') el.className = classNameList.includes('expand_click_range') ? classNameList.join(' ') : [...classNameList, 'expand_click_range'].join(' ') el.style.position = el.style.position || "relative" if (s.insertRule) { s.insertRule('.expand_click_range::before' + '{' + ruleStr + '}', s.cssRules.length) } else { /* IE */ s.addRule('.expand_click_range::before', ruleStr, -1) }}参数 Attributes:而后你能够在模板中任何元素上应用新的 v-expandClick property,如下: ...

July 6, 2021 · 6 min · jiezi

关于vue.js:带你用VUE实现上传图片效果

摘要:在逛b站时看到一个上传图片的成果,想着能够本人也做一个,因为原作者是用原生js写的,那我不如就用vue写好了,当然,是一个很小的货色,在HTML文件间接援用vue就好了,具体步骤如下~本文分享自华为云社区《vue实现上传图片并预览成果》,原文作者:北极光之夜。 。 一.话不多,先看成果: 大家好,(╹◡╹)ノ” 这是我在逛b站时看到一个上传图片的成果,想着能够本人也做一个,因为原作者是用原生js写的,那我不如就用vue写好了,当然,是一个很小的货色,在HTML文件间接援用vue就好了,具体步骤如下~ 二.具体实现步骤:1.先定义根本标签:先不论标签外面的vue指令,先定义根本HTML标签。 <div id="app"> <div class="upload"> <input type="file" id="file" multiple @change="upload"> </div> <ul class="view"> <li> <img src="./img/52.jpg"> <div class="delect" title="删不了我" @click="noDelect">×</div> </li> <li v-for="(item,index) in list" :key="index" > <img :src="item"> <div class="delect" @click="delect(index)">×</div> </li> </ul> </div>.upload是上传图片盒子,外面有一个input类型为file的标签;.view是放图片的大盒子,每个小 li 是一张图片,默认有一张图,还有一个小 li 是为了v-for渲染的;delect是删除图片按钮; 2.开始定义根本css款式:此为全局与底层盒子款式。 *{ margin: 0; padding: 0; box-sizing: border-box; } #app{ width: 900px; background-color: rgb(241, 241, 241); margin: 50px auto; } 3. .view的款式:.view{ display: flex; justify-content: space-around; flex-wrap: wrap; align-items: space-around; }display: flex; flex布局;justify-content:space-around;主轴每个子项目距离对齐。flex-warp:warp;换行。align-items:space-around:穿插轴每个子项目距离对齐。 ...

July 6, 2021 · 2 min · jiezi

关于vue.js:Vue3全家桶升级指南一composition-API

1、setup()vue3中的composition API中最重要的就是setup办法了,相当于组件的入口,所有的composition API都必须放到setup()中的应用。 setup是在组件实例初始化之前执行的(beforeCreated之前),是整个组件的入口函数,这个时候数据和办法还没有进行挂载,因而在setup中this并不会执行以后组件实例,也不能通过this获取组件中的数据和办法了。 在模板中应用到的变量和办法必须在setup中return进去,能力应用。 export default { setup(){ let name="张三" return {name}//必须在这里return,模板中能力应用过 }}setup中的参数下面曾经说过,因为setup是在beforeCreate之前执行的,所以setup中的this并不会指向以后组件实例,this的值为undefined,那么咱们怎么和父子组件通信呢(之前能够通过this.$emit触发)?这时就须要用到setup的参数了。 setup有两个参数,第一个是props,父组件传递给以后组件的prop都在这个参数对象中,第二个参数是上下文context,外面蕴含后attrs,emit,slots,这几个参数的用法就和vue2中的大同小异了,这里不做过多赘述。 2、ref用来定义根底类型的响应式数据在setup中间接定义的变量不是响应式的,如果须要定义根底类型的响应式变量,须要应用ref来定义 import {ref} from "vue"export default { setup(){ let name = '张三'; setTimeout(() => { name = '李四'; console.log(name);//这里的扭转了,然而视图并不会更新 }, 2000); return { name }; }}import {ref} from "vue"export default { let name = ref('张三'); setTimeout(() => { name.value = '李四'; console.log(name.value); //李四 }, 2000); return { name };} 须要留神的是,通过ref定义的变量,在js中应用的时候须要通过.value来获取或者设置值,然而在模板中应用的时候不须要加.value,vue外部曾经帮咱们解决了。 通过ref获取dom元素或者组件实例在vue2中要获取dom元素或者组件实例,间接在dom元素或者组件上增加ref="refName",而后在js中通过this.$refs.refName就能够获取了。在vue3中,应用形式略有不同。 间接在dom元素或者组件上增加ref="refName"在setup中定义ref,初始值为null,let refName=ref(null),留神变量的名字肯定要和dom或者组件上的ref名字保持一致。在js中通过refName.value获取dom元素或者组件实例留神,须要在setup总return应用到的ref变量<template> <div ref="name">张三</div> <button @click="change">add</button> <hr /></template><script>import { ref } from 'vue';export default { setup() { let name = ref(null); const change = () => { console.log(name.value); name.value.innerText = '李四'; }; return { name, change }; },};</script>3、reactive用来定义援用类型的响应式数据import { reactive } from 'vue';export default { setup() { let obj = reactive({ name: '张三', age: 18 }); setTimeout(() => { obj.name = '李四'; console.log(obj); //李四 }, 2000); return { obj }; },};在模板中间接通过{{obj.name}}就能够拜访数据了 ...

July 5, 2021 · 3 min · jiezi

关于vue.js:如何查询缓存设置

1) 验证服务器是否反对查问缓存 show variables like '%have_query_cache%'; | Variable_name | Value | | have_query_cache | YES | 2) 查问缓存会受到以下3个零碎变量值的影响 show variables like 'query_cache%'; | Variable_name | Value | | query_cache_limit | 1048576 | //可能缓存的最大后果集大小 | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | //决定为查问缓存调配的内存大小 | query_cache_type | OFF | //决定查问缓存的操作形式 | query_cache_wlock_invalidate | OFF | 那么mysql到底是怎么决定到底要不要把查问后果放到查问缓存中呢?是依据query_cache_type这个变量来决定的。 这个变量有三个取值:0,1,2,别离代表了off、on、demand。 mysql默认为开启 on (1) 如果是0,那么query cache 是敞开的。 如果是1,那么查问总是先到查问缓存中查找,即便应用了sql_no_cache依然查问缓存,因为sql_no_cache只是不缓存查问后果,而不是不应用查问后果。 如果是2,DEMAND没有应用sql_cache,如同依然应用了查问手游缓存 论断:只有query_cache_type没有敞开,sql查问总是会应用查问缓存,如果缓存没有命中则开始查问的执行打算到表中查问数据。 sql_cahce和sql_no_cache hints的应用为了测试sql语句的效率,有时候要不必缓存来查问。 应用SELECT SQL_NO_CACHE ...语法即可 SQL_NO_CACHE的真正作用是禁止缓存查问后果,但并不意味着cache不作为后果返回给query。 目前的SQL_NO_CACHE有两种解释: 1.对以后query不应用数据库已有缓存来查问,则以后query破费工夫会多点 ...

July 5, 2021 · 2 min · jiezi

关于vue.js:zookeeper的应用场景

zookeeper是一个高可用的分布式数据管理与协调框架,基于对ZAB算法的实现,该框架可能很好地保障分布式环境中数据的一致性。 1、数据公布订阅数据公布/订阅零碎,即配置核心。发布者将数据公布到zk上,功订阅者进行数据订阅,进而达到动静获取数据的目标,实现配置信息的集中式治理和数据的动静更新。公布/订阅零碎个别有两种设计模式:推push和拉pull。zk采纳推拉联合的形式:客户端向服务端注册本人须要关注的节点,一旦该节点的数据产生变更,那么服务端就会向相应的客户端发送Watcher事件告诉,客户端收到这个告诉之后,须要被动到服务端获取最新的数据。 应用场景 适宜进行配置管理的信息个别具备以下特点: 数据量通常较小 数据内容在运行时会产生动态变化 集群中各机器共享,配置统一。应用形式 配置存储将须要集中管理的配置信息写到zk的数据节点上,称为配置节点 配置获取集群中的每台机器在启动初始化阶段,从zk的配置节点上读取配置信息,同时在该节点上注册一个页游数据变更的Watcher,一旦节点数据发生变化,所有订阅的客户端可能获取到变更告诉 配置变更零碎运行过程中,如果配置发生变化,客户端会接管到变更告诉后,就能够从新获取最新的数据。 2、负载平衡典型场景:动静DNS服务 3、命名服务分布式系统中,被命名的实体通常能够是集群中的机器、提供的服务地址或近程对象。其中较为常见的就是一些分布式服务框架中的服务列表。通过应用命名服务,客户端利用可能通过指定名字来获取资源的实体、服务地址和提供者的信息等。zk提供的命名服务性能,可能帮忙利用零碎通过一个资源援用的形式实现对资源的定位和应用。狭义上命名服务的资源定位不是真正意义的实体资源,在分布式环境中,下层利用暗影须要一个全局惟一的名字,例如,应用zk实现一套分布式全局惟一ID的调配也属于命名服务。 4、分布式协调/告诉zk应用watcher注册与异步告诉机制,可能很好地实现分布式环境中不同的机器,甚至是不同零碎之间的协调与告诉。 应用场景 心跳检测机器间的心跳检测是指在分布式环境中,不同机器之间须要检测到彼此是否在失常运行。传统的办法是在机器之间建设长连贯,通过TCP连贯固有的心跳监测机制实现下层机器的心跳检测。基于zk的长期节点个性,能够让不同的机器都在zk的一个指定节点下创立长期子节点,不同机器能够监听长期节点来判断对应的客户端机器是否存活。通过这种形式,检测零碎和被检测零碎不须要间接关联,大大减少零碎耦合。 5、集群治理集群治理,包含集群监控与集群管制。 集群监控:集群运行时状态的手机,例如以后有多少台机器在工作等 集群管制:对集群进行操作和管制,例如对集群中机器进行高低线等传统的分布式系统中,通过在集群中每台机器上部署一个agent,由agent被动想指定的监控核心零碎上报本人所在的机器状态。zk中,应用watcher监听和长期节点的个性实现集群治理。 应用示例 分布式日志收集零碎 在线云主机治理 分布式定时工作零碎6、Master选举Master选举,即在集群的所有机器中选举出一台作为Master。 利用zk的强一致性,即zk将会保障客户端无奈反复创立一个曾经存在的数据节点,来保障高并发下节点的创立能保障全局唯一性。Master动静选举的过程大抵如下:客户端集群在zk上指定节点下创立长期节点,在这个过程中,只有一个客户端能创立胜利,那么这个客户端所在的机器就成为了页游里的www.sangpi.comMaster。同时,其余没有在zk上创立胜利的客户端会注册一个子节点变更的watcher,用于监控以后master是否存活,一旦发现master挂了,那么其余的客户端从新进行master选举。 7、分布式锁 排他锁利用zk的长期节点实现,过程与master选举相似 共享锁利用zk的长期程序节点实现。每台机器在指定节点下创立长期程序节点,并指定节点类型是读还是写,并对节点创立子节点变更的watcher。同时判断本人在子节点中的序号大小,以及比本人小的节点的类型,例如如果本人想申请读锁,如果比本人小的节点都是读,则获取锁。 羊群效应下面共享锁的实现原理是,只有子节点产生变更,所有机器都要收到变更告诉并获取所有子节点列表。当集群中节点个数很多时,会导致发送大量的watcher告诉,对zk服务器造成微小的性能影响和网络冲击,更重大的是,当如果同一时间有多个节点发生变化,zk服务器会在短时间外向其余客户端发送大量的工夫告诉——这就是所谓的羊群效应。 改良后的共享锁改良后的共享锁是每个长期节点不对所有的子节点注册watcher,而是只比照本人序号小的最初一个节点注册watcher监听。 8、分布式队列分布式队列,简略地讲气氛两大类,一类是惯例的先进先出队列,另一种是等到队列元素会聚后才统一安排执行的Barrier模型。 FIFO实现原理与全写的共享锁相似,应用长期程序节点实现,每个节点监听比本人序号小的最初一个节点。 Barrier利用长期节点实现。比方当子节点个数达到10后再持续往下执行,过程大略是:将指定节点的数据内容赋值为10,客户端在指定节点下创立长期节点,而后客户端读取指定节点的数据内容,并对子节点列表注册watcher。

July 5, 2021 · 1 min · jiezi

关于vue.js:2021秋招vue面试题答案

2021秋招vue面试题+答案vue视频教程系列:Vue3.0新个性教程视频教程:点击观看 残缺教程目录:点击查看 Vue源码解析系列视频教程:点击观看 残缺教程目录:点击查看 闲云游览我的项目(vue+element-ui)视频教程:点击观看 残缺教程目录:点击查看 前端Vue3.0从0到1手把手撸码搭建治理后盾零碎视频教程:点击观看 残缺教程目录:点击查看 你有对 Vue 我的项目进行哪些优化?如果没有对 Vue 我的项目没有进行过优化总结的同学,能够参考本文作者的另一篇文章《 Vue 我的项目性能优化 — 实际指南 》,文章次要介绍从 3 个大方面,22 个小方面具体解说如何进行 Vue 我的项目的优化。 (1)代码层面的优化 v-if 和 v-show 辨别应用场景computed 和 watch 辨别应用场景v-for 遍历必须为 item 增加 key,且防止同时应用 v-if长列表性能优化事件的销毁图片资源懒加载路由懒加载第三方插件的按需引入优化有限列表性能服务端渲染 SSR or 预渲染(2)Webpack 层面的优化 Webpack 对图片进行压缩缩小 ES6 转为 ES5 的冗余代码提取公共代码模板预编译提取组件的 CSS优化 SourceMap构建后果输入剖析Vue 我的项目的编译优化(3)根底的 Web 技术的优化 开启 gzip 压缩浏览器缓存CDN 的应用应用 Chrome Performance 查找性能瓶颈vue3.0 个性你有什么理解的吗?Vue 3.0 正走在公布的路上,Vue 3.0 的指标是让 Vue 外围变得更小、更快、更弱小,因而 Vue 3.0 减少以下这些新个性: (1)监测机制的扭转 ...

July 5, 2021 · 5 min · jiezi

关于vue.js:前端面试题Vue前端爬坑

参考文章:前端面试题 -- Vue --作者:游荡de蝌蚪1. 说一下Vue的双向绑定数据的原理vue实现双向数据绑定:通过数据劫持联合发布者-订阅者模式的形式,再通过Object.defineProperty()来劫持各个属性的setter和getter,在数据变动时通过公布音讯给订阅者,触发相应的监听回调。理解更多请点击:发布者-订阅者模式简略实现 2. 解释单向数据流和双向数据绑定单项数据流:数据流是单向的,流动繁多可追踪,排查问题的时候快捷不便。毛病是要更新UI时,需创立各种action来变更对应的state3. Vue 如何去除url中的 #vue-router的两种模式:hash和history。hash模式是vue-router默认的,路由在加载的时候,我的项目中的url会主动带上#;如果要去除#,能够应用history模式。new Router({ mode: 'history', routes: [ ]})须要留神的是:当咱们启用 history 模式的时候,因为咱们的我的项目是一个单页面利用,所以在路由跳转的时候,就会呈现拜访不到动态资源而呈现 404 的状况,这时候就须要服务端减少一个笼罩所有状况的候选资源:如果 URL 匹配不到任何动态资源,则应该返回同一个 index.html 页面4. 对 MVC、MVVM的了解MVCModel:实例模型( 数据保留 )Controller:控制器( 业务逻辑 )View:视图( 用户界面 ) 解决逻辑用户通过view发送指令到controllercontroller接管指令,实现业务逻辑,告诉model扭转状态model将新的数据渲染到view上,用户失去反馈特点:所有的通信都是单向的 MVVMModel:模型( 数据 )View:视图( 界面 )ViewModel:视图模型是 mvvm模式的外围,它是连贯view和model的桥梁 特点: 各局部之间的通信,都是双向的采纳双向绑定:View 的变动,主动反映在 ViewModel,反之亦然详情请点击:由浅入深讲述MVVM 两种模式的具体区别请移步:MVC,MVP 和 MVVM 的图示 5. 介绍虚构DOM虚构DOM介绍 DOM 基本操作相干知识点整顿 JavaScript面试考点之常见DOM操作 6. vue生命周期的了解vue实例有一个残缺的生命周期,生命周期也就是指一个实例从开始创立到销毁的这个过程beforeCreate() 在实例创立之间执行,数据未加载状态created() 在实例创立、数据加载后,能初始化数据,dom渲染之前执行beforeMount() 虚构dom已创立实现,在数据渲染前最初一次更改数据mounted() 页面、数据渲染实现,实在dom挂载实现beforeUpadate() 从新渲染之前触发updated() 数据曾经更改实现,dom 也从新 re nder 实现,更改数据会陷入死循环beforeDestory() 和 destoryed() 前者是销毁前执行(实例依然齐全可用),后者则是销毁后执行7. 组件通信父组件向子组件通信子组件通过 props 属性,绑定父组件数据,实现单方通信 ...

July 4, 2021 · 2 min · jiezi

关于vue.js:vue面试题答案2021前端面试

vue面试题+答案,2021前端面试vue视频教程系列:Vue3+ElementPlus+Koa2 全栈开发后盾零碎试看:点击观看 残缺课程:点击查看 Vue3.0高阶实战:开发高质量音乐Web app试看:点击观看 残缺课程:点击查看 VUE全面教学+VUE开源我的项目超级实战:试看:点击观看 残缺课程:点击查看 最新Vue.JS教程疾速入门到我的项目实战(Vue3/VueJS技术详解)试看:点击观看 残缺课程:点击查看 最新最全前端毕设我的项目(小程序+VUE+Noed+React+uni app+Express+Mongodb)试看:点击观看 残缺课程:点击查看 MVC 和 MVVM 区别MVCMVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计榜样 Model(模型):是应用程序中用于解决应用程序数据逻辑的局部。通常模型对象负责在数据库中存取数据View(视图):是应用程序中解决数据显示的局部。通常视图是根据模型数据创立的Controller(控制器):是应用程序中解决用户交互的局部。通常控制器负责从视图读取数据,管制用户输出,并向模型发送数据MVC 的思维:一句话形容就是 Controller 负责将 Model 的数据用 View 显示进去,换句话说就是在 Controller 外面把 Model 的数据赋值给 View。 MVVMMVVM 新增了 VM 类 ViewModel 层:做了两件事达到了数据的双向绑定 一是将【模型】转化成【视图】,行将后端传递的数据转化成所看到的页面。实现的形式是:数据绑定。二是将【视图】转化成【模型】,行将所看到的页面转化成后端的数据。实现的形式是:DOM 事件监听。MVVM 与 MVC 最大的区别就是:它实现了 View 和 Model 的主动同步,也就是当 Model 的属性扭转时,咱们不必再本人手动操作 Dom 元素,来扭转 View 的显示,而是扭转属性后该属性对应 View 层显示会主动扭转(对应Vue数据驱动的思维) 整体看来,MVVM 比 MVC 精简很多,不仅简化了业务与界面的依赖,还解决了数据频繁更新的问题,不必再用选择器操作 DOM 元素。因为在 MVVM 中,View 不晓得 Model 的存在,Model 和 ViewModel 也察看不到 View,这种低耦合模式进步代码的可重用性 ...

July 4, 2021 · 3 min · jiezi

关于vue.js:vue2中是如何监听数组变化的

重写数组的七种办法 reverse sort splice push pop unshift shift手动触发notify更新视图对于splice unshif push三个办法增加的数据再次进行数据劫持(observeArray)如果数组中的数据是援用数据类型的话,会持续对其中的数据进行递归劫持总结下来就两件事: 更改数组原型对数组的每项进行数据观测,并手动触发notify来更新视图

July 3, 2021 · 1 min · jiezi

关于vue.js:vue2中是如何监听数组变化的

重写数组的七种办法 reverse sort splice push pop unshift shift手动触发notify更新视图对于splice unshif push三个办法增加的数据再次进行数据劫持(observeArray)如果数组中的数据是援用数据类型的话,会持续对其中的数据进行递归劫持总结下来就两件事: 更改数组原型, 对数组的每项进行数据观测,并手动触发notify来更新视图

July 3, 2021 · 1 min · jiezi

关于vue.js:前端工程化最佳实践

一、代码格式化标准目前我的项目中应用的 vetur 插件内置有 prettier 格式化,也能够装置 prettier code formatter 插件,eslint 也蕴含局部代码格调查看的性能,eslint 和 prettier 自身就有局部规定是抵触的,导致格式化凌乱,所以必须对立代码格式化标准1、vscode 中的配置优先级默认配置文件(优先级最低)用户配置文件(优先级次之)工程配置文件 (优先级最高)为了对立大家的代码格调,对立应用我的项目中的配置文件作为配置项。因为 ESLint 的次要性能是代码质量检查,Prettier 的次要性能是代码格调查看,所以不要在 ESLint 中去配置代码格调相干的规定。 prettier。 一个很风行的代码格式化工具,你很容易在编辑器找到实现它的各种插件,这里用它在代码提交前做代码格式化。eslint。 代码查看工具。eslint 也能够负责一部分代码格局查看的工作,然而 prettier 曾经做的很好了,所以我便没用 eslint 的代码格局查看,只让其负责代码谬误查看。2、解决配置抵触npm i eslint-config-prettier eslint-plugin-prettier -Deslint-config-prettier 敞开 Eslint 中与 Prettier 抵触的选项,eslint-plugin-prettier 将 prettier 的规定设置为 eslint 的规定,对不合乎规定的进行提醒 3、prettierrc 配置文件阐明//.prettierrc.jsmodule.exports = { printWidth: 160, //编辑器每行的长度,默认80 tabWidth: 4, //制表符tab的宽度,默认值是2 useTabs: false, //代码缩进是否用制表符tab,默认false semi: true, //是否应用分号,默认true,应用分号 singleQuote: true, //是否应用单引号,默认为false quoteProps: 'as-needed', //对象属性的引号应用 as-needed 仅在须要的时候应用 consistent 有一个属性须要引号,就都须要引号 preserve 保留用户输出的状况 jsxSingleQuote: false, trailingComma: 'none', //开端逗号 none 开端没有逗号 es5 es5无效的中央保留 all 在可能的中央都加上逗号 bracketSpacing: true, //字面量对象括号中的空格,默认true true - Example: { foo: bar }. false - Example: {foo: bar}. jsxBracketSameLine: false, arrowParens: 'avoid', //箭头函数中的括号always avoid htmlWhitespaceSensitivity: 'ignore', vueIndentScriptAndStyle: false,//是否给vue中的 <script> and <style>标签加缩进 endOfLine: 'auto', //行开端标识 eslintIntegration: true, //不让prettier应用eslint的代码格局进行校验}4、eslint 配置文件阐明//.eslintrc.jsmodule.exports = { root: true, env: { node: true }, 'extends': [ 'plugin:vue/essential', "plugin:prettier/recommended", // '@vue/standard' ], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // 'vue/script-indent': ['error', 4, { 'baseIndent': 1 }], // "quotes": [2, "single", { "avoidEscape": true }], // 应用prettier来替换eslint的规定 "prettier/prettier": "error", "no-var": 2,//禁用var,用let和const代替 "no-unused-vars": [2, { "args": "none" }], //打消未应用的变量 不查看函数的参数 "no-redeclare": 2, //禁止屡次申明同一变量 "no-dupe-keys": 2,//在创建对象字面量时不容许键反复 'eqeqeq': ['error', 'always', { null: 'ignore' }], // 强制应用全等 }, parserOptions: { parser: 'babel-eslint', "ecmaVersion": 6, "sourceType": "module" }}三、代码提交标准1、装置 husky 和 lint-stage//husky新版本配置办法齐全不一样,这里锁定版本号npm i husky@4.2.5 lint-stage -DHusky 可能阻止不标准的代码提交和推送,确保本地的代码曾经通过查看能力 push 到近程。 ...

July 3, 2021 · 3 min · jiezi

关于vue.js:Vue修饰符

事件修饰符 .prevent修饰符.stop修饰符.once修饰符prevent修饰符 用于阻止默认事件行为,相当于event.preventDefault(),例如a标签默认跳转 <div id="app"><a @click.prevent="fn" href="https://kaiwu.lagou.com/">链接</a> // 能够增加fn办法也能够不加<a @click.prevent href="https://kaiwu.lagou.com/">链接</a></div>stop修饰符 用于阻止事件流传,相当于event.stopPropagation()。元素在事件触发后默认会产生事件冒泡,事件冒泡会导致,以后元素触发后向上传递给父元素,并顺次向外传递,如果内部某元素也存在雷同事件时也会被触发点击按钮时,div的点击事件也会触发 正确写法 <div @click="fn1"> <button @click.stop="fn2">按钮</button></div>修饰符的联合应用 <div @click="fn1"> <a @click.prevent.stop="fn2" href="xxx">链接</a></div>once修饰符 用于设置事件只会触发一次 <div id="app"><button @click.once="fn2">按钮</button></div>passive修饰符 passive这个修饰符会执行默认办法。你们可能会问,明明默认执行为什么会设置这样一个修饰符。这就要说一下这个修饰符的本意了【浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时,能力晓得外部是否会调用preventDefault函数来阻止事件的默认行为,所以浏览器自身是没有方法对这种场景进行优化的。这种场景下,用户的手势事件无奈疾速产生,会导致页面无奈疾速执行滑动逻辑,从而让用户感觉到页面卡顿。】艰深点说就是每次事件产生,浏览器都会去查问一下是否有preventDefault阻止该次事件的默认动作。咱们加上passive就是为了通知浏览器,不必查问了,咱们没用preventDefault阻止默认动作个别用在滚动监听,@scoll,@touchmove,因为滚动监听过程中,挪动每个像素都会产生一次事件,每次都应用内核线程查问prevent会使滑动卡顿。咱们通过passive将内核线程查问跳过,能够大大晋升滑动的晦涩度注:passive和prevent抵触,不能同时绑定在一个监听器上self修饰符 只当在 event.target 是以后元素本身时触发处理函数 <div v-on:click.self="doThat">...</div>更多事件修饰符来自官网 按键修饰符 按键码:按键码指的是将 按键的按键码 作为修饰符应用,以标识按键的操作形式。 <div id="app"><input type="text" @keyup="fn"> // 指定按键松开会触发</div>var vm = new Vue({data:{},methods:{ fn(event){ console.log(event) // 内有code,key,keycode(被废除) }}}).$mount("#app")增加按键码修饰符 <div id="app"><input type="text" @keyup.49="fn"> // 只有keycode49能够触发</div>如果按键是字母,能够批改为字母修饰符 <div id="app"><input type="text" @keyup.a="fn"> // 只有a字母能够触发</div>非凡按键:指的是键盘中相似esc、enter、delete等性能按键,为了更好的兼容性,应首选内置别名。不同设施keycode可能不统一,非凡按键用别名 <div id="app"><input type="text" @keyup.esc="fn"> // 只有 esc 能够触发</div>按键码的修饰符组合 <div id="app"><input type="text" @keyup.a.b.c="fn"> // a 或者 b 或者 c 都能够触发</div>更多按键修饰符来自官网 零碎修饰符 零碎按键指的是ctrl、alt 、shift、meta(windows键)等按键。零碎按键不独自应用零碎按键通常与其余按键组合应用,例如配合ctrl+c 来应用<div id="app"> <input type="text" @keyup.ctrl="fn"> // 点击 ctrl+c</div><div id="app"> <input type="text" @keyup.ctrl.q ="fn"> // 只有 ctrl+q 能力触发</div>鼠标按键修饰符 ...

July 3, 2021 · 1 min · jiezi

关于vue.js:Vue指令

内容解决v-oncev-textv-htmlv-once : 使元素外部的插值表达式只失效一次 <div id="app"> <p v-once> {{xxxxx}} </p></div>v-text : 元素内容整体替换为指定纯文本数据 与插值表达式区别:插值表达式是用来进行元素动静设置的,v-text是间接将 纯文本内容 设置为 指定数据,会笼罩老元素只会显示纯文本,增加标签元素,也不会生成标签元素 <div id="app"><p v-text="content"> 这段内容会被笼罩 </p></div>new Vue({el:"#app",data:{ content:"我是新内容" // 纯文本 content:"<span> span内容 </span>" // 非纯文本 不会生成span标签}})v-html :元素内容整体替换为指定的HTML文本 相似于v-text,然而非纯文本能够转换成对应元素 <div id="app"><p v-html="content"> 这段内容会被笼罩 </p></div>new Vue({el:"#app",data:{ content:"我是新内容" // 纯文本 ok content:"<span> span内容 </span>" // 非纯文本 生成span标签}})属性绑定v-bind指令:v-bind指令用于动静绑定HTML属性 Class绑定Style绑定内容绑定办法只能解决内容,如果对标签属性进行解决,通过绑定属性 <div id="app"> <p v-bind:title ="content_title"> 内容 </p> <p :title ="content_title"> 内容 </p> // 简写</div>new Vue({ el:"#app", data:{ content_title :"我是title属性内容", demo:"hello" }})v-bind容许应用表达式 , 与插值表达式相似不容许应用语句内容 <p :class ="var num = 10"> , error ...

July 3, 2021 · 3 min · jiezi

关于vue.js:Vue使用vuequilleditor实现富文本需求

Quill富文本编辑器简略记录 一,组件中引入import { quillEditor } from 'vue-quill-editor'款式文件引入import 'quill/dist/quill.core.css'import 'quill/dist/quill.snow.css' 将quillEditor 注册为组件,并写出标签 <quill-editor class="editor" @ready="onEditorReady($event)" @change="onEditorChange($event)" :value="content" :options="editorOption" />editorOption: {//此处设置quill的一些属性和其模块属性 placeholder: '占位占位占位', modules: { toolbar: { container: toolbarOptions, theme: 'snow' handlers: { //此处定义toolbar上按钮的行为 'image': (value) => { //用户点击了toolbar的图片按钮之后的行为 }, 'link': (value) => { //用户点击了toolbar的link按钮之后的行为 } } } }}onEditorReady (quill) { this.quill = quill }onEditorChange ({ quill, html, text }) { //解决富文本内容 }

July 2, 2021 · 1 min · jiezi

关于vue.js:免费开源基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之联合索引十一

基于Vue和Quasar的前端SPA我的项目实战之联结索引(十一)回顾通过之前文章 基于Vue和Quasar的前端SPA我的项目实战之动静表单(五)的介绍,对于表单元数据配置相干内容曾经实现了,本文次要介绍联结索引性能的实现。 简介联结索引又叫复合索引,如果索引只有一个字段,在设置列属性的时候间接设置。如果是多个字段联结索引,就须要独自设置了。这里能够创立一般或惟一两种类型的联结索引,通过下拉框抉择多个字段。当然如果索引只有一个字段,也能够通过联结索引性能进行设置。 UI界面索引治理 外围代码因为在创立和编辑表单元数据时候都用到了联结索引性能,所以封装成组件component,名称为CIndexList,这样能够复用,防止代码冗余。 CIndexList组件CIndexList 通过getData办法获取索引内容 getData() { let newIndexs = []; this.table.indexs.forEach(function(item){ const newIndexLines = []; item.columns.forEach(function(column){ newIndexLines.push({ column: { id: column.id, name: column.name } }) }); const newIndex = { id: item.id, isNewRow: item.isNewRow, caption: item.caption, description: item.description, indexStorage: item.indexStorage, indexType: item.indexType, name: item.name, indexLines: newIndexLines } newIndexs.push(newIndex); }); let data = { indexs: newIndexs } return data;}利用在创立和编辑页面中援用即可 <CIndexList ref="cIndexListRef" v-model="table"></CIndexList>保留的表单时候,通过$refs['cIndexListRef']获取索引内容 const ref = this.$refs['cIndexListRef'];const data = ref.getData();例子创立表单时候,点击“联结索引”按钮,弹出对话框设置页面,增加3个联结索引。 ...

July 2, 2021 · 1 min · jiezi

关于vue.js:基于vue3实现的vue3seamlessscroll无缝滚动

装置vue3-seamless-scroll npm install vue-seamless-scroll --save 参数配置文档地址 GitHub与Gitee注册组件 全局注册 import { createApp } from 'vue';import App from './App.vue';import { jsSeamlessScroll, cssSeamlessScroll } from "vue3-seamless-scroll";import "vue3-seamless-scroll/lib/vue3SeamlessScroll.css"const app = createApp(App);app.use(cssSeamlessScroll);app.use(jsSeamlessScroll);app.mount('#app');单文件注册 <template></template><script> import { defineComponent } from "vue"; import { jsSeamlessScroll, cssSeamlessScroll } from "vue3-seamless-scroll"; import "vue3-seamless-scroll/lib/vue3SeamlessScroll.css" export default defineComponent({ components: { jsSeamlessScroll, cssSeamlessScroll } })</script>应用组件 <template> <js-seamless-scroll :datas="datas" class="scroll"> <div class="item" v-for="(item, index) in datas" :key="index"> <span>{{item.title}}</span> <span>{{item.date}}</span> </div> </js-seamless-scroll> <css-seamless-scroll :datas="datas" class="scroll"> <div class="item" v-for="(item, index) in datas" :key="index"> <span>{{item.title}}</span> <span>{{item.date}}</span> </div> </css-seamless-scroll></template><script>import { defineComponent, reactive, toRefs } from "vue";import { jsSeamlessScroll, cssSeamlessScroll } from "vue3-seamless-scroll";export default defineComponent({ name: "App", components: { jsSeamlessScroll, cssSeamlessScroll }, setup() { const state = reactive({ datas: [ { title: "Vue3.0 无缝滚动组件展现数据第1条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第2条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第3条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第4条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第5条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第6条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第7条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第8条", date: Date.now(), }, { title: "Vue3.0 无缝滚动组件展现数据第9条", date: Date.now(), }, ] }); return { ...toRefs(state) }; },});</script><style>.scroll { height: 270px; width: 500px; margin: 100px auto; overflow: hidden;}.scroll .item { display: flex; align-items: center; justify-content: space-between; padding: 3px 0;}</style>展现成果 ...

July 1, 2021 · 1 min · jiezi

关于vue.js:vue3的小知识

一、组合式Api1、简介组合式Api须要有个理论应用它的中央,这个地位称为setup。 2、组件代码构造export default { components: { RepositoriesFilters }, props: { user: { type: String } }, data () { return { test: '' } }, computed: {}, watch: {}, methods: {}, mounted() {}, created() {}二、setup1、参数setup接管两个参数props和context propssetup函数中的第一个参数props,props是响应式的,每当传入新的props,都将会被更新 export default { props: { title: String }, setup(props) { console.log(props.title) }}ps:props是响应式的,不能应用es6解构赋值 如果须要构造props的话,能够应用toRefs来操作 import {toRefs} from 'vue'export default { props: { title: String }, setup(props) { const {title} = toRefs(props) console.log(title.value) }}contextcontext是第二个参数,非响应式的,裸露三个属性 export default { setup(props, context) { // Attribute (非响应式对象) console.log(context.attrs) // 插槽 (非响应式对象) console.log(context.slots) // 触发事件 (办法) console.log(context.emit) } // 解构 setup(props, {attrs,slots,emit}) {}}拜访组件propertysetup执行的时候,组件还未被创立,因而只能拜访props、attrs、slots、emit不能拜访data、computed、methods ...

July 1, 2021 · 1 min · jiezi

关于vue.js:new-Vue-发生了什么

先看看源码: 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'); } this._init(options);}Vue.prototype._init = function (options) { var vm = this; ... vm.$options = mergeOptions(options || {}, vm); ... initState(vm); ... if (vm.$options.el) { vm.$mount(vm.$options.el); } ... };}由此,不难看出做了以下步骤:1.合并配置: new Vue({ store: store, router: router, render: h => h(App),}).$mount('#app')//故,合并(路由、状态治理、 渲染函数)2.初始化生命周期 function initState (vm) { vm._watchers = []; var opts = vm.$options; if (opts.props) { initProps(vm, opts.props); } if (opts.methods) { initMethods(vm, opts.methods); } if (opts.data) { initData(vm); } else { observe(vm._data = {}, true /* asRootData */); } if (opts.computed) { initComputed(vm, opts.computed); } if (opts.watch && opts.watch !== nativeWatch) { initWatch(vm, opts.watch); }}//initState就是将vue实例中的data,method,computed,watch等数据项做进一步得解决,其实就是做代理以及转化成可观测对象。3.数据处理实现之后就将数据挂载到指定的钩子上:vm.$mount(vm.$options.el); ...

July 1, 2021 · 1 min · jiezi

关于vue.js:Vue移动端车牌选择器实现摘要

最近在做一个小程序,外部有车辆管理系统,须要用户录入车牌信息,在网上没找到特地合乎本人需要的Vue组件,于是本人梳理了一下相干的要点,并制作了一个基于VueJS的可在小程序内运行的车牌选择器效果图 原型图 相干性能点梳理点击抉择车牌,展现车牌抉择软键盘车牌第一位为省份简称 只能抉择省份简称抉择完省份后,软键盘的数据须要切换到数字跟字母的混合车牌第二位为市级标识符 市级标识符时,不容许抉择数字 ,须要将数字按钮给禁用车牌第三位如果是D(纯电动)或者F(混动),车牌 车牌如果是新能源,车牌位数为8位车牌如果是燃油车,车牌位数为7位

July 1, 2021 · 1 min · jiezi

关于vue.js:Vue组件封装-单向数据流告诉我如何更好的封装公共组件

1.问题形容:在重构零碎中一个功能模块的时候遇到的一些问题(1)代码拷贝重大,同样的构造写&办法写了二十多遍。(2)明明曾经封装好某个性能组件,不同的人开发时又稀里糊涂的写了一顿。 2.重构时遇到的问题:(1)单向数据流的问题:Vue心愿子组件中注册的props只能被应用不能被批改。(2)大量应用$parent隐式的调用父组件中的数据或办法,导致代码可读性很差。(3)将父组件中的公共办法抽离到一个class中(调用的中央不对会导致一些问题)、或者通过export一一导出,同样可读性、可维护性、扩展性都不怎么样。其实这就是组件封装的不合理,既然办法是通用的为什么不能间接在封装组件的时候将办法写好?而要通过$parent调用,而后再抽离进来以缩小代码量???(4)在子组件中大量的注册props,但注册的有些属性是须要被批改的(默认会报警)。而后通过$emit的形式批改父组件中的这个值再映射到子组件,尽管解决了报警,但代码量会剧增。同样不合理,尽管也能够通过将props写入到子组件的data、computed中的形式解决。然而我感觉,一个公共组件大量的注册父组件中的属性原本就是不合理的,说白了就是设计上的缺点。 3.从新设计&正当封装:(1)子组件中须要用到父组件中的很多属性,并且用到的某些属性又须要在子组件中被批改。很显著通过props注册的形式是不合乎单向数据流的理念的。所以咱们只在子组件中注册一个值,用来确定以后是在哪个父组件下,而后通过这个值在一个封装好的js中获取对应父组件的一堆属性。这样既不会扭转注册的props也能将多个父组件的属性放到一起不便对立治理,还能更好的对不同的父组件进行扩大,同时大量的升高了代码量。(2)把公共办法封装到公共组件中,何必再进行一次抽离。(3)只封装雷同的局部。如果多个页面有重合的构造,那么重合的局部应该当成公共局部封装到一个组件里。而不同的局部只须要在父组件中与公共组件进行组合即可。为什么不能把不同的局部也组合到公共组件里?我集体了解,这样做代码的耦合度会很高,如果前期进行改变,则解耦又会很麻烦。 4.局部代码:Common.vue Options.js Father.vue 5.补充:还有一种解决单向数据流报警的办法就是传个对象,例如代码中的queryForm。当然queryForm也能够对应写到options.js中。 6.总结:在重构我的项目的时候询问了一个新手,他说好的程序好在它的设计,高级的人高级在会他会设计。所以综合我在重构时遇到的一些问题,好的设计的确nb!还须要持续致力啊。。。如果有更优的做法还心愿可能揭示一波~感激!

June 30, 2021 · 1 min · jiezi

关于vue.js:工作学习总结2

一、Vue.set和this.$set的区别受 ES5 的限度,Vue.js 不能检测到对象属性的增加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上能力让 Vue.js 转换它,能力让它是响应的。正确写法:this.$set(this.data,”key”,value’) var vm=new Vue({ el:'#test', data:{ //data中曾经存在info根属性 info:{ name:'小明'; } }});//给info增加一个性别属性Vue.set(vm.info,'sex','男');Vue.set是将set绑定在vue的构造函数上,而this.$set是间接挂载在vue的原型上。 二、$on和$emit事件$emit是触发事件 $on是监听事件 // 监听slotValueChange事件created() { this.$on('slotValueChange', this.slotValueChange);},slotValueChange() { this.$emit('change', this.values, this);},三、$('body').off().on()// 点击事件委托,向下冒泡,匹配到button的类则触发$('body').on('click', '.button', (e) => {})// 防止多个事件触发,能够在点击事件之前先移除以后button的所有事件,on和off的参数须要保持一致$('body').off('click', '.button')

June 30, 2021 · 1 min · jiezi

关于vue.js:前端面试每日-31-第806天

明天的知识点 (2021.06.30) —— 第806天 (我也要出题)[html] 应用HTML5制作一个啤酒瓶的成果[css] 应用CSS3实现一个齿轮动画成果[js] 写一个多级地点抉择组件,说说你的思路[软技能] 你本人有整顿过前端的常识图谱吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

June 30, 2021 · 1 min · jiezi

关于vue.js:uniapp纯前端附件选择上传完善版

lsj-upload插件地址:https://ext.dcloud.net.cn/plugin?id=5459不分明应用形式可导入示例我的项目运行残缺示例心愿能帮到你! 应用插件有任何问题欢送退出QQ探讨群:701468256 若能帮到你还请点亮5颗小星星以作激励哈~应用阐明属性是否必填值类型默认值阐明width否String100%容器宽度height否String80rpx容器高度size否Number10附件大小下限(M)top,left,right,bottom否[Number,String]0设置控件相对地位,仅App端position=absolute时无效,其余端若须要相对定位可自行在外层设置css position款式value否Number0上传进度,通过v-model双向绑定childId否StringlsjUpload控件的id(仅APP无效,尽量每个控件命名一个惟一Id)position否Stringstatic控件的排版地位(仅APP无效,static=控件随页面滚动;absolute=控件在页面中相对定位,不随窗口内容滚动;nvue仅反对absolute)@input否Functionvalue上传进度扭转时回调@callback是FunctionObject上传胜利时回调ref调用作用办法传入参数类型阐明创立文件管理器createObject初始化上传文件须要的必备参数,参数见下方函数阐明敞开文件管理器close-APP端手动敞开webview层,用于切换tab视图,可见示例我的项目vue:<lsj-upload ref="lsjUpload"width="100px"height="80rpx"childId="upload":size="10"v-model="percent"@input="onInput"@callback="onCallback"> <view class="btn" style="height: 80rpx;">抉择附件上传</view></lsj-upload>函数阐明/* */export default { data() { return { tabIndex: 0, percent: '' } }, onReady() { // 初始化参数并创立上传DOM this.onCreate(); }, methods: { // app端切换tab示例 onTab(tabIndex) { this.tabIndex = tabIndex; if (tabIndex == 0 ) { // 因为创立webview时须要获取按钮地位,所以须要nextTick后再从新调用create this.$nextTick(()=>{ this.onCreate(); }) } else { this.$refs.lsjUpload.close(); } }, onCreate() { // 初始化参数并创立上传DOM this.$refs.lsjUpload.create({ // #ifdef APP-PLUS cuWebview: this.$mp.page.$getAppWebview(), // app必传 // #endif url: 'https://www.example.com/upload', //替换为你的接口地址 name: 'file', // 附件key size: 10, // 附件上传大小下限(M),默认10M debug: true, //依据你接口需要自定义申请头 header: { 'Authorization': 'token' }, //依据你接口需要自定义body参数 formData: { 'orderId': 1000 } }); }, onInput(e) { console.log('上传进度',e); }, onCallback(e) { console.log('上传后果',e); } }}舒适提醒文件上传如阐明表白还不够分明,怎么调用可导入残缺示例我的项目运行体验和查看APP端请优先联调Android,上传胜利后再运行iOS端,如iOS返回status=0则须要后端开启容许跨域;header的Content-Type类型须要与服务端要求统一,否则收不到附件(服务端若没有明文规定则可不写,应用默认匹配)服务端不分明怎么配置跨域可加群征询,具体百度~欢送退出QQ探讨群:701468256欢送退出QQ探讨群:701468256欢送退出QQ探讨群:701468256若能帮到你还请点亮5颗小星星以作激励哈~若能帮到你还请点亮5颗小星星以作激励哈~若能帮到你还请点亮5颗小星星以作激励哈~

June 30, 2021 · 1 min · jiezi

关于vue.js:VUE展示无限层级树形数据结构

在做我的项目中,会遇到一些树形的数据结构,罕用在左侧菜单导航,或者评论援用等中央,这种数据结构有个特点是不晓得它会嵌套多少层,所以用template去展现这样的数据时就有点辣手,这篇文章梳理两种展现这种数据结构的办法。 文章中用到的数据是上面这个: mainData: { value: "root", children:[{ value: "层级1-1", children:[{ value: "层级2-1", children:[{ value: "层级3-1", children:[] }] },{ value: "层级2-2", children:[] }] },{ value: "层级1-2", children:[] }]}也就是上面这个样子。 组件递归调用第一种是组件递归调用本人的形式,创立一个组件,该组件在援用本人去展现children的数据,子组件如下: <template><div> <div class="demo"> {{treeData.value}} <tree-comp v-for="(item, index) in treeData.children" :treeData="item"></tree-comp> </div></div></template><script>export default { name: 'treeComp', props:{ treeData: { default: function(){ return {} } } }, mounted(){}, methods:{}}</script><style lang="less" scoped> .demo{padding:5px 0;margin:1px 10px;text-align: left;font-size:16px;max-width:500px;border-left:1px dashed #999; &:before{content:'--';display: inline-block;padding:0 4px;} }</style>而后创立父组件,父组件应用子组件,并将数据传入子组件。 <template> <tree-comp :treeData="mainData"></tree-comp></template><script>export default { name: 'treeMain', data () { return { mainData: { value: "root", children:[ { value: "层级1-1", children:[{ value: "层级2-1", children:[{ value: "层级3-1", children:[] }] },{ value: "层级2-2", children:[] }] },{ value: "层级1-2", children:[] } ] } } }, components:{ "tree-comp": () => import('./TreeComp') }, mounted(){}, methods:{}}</script>对于递归组件的内容,在官网文档里是有提到的-->递归组件 ...

June 29, 2021 · 2 min · jiezi

关于vue.js:适合Vue3初学者的一篇文章

Vue3[TOC] 学习vue3重写的动机应用新的js原生个性解决设计和体系架构的缺点 在vue3中新增了es6的 proxy,proxy打消了vue2的所有限度(比方新对象属性的减少、数组元素的间接批改不会触发响应式机制,这是很多老手所谓的bug),而且有着更好的性能。 Proxy就是真正意义给一个对象包上一层代理从而去实现数据侦听劫持的操作,所以总的来说这个复杂度是间接少了一个数量级的。只有你对这个代理后的对象拜访或批改外面的货色都能被这层代理所感知到,进而去动静地决定返回什么货色给你,并且也不再须要把选项的这些货色再反复挂到组件实例的this下面,因为你拜访的时候是有这个信息晓得你拜访的货色是属于props还是data还是其余的,vue只须要依据这个信息去对应的数据结构外面拿进去就能够了,单就这一点而言你就能够感觉到组件的内存占用曾经少了一半。 vue3的改良及特点1.性能的晋升:打包大小缩小 41%,首次渲染快 55%,更新快 133%,内存应用缩小 54%。 2.新推出的Composition API 使组件更易保护,缩小无用数据绑定页面更晦涩。 4.更好TypeScript反对,能够在创立命令里间接配置,页面集成畅通无阻。 5.Teleport(瞬移组件)、Suspense(解决异步加载组件问题)和全局 API 的批改和优化。 6.Vue3兼容大部分Vue2的个性,用Vue2代码开发Vue3都能够。 Vue3.x中的新增点1.多根节点组件在vue3中,组件正式反对多根节点组件,即片段! <template> <header>...</header> <main>...</main> <footer>...</footer> </template> 2.setup要开始应用Composition API,咱们首先须要一个能够理论应用它的中央。在Vue组件中,咱们将此地位称为setup。setup执行时尚未创立组件实例,所以不能应用this,此时this 为 undefined。除了props,无法访问组件中申明的任何data、computed、methods。 注:setup是为了优化性能让程序按需引入全局对立 参数 (props, context)// props 父组件传过来的props props是具备反馈性的(传入新的props时会自动更新)// context {attrs, emit, slots}setup(props, context) { console.log(context) /** * attrs: Proxy * emit: (event, ...args) => instance.emit(event, ...args) * slots: Proxy */}setup 生命周期钩子钩子函数setup钩子beforeCreate没有created没有beforeMountonBeforeMountmountedonMountedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmountederrorCapturedonErrorCapturedrenderTrackedonRenderTrackedrenderTriggeredonRenderTriggered因为setup是围绕beforeCreate和created生命周期挂钩运行的,因而您无需显式定义它们。换句话说,应该在这些钩子中编写的任何代码都应间接在setup函数中编写。用法一:<template>  <div class="home">    <div>名字:{{ name }}</div>    <ul>      <li v-for="item in list" :key="item" @click="show(item)">{{ item }}</li>    </ul>  </div></template><script lang="ts">import { defineComponent, ref } from "vue";// 注:defineComponent 在TypeScript下,给予了组件正确的参数类型推断export default defineComponent({  name: "Home",  components: {},  props:['msg'],  setup(props,context) {    // 注:setup函数是处于生命周期函数 beforeCreate 和 Created 两个钩子函数之间的函数 也就说在 setup 函数中是无奈应用 data 和 methods 中的数据和办法,而methods等能够应用setup中return进来的数据。    /*    一.函数的第一个参数是 props 用于接管 props.msg      这个props是一个响应式的Proxy对象,不能够解构,解构后会失去响应,如果要用解构的形式,要用toRefs      let { msg } = toRefs(props) //然而解析成ref了要用msg.value,所以间接用props.msg更简略          二.context对象在setup()中裸露三个属性 attrs 、slots 和 emit 因为在setup函数中还没有创立Vue实例,是无奈应用vm.$attrs、vm.$slots和vm.$emit的,所以这三个属性充当了这样的作用,应用办法雷同。    留神:      context.attrs和vm.$attrts蕴含的是在实例vm.props中没有被申明辨认的attribute(class和style除外)。所以setup()中参数props中裸露的变量,就不会在context.attrs中裸露。      context.slots和vm.$slots只能拜访具名插槽,没有命名的插槽或者v-slot:default的是没有裸露的。      context的attrs和slots是有状态的,当组件更新时也会实时更新,所以也不要解构。但与props不同的是,它们不是响应式的,在setup()中的应用应放弃只读的状态,如果要扭转能够在onUpdated的周期函数中进行。      context.emit和vm.$emit能够触发实例上的监听事件。    */     const list = ref(["深圳", "北京", "上海"]);    const name = ref("");    //注:用ref是为了转换成援用类型,让全局援用保持一致,而之前原始类型是不行的,所以要name.value的方示赋值    const show = (index: string) => {        name.value = index;    };    // 注:不return进来的数据,模板是无奈应用的。    return {        list,        name,        show    };  },});</script>用法二: reactive() 优化<template>  <div class="home">    <div>名字:{{ data.name }}</div>    <ul>      <li v-for="item in data.list" :key="item" @click="data.show(item)">{{ item }}</li>    </ul>  </div></template><script lang="ts">import { defineComponent, reactive } from "vue";export default defineComponent({  name: "Home",  components: {},  setup() {    const data = reactive({      list: ["深圳", "北京", "上海"],      name: "",      show: (index: string) => {        data.name = index;      },    });    return {      data    };  },});</script>用法三: toRefs() 优化<template>  <div class="home">    <div>名字:{{ name }}</div>    <ul>      <li v-for="item in list" :key="item" @click="show(item)">{{ item }}</li>    </ul>  </div></template><script lang="ts">import { defineComponent,reactive,toRefs } from "vue";export default defineComponent({  name: "Home",  components: {},  setup() {    const data = reactive({      list: ["深圳", "北京", "上海"],      name: "",      show: (index: string) => {        data.name = index;      },    });    const refData = toRefs(data);    //不能间接解析 ...data 必须用 toRefs()    return {      ...refData    };  },});</script>jsx ...

June 29, 2021 · 11 min · jiezi

关于vue.js:vue-项目打包发布时去除所有console

本人做的我的项目曾经实现啦~然而想着我的项目中的 console 太多了,就看到学习视频中真的有插件能够去除所有的 console 来打包公布,真的是绝绝子啊 yyds没错就是 这个插件,这是官网文档哦~ babel-plugin-transform-remove-console 先装置插件 npm install babel-plugin-transform-remove-console --save-dev装置实现后我的项目目录会新增一个 babel.config.js 的文件,在此文件中新增 transform-remove-console 即可,如下图: 好啦,实现啦,从新build一下即可!

June 29, 2021 · 1 min · jiezi

关于vue.js:elementUI-elselect获取点击项的整个对象item

在vue2引入elementUI之后,常常会遇到此类需要,el-select获取点击项的整个对象item,而不是默认的v-model 我的项目 官网文档有 value-key="value" 的用法 https://element.eleme.cn/#/zh-CN/component/select#select-attributes  案例 <template> <div> <el-select v-model="value" value-key="value" @change="change" placeholder="请抉择"> <el-option v-for="item in options" :key="item.value" :label="`${item.label}`" :value="item"><!--绑定整个对象item--> {{item.label}} </el-option> </el-select> </div></template><script>export default { name: 'HelloWorld', data (){ return { options: [{ value: '选项1', label: '黄金糕' }, { value: '选项2', label: '双皮奶' }, { value: '选项3', label: '蚵仔煎' }, { value: '选项4', label: '龙须面' }, { value: '选项5', label: '北京烤鸭' }], value: '' } }, created() { // 初始化赋值间接 赋值整个对象 this.value = { value: '选项5', label: '北京烤鸭' }; }, methods: { // chnage触发 change(e) { console.log(e);// 打印整个对象 } }}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped></style> ...

June 28, 2021 · 1 min · jiezi

关于vue.js:修改element-ui的table的表头

大略代码是这样的:调用element ui table的renderHeader接口 methods: { renderHeader(h, data) { let column = data.column; let label = column.label; switch(label) { case '登录人数': tip = '登录本零碎的人数,包含挪动端,网页端' case '登录次数': tip = '登录本零碎的次数,包含挪动端,网页端' defalult: tip = ''; } return ('<el-tooltip content={tip} placement='top-start'> <span>表头题目</span> </el-tooltip>') }}

June 28, 2021 · 1 min · jiezi

关于vue.js:vue如何清除定时器

1.定义全局变量 data() { return { textClose: "" m:'',//格式化后的分 s:'',//格式化后的秒 }; },2.调用之前先革除定时器 let examMinute = 90; // 90 FENZHOGN let tolTimers = examMinute * 60 * 1000; let tolS = tolTimers; const mm = Math.floor(tolTimers / 1000 / 60 ); const ss = Math.floor((tolTimers / 1000) % 60); that.m = mm > 9 ? mm : '0' + mm; that.s = ss> 9 ? ss: '0' +ss; // 革除定时器 that.textClose && clearInterval(that.textClose); that.textClose = null; that.textClose = window.setInterval(() => { if (tolS<= 1000) { // 倒计时 that.automaticSubmit = true; window.clearInterval(that.textClose); }else{ tolS-= 1000; // console.log('tolS',tolS); if(tolS<= 5* 60 * 1000 ){ that.countDownFlag = true; } const mm = parseInt((tolS / 1000 / 60)) const ss = parseInt(tolS / 1000 % 60) that.m = mm > 9 ? mm : '0' + mm; that.s =ss> 9 ? ss: '0' +ss; } }, 1000); // 销毁定时器 that.$once('hook:beforeDestroy', ()=>{ clearInterval(that.textClose); })

June 28, 2021 · 1 min · jiezi

关于vue.js:Vue3API学习笔记持续更新中

组合式APISetUpgraph LRA[setup] --> B[参数] B -->|Props| D[Props是响应式的,故不能解构] B -->|context| E[context是一个一般的JS对象,<br/>包含了组件的三个属性:attrs, slots, emit] 注意事项如果 data 和 methods 中定义的数据与办法 在setup中也存在,那么setup的优先级更高。在setup中申明的办法须要return进来。执行setup时,组件实例尚未创立,此时在setup中能够拜访 : propsattrsslotsemitdata computed methods 及 this均无法访问 代码示例 setup(props,{attrs, slots, emit}){ }响应性APIgraph TBA[响应性根底API] -->B[reactive] A--> D[readonly]A--> E[isProxy]A--> F[isReactive]A--> G[isReadonly]A--> H[toRaw]A--> J[markRaw]A--> K[shallowReactive]A--> L[shallowReadonly]style A fill:#2ff,fill-opacity:0.1,stroke:#faa,stroke-width:4pxreactive个别定义object(援用数据类型)的响应式数据。 Refsgraph TBA[Refs] -->B[ref] A--> C[unref]A--> D[isRef]A--> E[toref]A--> F[toRefs]A--> G[isRef]A--> H[customRef]A--> J[shallowRef]A--> K[triggerRef]style A fill:#2ff,fill-opacity:0.1,stroke:#faa,stroke-width:4pxref个别用来定义(数字,字符串)响应式数据,也能够用来定义响应式对象(object/Array)。如果应用ref来定义对象,那么在ref外部会主动将该对象转为reactive对象。 unref援用自官网:如果参数是一个 ref,则返回外部值,否则返回参数自身。这是 val = isRef(val)* ? val.value : val 的语法糖函数。 isRef查看值是否为一个 ref 对象,返回布尔值。 ...

June 28, 2021 · 1 min · jiezi

关于vue.js:Vue-SFC-Style-CSS-变量注入详解新版

CSS 变量能够跟 JavaScript 更好的通信,CSS 变量是运行时。通过本文你会意识并了解以下概念: SFC Style - 单文件组件的款式;原生 CSS 变量 - CSS 作者定义的标准规范;SFC Style Variables 提案(旧版);SFC style CSS variable injection(新版);Vue3 中的应用 CSS 变量注入以及应用原生 CSS 变量;变量注入的背地原理;CSS 变量注入的劣势。在 SFC Style Variables 提案中介绍到, Vue SFC 款式提供了简略的 CSS 组合和封装,但它是纯动态的 — 这意味着到目前为止咱们还没有能力在运行时依据组件的状态动静更新款式。 当初大多数古代浏览器都反对原生 CSS 变量,咱们能够利用它轻松连贯组件的状态和款式。 SFC Style 简略介绍Vue 单文件组件 (SFC) 标准 中介绍到,.vue 文件是一个自定义的文件类型,用类 HTML 语法形容一个 Vue 组件。每个 .vue 文件蕴含三种类型的顶级语言块 <template>、<script> 和 <style>,还容许增加可选的自定义块。 Style 语言块: 默认匹配:/\.css$/。一个 .vue 文件能够蕴含多个 <style> 标签。 <style> 标签能够有 scoped 或者 module 属性 (查看 scoped CSS 和 CSS Modules) 以帮忙你将款式封装到以后组件。具备不同封装模式的多个 <style> 标签能够在同一个组件中混合应用。 ...

June 28, 2021 · 4 min · jiezi

关于vue.js:vue3-和-vue2的比较

一、vue3绝对于vue2的优化类型判断的优化: 由flow.js 改为 typescript。数据劫持的优化: 由Object.defineProperty 改为 Proxy, 因为: 对于比拟深的对象,Object.defineProperty须要递归遍历所有属性,将所有属性变为响应对象,升高了性能Proxy 对于拜访到对象外部的才会变为响应对象编译阶段的优化:模版编译的优化、slot的编译优化、事件监听函数的缓存优化及diff算法的重写 slot优化,将slot编译为lazy函数,将slot的渲染的决定权交给子组件模版编译的优:通过编译阶段对动态模板的剖析,编译生成了 Block Tree。Block Tree 是一个将模版基于动静节点指令切割的嵌套区块,每个区块外部的节点构造是固定的,而且每个区块只须要以一个 Array 来追踪本身蕴含的动静节点diff算法重写是因为:vue2中单个组件内,VDOM diff须要遍历整个DOM树,更新须要从新生成DOM树;vue3的VDOM减少动态标记、动态晋升、事件缓存,会事后缓存DOM树,通过上下文拿到缓存的DOM树,只diff 动静节点<div id="content"> <p>text</p> // 动态节点 <p>text</p> // 动态节点 <p>{{ message }}</p> // 动静节点 <p>text</p> // 动态节点 <p>text</p> // 动态节点</div>逻辑复用的优化:由mixins 改为 hook钩子函数,因为: 定义的变量名容易抵触变量数据起源不清// hookimport { ref, onMounted, onUnmounted } from 'vue'export default () => { const width = ref(window.innerWidth); const height = ref(window.innerHeight); const update = () => { width.value = window.innerWidth; height.value = window.innerHeight; } onMounted(() => { window.addEventListener("resize", update) }) onUnmounted(() => { window.removeEventListener("resize", update) }) return { width, height }}二、vue3绝对于vue2的变动生命周期的变动vue3vue2setup() 开始创立组件beforeCreate() + created()onBeforeMount() 组件挂载到页面之前beforeMount()onMounted() 组件挂载到页面之后Mounted()onBeforeUpdate() 组件更新之前beforeUpdate()onUpdated() 组件更新之后updated()onBeforeUnmount() 组件卸载之前beforeDestroy()onUnmount() 组件卸载之前destroyed()onActivated()activated()onDeactivated()deactivated()全局API的变动## Beforeimport Vue from 'vue'import App from './App.vue'Vue.use(...)Vue.component(...)Vue.prototype.customProperty = ...new Vue({ render: h => h(App)}).$mount('#app')## Afterimport { createApp } from 'vue'import App from './App.vue'const app = createApp(App)app.use(...)app.component(...)app.config.globalProperties.customProperty = ...app.mount('#app')全局弹窗## Beforeimport vue from 'vue'import toastComponent from './toast.vue'const ToastConstructor = vue.extend(toastComponent)function showToast() { const toastDom = new ToastConstructor({...}) }vue.prototype.$toast = showToast ## After<div> <teleport to="body"> ... </teleport></div> 子组件向父组件传值## Beforeexport default { methods: { change() { this.$emit("todata", params); } }}## Afterexport default defineComponent({ emits: ["todata"], setup(props, {emit}) { const change = () => { const params = { user:"ylw" }; emit("todata", params); }; } })三、组件内的应用// sfc组件<script lang="ts"> import { defineComponent, ref, Ref, computed, watchEffect, PropType } from 'vue' interface Config { name: string; } const Iprops = { age: { type: Number as PropType<number> }, config: { type: Object as PropType<Config> required: true } } as const export default defineComponent({ name: 'App', props: Iprops, data() { return {} }, mounted() { }, setup(props, { slots, attrs, emit }) { const nameRef: Ref<number> = ref(0) const setName = () => { nameRef.value++ } const computedNameRef: Computed<number> = computed(() => { return nameRef.value + 2 }) watchEffect(() => { console.log(nameRef.value) }) return { name: nameRef, name2: computedNameRef, setName } } })</script>// jsx组件import { defineComponent, ref, computed, watchEffect } from 'vue'export default defineComponent({ const numberRef: Ref<number> = ref(1) setup() { const number = numberRef.value return () => { return (<div> <p>{ number }</p> </div>) } }})四、Vite和webpackvite的个性vite是一个基于浏览器原生ES imports的开发服务器利用浏览器去解析imports,在服务器端按需编译返回,齐全跳过了打包这一步,服务器随起随用;而webpack开发环境,须要编译打包es6、es7等,而后启动开发服务器vite反对热更新:vite是按需加载,webpack是全副加载vite依赖es module的个性vite的打包原理打包过程原理 webpack辨认入口->逐层辨认依赖->剖析/转换/编译/输入代码->打包后的代码逐级递归辨认依赖,构建依赖图谱->转化AST语法树->解决代码->转换为浏览器可辨认的代码vite-基于浏览器原生 ES module,利用浏览器解析 imports,服务器端按需编译返回vite的改良点webpack毛病vite改良点服务器启动迟缓将利用模块辨别为依赖 和 源码 两类; 应用esbuild构建;在浏览器申请源码时进行转换并按需提供源码基于nodejsesbuild(Go 编写) 预构建依赖,比node快 10-100 倍热更新效率低下;编辑单个文件会从新构建整个包;HMR 更新速度随规模增大降落HMR基于原生 ESM 上,更新速度与利用规模无关;利用http2的缓存+压缩劣势vite的毛病生态不迭webpack,加载器、插件不够丰盛生产环境esbuild构建对于css和代码宰割不够敌对没被大规模重度应用,会暗藏一些问题

June 27, 2021 · 2 min · jiezi

关于vue.js:Vue指令实现原理

前言自定义指令是vue中应用频率仅次于组件,其蕴含bind、inserted、update、componentUpdated、unbind五个生命周期钩子。本文将对vue指令的工作原理进行相应介绍,从本文中,你将失去: 指令的工作原理指令应用的注意事项根本应用官网案例: <div id='app'> <input type="text" v-model="inputValue" v-focus></div><script> Vue.directive('focus', { // 第一次绑定元素时调用 bind () { console.log('bind') }, // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { console.log('inserted') el.focus() }, // 所在组件VNode产生更新时调用 update () { console.log('update') }, // 指令所在组件的 VNode 及其子 VNode 全副更新后调用 componentUpdated () { console.log('componentUpdated') }, // 只调用一次,指令与元素解绑时调用 unbind () { console.log('unbind') } }) new Vue({ data: { inputValue: '' } }).$mount('#app')</script>指令工作原理初始化初始化全局API时,在platforms/web下,调用createPatchFunction生成VNode转换为实在DOM的patch办法,初始化中比拟重要一步是定义了与DOM节点绝对应的hooks办法,在DOM的创立(create)、激活(avtivate)、更新(update)、移除(remove)、销毁(destroy)过程中,别离会轮询调用对应的hooks办法,这些hooks中一部分是指令申明周期的入口。 // src/core/vdom/patch.jsconst hooks = ['create', 'activate', 'update', 'remove', 'destroy']export function createPatchFunction (backend) { let i, j const cbs = {} const { modules, nodeOps } = backend for (i = 0; i < hooks.length; ++i) { cbs[hooks[i]] = [] // modules对应vue中模块,具体有class, style, domListener, domProps, attrs, directive, ref, transition for (j = 0; j < modules.length; ++j) { if (isDef(modules[j][hooks[i]])) { // 最终将hooks转换为{hookEvent: [cb1, cb2 ...], ...}模式 cbs[hooks[i]].push(modules[j][hooks[i]]) } } } // .... return function patch (oldVnode, vnode, hydrating, removeOnly) { // ... }}模板编译模板编译就是解析指令参数,具体解构后的ASTElement如下所示: ...

June 27, 2021 · 4 min · jiezi

关于vue.js:关于移动端浏览器转入后台后倒计时停止运行的问题

最近做微信公众号H5页面,有一个用户培修申请的性能。当用户增加申请胜利后,跳转到一个提醒增加胜利页面,此页面有一个倒计时,倒计时实现后再跳转到培修列表页面。然而当倒计时时,按home键将微信切换到后盾,再进入微信,会发现倒计时进行在退出时的状态。冀望的是,倒计时应该复原倒计时。当微信切换到后盾时,安卓端会触发了visibilitychange事件,而苹果端不会触发此事件,还要侦听pagehide 事件。另外,思考到兼容性,要应用document.addEventListener而不是window.addEventListener来注册回调。因为Safari <14.0仅反对前者。 当事件产生时,能够通过上面的属性获取页面的状态:1、document.visibilityState 返回document的可见性, 由此能够晓得以后文档(即页面)是在背地, 或是不可见的暗藏标签页,或是(正在)预渲染。值有:'visible' : 表明页面为浏览器以后激活tab,而且窗口不是最小化状态。'hidden' : 页面不是以后激活tab页面,或者窗口最小化了,此时页面对用户不可见,或者操作系统正处于“锁屏状态”。'prerender' : 页面此时正在渲染中, 因而是不可见的。文档只能从此状态开始,永远不能从其余值变为此状态。留神: 浏览器反对是可选的。2、document.hidden:true/false 我的项目应用uni-app框架,解决的代码如下: created() { document.addEventListener('visibilitychange', e => { if(document.hidden) { // 网页被挂起 }else { // 网页被呼起 this.countDown(this.countDownTime) } }) // 当visibleStateState属性的值转换为hidden时,Safari不会按预期触发visibilitychange;  // 因而,须要侦听pagehide事件 // 出于兼容性起因,应用document.addEventListener而不是window.addEventListener来注册回调。因为Safari<14.0仅反对前者。 document.addEventListener('pagehide', function(e) { if(e.persisted) { // 网页被挂起 }else { // 网页被呼起 this.countDown(this.countDownTime) } }) this.countDown(this.time)},

June 27, 2021 · 1 min · jiezi

关于vue.js:微型Vue框架构建Part4Render渲染前

微型Vue框架构建Part1——根本目录构造微型Vue框架实现Part2——数据代理实现微型Vue框架构建Part3——$Mount办法实现 概述在上文 $Mount办法实现中,咱们依据入口点剖析了剖析了HTML构造,且为每一个HTML节点构建了虚构DOM(vnode)。本文将在此基础上实现Render渲染前的一些筹备工作,为Render渲染数据打下基础。前面渲染数据时,咱们就能依据模板语法和vnode的关系,找到对应的数据变量,通过虚构DOM渲染到页面中指标概览剖析页面中哪些地方用了模板语法HTML代码 <div id="app"> 文本内容: <span class="a">{{content}}</span> <span class="b">{{info.school}}</span> </div>依据上文,为每一个节点构建的虚构DOM(vnode),如下图咱们能看到打印出的vnode节点中,text属性值就是页面中用到模板语法 入口办法——parpaerRender /** * mount办法的具体实现 * @param {*} vm * @param {*} el 挂载节点对应的实在DOM */ function mount(vm, el) { // 第一步:构建虚构DOM const rootDom = getDom(el); vm._vnode = contrucVNode(vm, rootDom, null); // 第二步:收集DOM节点和模板语法的映射关系——待实现 parpaerRender(vm, vm._vnode); }解析vnode和模板愈发的关系咱们不仅须要晓得页面中哪些地方用到了模板语法,还须要晓得他们之间映射关系。前期咱们批改数据时可能同步页面中的展现内容。什么样的映射关系?: 单个的vnode节点中,用到了哪些模板语法单个的模板语法,有哪些vnode节点用到了。应用ES6中 Map对象代码实现——parpaerRender办法nodeType为3,示意是以一个文本节点analysisTemplteString:剖析模板 /** * 剖析虚构DOM中的模板语法和文本 * @param {*} vm * @param {*} vnode */ export function parpaerRender(vm, vnode) { if (vnode.nodeType === 3) { analysisTemplteString(vnode); } for (let i = 0; i < vnode.children.length; i++) { parpaerRender(vm, vnode.children[i]); } }### 代码实现——analysisTemplteString() ...

June 25, 2021 · 2 min · jiezi

关于vue.js:SCUI-基于Vue3elementPlus的高性能中后台前端框架让一切复杂的东西简单化

SCUI 特点介绍基于Vue3/elementPlus的高性能中后盾前端框架,并且承若收费开源。 对立API接口治理对立异样解决反对build后配置热更新多个独家组件、业务模板CRUD代码生成器残缺的鉴权体系和高精度权限管制控制台首页反对用户自定义拖拽增改,且可继续化反对依据角色权限渲染不同的控制台视图提供两套框架布局缩小带宽申请和前端算力上屡次优化,并且继续着实在公司应用我的项目,永不免费,继续更新地址演示文档gitee 感激点亮星星 :)装置教程# 克隆我的项目git clone https://gitee.com/lolicode/scui.git# 进入我的项目目录cd scui# 装置依赖npm i# 启动我的项目(开发模式)npm run serve启动实现后浏览器拜访 http://localhost:2800,接下去能够相熟一下或者进行业务开发步骤 一些截图 反对如果感觉本我的项目还不错或在工作中有所启发,请在Gitee(码云)帮开发者点亮星星,这是对开发者最大的反对和激励!

June 25, 2021 · 1 min · jiezi

关于vue.js:如何查询postgresql数量

1、查询数据库版本 select version();2、查询数据库的运行工夫 select current_timestamp-pg_postmaster_start_time() as uptime;3、查询数据库的数据量 SELECT datname ,a.rolname ,pg_encoding_to_char(encoding) ,datcollate ,datctype ,pg_size_pretty(pg_database_size(datname))FROM pg_database d ,pg_authid aWHERE d.datdba = a.oidAND datname NOT IN ('template0' ,'template1' ,'postgres' )ORDER BY pg_database_size(datname) DESC;4、 查问手游数据库连接数应用状况 SELECT s.setting "可用连接数" , a.used_session "已应用连接数" , s.setting::bigintwww.diuxie.com - a.used_session "残余连接数"FROM pg_settings s, ( SELECT COUNT(*) AS used_session FROM pg_stat_activity) aWHERE s.name='max_connections';5、查询数据库参数配置 select name,setting,unit from pg_settings;6、查问以后数据库 select current_database();

June 25, 2021 · 1 min · jiezi

关于vue.js:bufferpool-如何计算大小

The buffer pool is an area in main memory where InnoDB caches table and index data as it is accessed. The buffer pool permits frequently used data to be accessed directly from memory, which speeds up processing. On dedicated servers, up to 80% of physical memory is often assigned to the buffer pool. 缓冲池是内存中的一块次要区域用来缓存InnoDB的表和索引数据。 缓冲池能够将常常应用的数据保留在内存用于间接拜访。在专用数据库服务器中, 高达80%的物理内存能够用来作为缓冲池。 Buffer Pool LRU Algorithm The buffer pool is managed as a list using a variation of the LRU algorithm. When room is needed to add a new page to the buffer pool, the least recently used page is evicted and a new page is added to the middle of the list. This midpoint insertion strategy treats the list as two sublists: ...

June 25, 2021 · 3 min · jiezi

关于vue.js:Vuejs基础内容

Vue.js根底内容,倡议配合官网文档一起查看! 传统网页开发 申请数据->生成构造->监听变动元素变动->发送申请->更新构造毛病DOM 操作频繁,代码繁冗DOM 操作与逻辑代码混合,数据或者构造的批改,可维护性差不同性能区域书写在一起,可维护性低模块之间依赖关系简单前端风行框架Vue.js库是一种工具,在代码中起到辅助作用。框架是JS框架,是听从遵守规则开发的一种形式 本文目标是学习Vue.js规定,Vue.js是渐进式JavaScript框架,官网学习 个性: 数据驱动视图组件化开发数据驱动视图数据变动会自动更新到对应元素中,无需手动操作 DOM,这种行为称作单向数据绑定对于输入框等可输出元素,可设置双向数据绑定 双向数据绑定是在数据绑定根底上,可主动将元素输出内容更新给数据,实现数据与元素内容的双向绑定代码中只进行了数据展现和批改,并未应用 DOM 性能,这就是数据驱动的单项数据绑定(数据->视图) 双向数据绑定实用于非凡元素(可输出元素)例如:input,checkbox,textarea 输出后自动更新到绑定数据上,绑定数据的更改也会自动更新到元素中(双向) Vue数据驱动视图 Vue.js的数据驱动视图是基于MVM模型实现的MVVM(Model -View -ViewModel )是一种软件开发思维 Model层,代表数据View层,代表视图模板ViewModel层,代表业务逻辑解决代码长处 基于MVVM模型实现的数据驱动视图解放了DOM操作View 与Model解决拆散,升高代码耦合度毛病 但双向绑定时的 Bug调试难度增大大型项目的 View 与 Model过多,保护老本高组件化开发组件化开发,分性能组件进行开发的一种形式。容许咱们将网页性能封装为自定义HTML 标签,复用时书写自定义标签名即可 组件不仅能够封装构造,还能够封装款式与逻辑代码,给组件起个名字,名字可作为html标签名进行应用。组件大大提高了开发效率与可维护性 装置本地引入 开发版本:https://cn.vuejs.org/js/vue.js生产版本: https://cn.vuejs.org/js/vue.m...cdn引入比本地引入放到服务器上要快,通过script src属性 最新稳定版: https://cdn.jsdelivr.net/npm/vue指定版本: https://cdn.jsdelivr.net/npm/...npm装置 npm install vuenpm install vue@2.6.12根底语法Vue实例,根底选项,指令,其余选项(过滤器,计算属性,监听器)四局部 Vue实例通过Vue函数创立的对象,是应用Vue性能的根底 var vm = new Vue({ // 选项对象})el选项用于选取一个 DOM元素作为Vue 实例的挂载指标。只有挂载元素外部才会被Vue进行解决,内部为一般HTML元素无奈应用Vue性能。代表MVVM中的View层(视图)。通过 el 挂载, 挂载结束,能够通过 vm.$el进行拜访操作 el,拜访到的是个HTMLElement 两种挂载形式 css选择器格局的字符串HTMLElement 实例 var app = document.querySelector('#app');var vm = new Vue({el:"#app" // 通过css选择器格局的字符串el: app // HTMLElement 实例,留神这里没引号,不能为html或body})未设置 el 的 vue实例,也能够通过 vm.$mount()进行挂载,参数模式与 el 规定雷同 ...

June 25, 2021 · 3 min · jiezi

关于vue.js:Vue中-VanList上拉不加载数据的适配问题

背景: 在安卓设施的钉钉APP中,点击关上撮合列表页面,默认第一个Tab,列表呈现上拉不加载数据问题,但当切换Tab后,列表均能够上拉加载数据。配图: 代码: <van-tabs v-model:active="state.activeTab" @click="onClickTab"> <van-tab v-for="(tab, index) in state.matchStausTabs" :title="tab" :name="index+1" :key="index"> <van-pull-refresh v-model="state.refreshing" @refresh="onRefresh"> <van-list v-model:loading="state.loading" :finished="state.finished" :finished-text="state.finishedText" v-model:error="state.error" error-text="申请失败,点击从新加载" @load="onLoad" > <CarCard v-if="state.list.length > 0" v-else v-for="(item, index) in state.list" :key="index" :carInfo='item' @onJumpDetail="onJumpDetail(item)" > </CarCard> <van-empty v-else description="暂无数据"/> </van-list> </van-pull-refresh> </van-tab> </van-tabs>实践: List 的运行机制(List 会监听浏览器的滚动事件并计算列表的地位,当列表底部与可视区域的间隔小于 offset 时,List 会触发一次 load 事件)猜测: 尝试了很多种办法均失败,偶尔发现van-empty组件的地位无关,原先是写在van-list组件中,对carCard和van-empty进行v-if判断,这样van-list不会从新渲染计算高度和地位;在IOS设施、PC、甚至安卓手机自带的浏览器和微信点开的页面,均无此问题,大胆猜想,安卓钉钉的webview有点太老了,导致计算高度和列表底部与可视区域的间隔不精确,从而无奈触发load 事件,也就无奈上拉加载数据。解决方案: 进入页面,默认为其余Tab(非第一个Tab)时,第一个Tab的列表就没有上述问题了。----然而这种不举荐,与用户交互习惯南辕北辙; van-empty和van-list同级,当有数据时,v-if中的state.list.length > 0为true,van-list会从新渲染,就会从新计算列表高度和地位,完满解决了这个适配问题。---

June 25, 2021 · 1 min · jiezi

关于vue.js:vue中key的作用

vue官网举荐咱们在应用v-for的时候,给对应的元素和属性增加一个key属性。如果未应用key属性,会给咱们报正告,外表上看着没啥影响,但这关系到我的项目性能,所以为了我的项目更高效,咱们不得不应用到key属性。 vue的虚构DOM机制,使得咱们不须要去操作DOM,仅需操作数据就可从新渲染页面;虚构DOM机制的原理根据的是Diff算法。如下图,我想要在B和C之间插入节点F Diff算法的插入机制如下图,即把原来的C更新成F,D更新为C,E更新成D,最初再插入E。在没有指定key的状况下,就是这样“傻瓜式位移”来实现更新 如果咱们给他指定一个惟一标识key之后,他依据这个惟一标识,Diff算法就能正确辨认该节点,找到对应的地位,只须要在对应的地位更新。不再须要“傻瓜式位移”,一个个地去比对。 所以,key的作用次要是为了高效的更新虚构DOM。

June 25, 2021 · 1 min · jiezi

关于vue.js:一个基于vue的图片裁剪和去底色插件

vue-image-handler一个反对图片自定义裁剪和去底色的插件github地址(感激star) 预览成果 装置npm install vue-image-handler# 或者yarn add vue-image-handlervue我的项目中应用// main.js// 全局装置应用import VueImageHandler from 'vue-image-handler'Vue.use(VueImageHandler)// 页面独自引入应用import VueImageHandler from 'vue-image-handler'// ...省略其余代码components: { VueImageHandler }Attributes名称性能默认值类型可选值canvas-width画布的宽度380pxString canvas-height画布的高度252pxString img-file图片资源 Blob/File/String wipe-color要去除的底色 Stringwhite/blackcolor-diff去底色的容差值20Number1-100option其余配置(具体配置参数见下表) Object Option名称性能默认值类型可选值outputQuality解决后的图片品质1Number0.1-1outputType解决后的图片格式pngStringjpeg/png/webpcanMove图片是否能够挪动trueBooleantrue/falsefixedBox固定截图框大小falseBooleantrue/falsecropWidth截图框宽380Number/String380cropHeight截图框高252Number/String252Events(通过this.$refs[your ref name].[method]调用)办法名阐明参数rotate旋转90° download下载解决后的图片 getImageUrl获取解决后的图片Base64 clear清空画布和预览图 refresh刷新画布 疾速上手<template> <VueImageHandler ref="vueImageHandler" :canvas-width="width" :canvas-height="height" :img-file="imgFile" :wipe-color="wipeColor" :color-diff="colorDiff" /></template><script> export default { data() { return { imgFile: 'https://cdn.jsdelivr.net/gh/cong1223/cloudimg@master/img/20210613092202.png', wipeColor: '', colorDiff: 20, width: '380px', height: '252px' }; }, methods: { changeCanvasWidth(e) { // 动静批改画布和预览图的宽度 this.width = e.target.value + 'px'; this.$refs.vueImageHandler.refresh(); }, changeCanvasHeight(e) { // 动静批改画布和预览图的高度 this.height = e.target.value + 'px'; this.$refs.vueImageHandler.refresh(); }, changeWipeColor(e) { // 动静批改要去的底色(white or black) this.wipeColor = e; }, changeColorDiff(e) { // 动静批改去底色的容差值 this.colorDiff = +e.target.value; }, pickImage() { // 从本地抉择图片(input file) this.$refs.filElem.dispatchEvent(new MouseEvent('click')); }, handleRotate() { // 原图旋转 this.$refs.vueImageHandler.rotate(); }, getFile() { // 从本地抉择图片后获取文件信息 const inputFile = this.$refs.filElem.files[0]; if (inputFile) { this.imgFile = inputFile; this.$refs.filElem.value = ''; } else { return; } }, download() { // 下载图片 this.$refs.vueImageHandler.download(); }, getUrl() { this.$refs.vueImageHandler.getImageUrl(url => { console.log('解决后的图片', url); }); }, clear() { // 清空画布 this.$refs.vueImageHandler.clear(); } } }</script>更新日志1.2.8反对页面内独自援用:`import VueImageHandler from 'vue-image-handler'`行将更新1. download和getImageUrl反对自定义图片格式输入

June 25, 2021 · 1 min · jiezi

关于vue.js:vue-echarts-组件

<template> <div style="margin-bottom: 0.5rem"> <div v-if="chartData && chartData.length > 0" style="height: 1.98rem" :id="chartId" v-on-echart-resize ></div> <div style="height: 1.98rem" v-if="!chartData || !(chartData.length > 0)" class="temp-data" > <img src="../assets/img/kong1.png" alt="" /> <div>暂无此维度数据</div> </div> </div></template><script>const sortNum = new Date().getTime();export default { props: { name: "", chartData: { type: Array, }, xData: { type: Array, }, }, data() { return { myChart: null, colorList: ["#3DFFCA", "#0EB5FF", "#FBBF00", "#FF6926", "#707070"], }; }, computed: { chartId: function () { return this.name + new Date().getTime(); }, }, /** * 深度监听 图表生成之后 传定时刷新数据进来 因为数据不能动静传值,所以子组件应用深度监听来监控数据变动 */ watch: { chartData: { deep: true, handler(newVal, oldVal) { if (this.myChart) { this.myChart.dispose(); //数据变换 先销毁 this.drawLine(); } else { this.drawLine(); } }, }, }, mounted() { this.drawLine(); }, beforeDestroy() { if (this.myChart) { this.myChart.dispose(); this.myChart = null; } }, methods: { drawLine() { let _this = this; let dataZoomLength = 100; if (!this.xData.length || this.xData.length > 8) { dataZoomLength = 10; } //构建数据 let serOpt = []; for (let i = 0; i < this.chartData.length; i++) { let target = this.chartData[i]; let item = { name: target.name, type: target.type, data: target.data, itemStyle: { normal: { color: this.colorList[i], barBorderRadius: [2, 2, 2, 2], label: { show: false, //开启显示 position: "top", //在上方显示 textStyle: { //数值款式 color: "#FBBF00", fontSize: 8, }, }, }, }, showBackground: true, barWidth: 13, backgroundStyle: { color: "rgba(0,0,0,0.3)", }, }; serOpt.push(item); } //构建图表 let option = { tooltip: { // 鼠标是否能够进入悬浮框 // 触发形式 mousemove, click, none, mousemove|click triggerOn: `mousemove|click`, trigger: "axis", axisPointer: { // 坐标轴指示器,坐标轴触发无效 type: "shadow", // 默认为直线,可选为:'line' | 'shadow' }, position: function (point, params, dom, rect, size) { // 鼠标坐标和提示框地位的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下 // 提示框地位 var x = 0; // x坐标地位 var y = 0; // y坐标地位 // 以后鼠标地位 var pointX = point[0]; var pointY = point[1]; // 外层div大小 // var viewWidth = size.viewSize[0]; // var viewHeight = size.viewSize[1]; // 提示框大小 var boxWidth = size.contentSize[0] / 3; var boxHeight = size.contentSize[1] / 3; // boxWidth > pointX 阐明鼠标右边放不下提示框 if (boxWidth > pointX) { x = 5; } else { // 右边放的下 x = pointX - boxWidth; } // boxHeight > pointY 阐明鼠标上边放不下提示框 if (boxHeight > pointY) { y = 5; } else { // 上边放得下 y = pointY - boxHeight; } return [x, y]; }, }, legend: { // data: ["目标值", "理论值"], top: "-1%", left: "5%", itemWidth: 6, itemHeight: 6, textStyle: { color: "#78D4CE", //更改坐标轴文字色彩 fontSize: 10, //更改坐标轴文字大小 }, }, grid: { left: "3%", top: "20%", right: "5%", bottom: "0%", containLabel: true, }, xAxis: { type: "category", data: this.xData, axisLine: { lineStyle: { color: "#0E635E", //更改坐标轴色彩 #0E635E #052626 }, }, axisLabel: { interval: 0, rotate: 30, //歪斜 textStyle: { color: "#78D4CE", //更改坐标轴文字色彩 fontSize: 10, //更改坐标轴文字大小 }, }, }, dataZoom: [ { type: "inside", //图表下方的伸缩条 show: true, //是否显示 realtime: true, //拖动时,是否实时更新系列的视图 start: 0, //伸缩条开始地位(1-100),能够随时更改 end: dataZoomLength, //伸缩条完结地位(1-100),能够随时更改 }, ], yAxis: [ { // name: "", type: "value", // min: 0, // max: 0.14, nameGap: 35, splitNumber: 4, splitLine: { show: true, lineStyle: { type: "dotted", color: "#0E635E", }, }, axisLine: { lineStyle: { color: "rgba(6, 50, 49, 0.5)", //更改坐标轴色彩#052626 }, }, axisLabel: { textStyle: { color: "#78D4CE", //更改坐标轴文字色彩 fontSize: 10, //更改坐标轴文字大小 }, }, }, ], series: serOpt, }; // 基于筹备好的dom,初始化echarts实例 if (this.chartId && document.getElementById(this.chartId)) { //动静存在 找不到问题。临时应用判断 this.myChart = this.$echarts.init( document.getElementById(this.chartId) ); // 绘制图表 this.myChart.setOption(option); } window.addEventListener("resize", function () { if (_this.myChart && _this.myChart.resize()) { _this.myChart.resize(); } }); }, },};</script><style></style>

June 24, 2021 · 3 min · jiezi

关于vue.js:Element-ui在table组件中使用slot来自定义表头数据无法刷新

如题,这样应用data扭转无奈响应刷新 <template slot="header"> {{data}}</template>须要改成上面这样 <template #header> {{data}}</template>起因不分明。。。

June 24, 2021 · 1 min · jiezi

关于vue.js:Python如何生成器函数

对于程序而言,内存也是很重要的,因为程序中很多数据都是保留在内存中的,如果内存中存储的数据过多,那么零碎就会解体,这是人们不心愿产生的。 能够采纳生成器推导式来解决内存不足的问题。例如,利用生成器推导式创立一个生成器n,数据为1~33数字,能够写成n = (i for i in range(1, 34))。这样当程序须要一个数时,程序才生成数据,能够节俭内存。然而生成器推导式太过简略,只能用一行代码的模式实现,如果要创立简单的生成器,如创立一个生成器f,生成前10个斐波那契数字,生成器推导式曾经不能满足需要了,因为斐波那契数列最开始的两个数都无奈赋值。 函数能够实现简单的性能,然而要节俭内存,就须要应用生成器函数。生成器函数与一般函数的区别是函数中蕴含关键字yield。实际上只有含有yield关键字的函数就是生成器函数。 生成器函数是用函数实现生成器。定义生成器函数的语法格局如下: e786362d0c20491a0200471d493783a0.png def 函数名(参数): 函数体 yield 变量名 函数体 由语法格局可知,生成器函数与一般函数的区别在于页游函数体局部,生成器函数的函数体含有“yield 变量名”语句。yield的性能相似于return,return是函数返回值,yield的性能也是返回变量,然而它仅返回变量而不退出函数,因而,yield能够看作是屡次返回变量且不会退出函数的return。 在调用生成器函数时,写上函数名与参数,并通过一个变量接管返回值,语法格局如下: 变量名 = 函数名(参数) 调用生成器函数的yield生成值的第一种办法如下: next(变量名) 第二种办法如下: 变量名.__next__() 在把握了生成器函数的定义和调用之后,就能够应用生成器函数实现生成前10个斐波那契数字的案例了。这个案例次要分为三步,第一步是定义生成器函数,第二步是调用并赋值,第三步是打印后果,代码如下: 在上述程序中,首先定义生成器函数fib(),函数内先定义斐波那契数列的两个初始值,再写一个www.sangpi.comwhile True死循环。这个死循环有些特地,先是用yield生成待应用的数字,再通过赋值语句“a, b = b, a+b”将b的值赋给a,将a+b的值赋给b,每次循环都是如此。 而后调用生成器函数fib(),再调用生成器函数的yield生成值,最初打印后果。因为须要生成前10个斐波那契数字,因而能够采纳for循环,每循环一次生成并打印一个斐波那契数字,共循环10次。 第一次循环时,调用yield生成值a,即1;第二次循环时,调用yield生成值a,a被赋值成b的值,即1,而b被赋值成a+b的值,即2;第三次循环时,调用yield生成值a,a被赋值成b的值,而此时b的值是上次赋值的a+b的值,即2……以此类推,就失去了整个斐波那契数列。

June 24, 2021 · 1 min · jiezi

关于vue.js:如何平衡兴趣与收入-听尤雨溪访谈有感

README是一款Github推出的访谈节目,每期会采访一位开源大佬,开掘开源我的项目背地的故事。 采访尤雨溪的这期题目是如何从一个想法倒退成整个JS社区生态。 次要讲述了尤雨溪的成长历程,Vue的诞生过程以及倒退。 这次访谈最让我印象粗浅的是:尤雨溪在人生的几个要害节点上是如何做出抉择的。 一句话总结:尤从求学到工作的每个要害节点,都是均衡趣味与收益后的利益最大化抉择。 如果你正面临抉择或身处迷茫,这篇文章或者能够为你提供一些乏味的视角。 大佬也是被爸“逼”的尤高中毕业就赴美求学,本科就读于Colgate University,毕业时取得艺术史学位。 曾几何时,他也想将艺术作为职业方向。然而父亲指出了一个很事实的问题: 作为外国人,在艺术畛域你很难找到提供工作签证的工作就这个问题他与父亲产生了强烈的争吵,但最终不得不抵赖父亲是对的。 于是,硕士阶段,尤抉择了Parsons的MFA(联合设计与软件开发的业余),并在就读期间自学了JS。 这是其联合趣味与收益做出的第一个重要抉择,实现了从冷门的艺术业余向软件畛域的聚拢。 错位竞争作为一个本科、硕士都是艺术相干业余,会编程的学生。在面临毕业时,如何能力找到好工作? 换做是你,会怎么做?思考十秒。 如果你能想到的,只是刷面经,投简历。那么以下内容值得你好好思考一下。 过后市面上正风行一款以晦涩交互体验著称的TODO list APP —— clear。 他的丝滑交互体验,使其在短时间内播种大量关注。 尤在看到这款App时首先想到:我能不能将这种交互体验迁徙到Web上? 在钻研了几天touch事件、CSS transform后,他胜利了。 留神接下来他做的事: 我制作了一个视频并公布到网上,大家为Web也能实现如此晦涩的体验感到兴奋。最终,我的作品登上了Hacker News头条不论是应届生还是退职求职,很多低学历或非本业余的敌人都在埋怨:大公司学历歧视、业余歧视。 然而,站在公司的视角,每天这么多人投简历,如何辨别能力强弱? 显然学历、业余、工作年限是最简略粗犷的筛选形式。 但如果你能以某种形式证实本人的能力,并广而告之,那么在求职时就能跳出简略粗犷的筛选形式。 这也是为什么很多人升职、求职、守业前会写书的起因。 君不见,玖五(阿里最年老的前端技术专家)只有中专学历,但他的另一个身份是《深入浅出Vue.js》作者。 摸索趣味导向的人生说回主题,凭借错位竞争,尤胜利取得大公司关注,并在毕业后入职Google Creative Lab。 在这一时期,尤的工作次要是做各种试验性web我的项目原型的摸索。 随着在大公司的新鲜感减退,尤逐步发现这份工作的局限性:只做我的项目原型,就无奈参加我的项目的生产落地。 不面向终端用户的产品,始终是海市蜃楼。 于是,尤决定独立开发一个我的项目。 这个我的项目的契机是:为了疾速开发原型,须要提效的框架工具。 彼时Angular1曾经公布,但对他这样的非计算机背景的开发者来说Angular1太重了。 于是,一款以简略好用为指标的视图层框架被构思进去。几经辗转,最终命名为Vue。 从艺术到计算机的跨度,再到入职Google Creative Lab。趣味导向加上错位竞争的理念为尤一直带来正反馈。 很天然的,尤开始思考:我可不可以全职从事Vue的开发? 理想主义实干者 很多人都有不下班,全职做本人感兴趣的事的美好愿望。 尤与他们不同的是,尤认真评估了可行性后,做出了理论的致力。 摆在面前的艰难起码有三条: 是否适应全职做开源的生活节奏全职开源是否养活本人如果失败了是否重回大公司让咱们看看尤是如何步步布局,最终解决这三个问题的。 是否适应全职做开源的生活节奏从谷歌到职后,尤没有立即全职开发Vue,而是退出一家守业公司Meteor全职近程工作。 做近程工作不仅能提前适应全职搞开源的节奏(在家办公),也能为Vue在社区的发酵提供缓冲期。 正是在这一期间,Vue被Taylor Otwell(Laravel作者)所知,并推广到Laravel社区。 全职开源是否养活本人支出是最事实的问题。 当通过Vue的开发积攒了名气与社区生态后,尤尝试通过Patreon为本人募资。 Patreon是一家为艺术家和创作者募资的公司,其实践根底来源于Kevin Kelly的1000粉丝实践: 从事创作和艺术工作的人,如作家、摄影师只有能取得1000忠诚粉丝就能维持生存。这1000位粉丝是那种认可你价值观,被你的内容吸引,违心为你做口碑流传和常识付费的,你要做的就是找到、保护好他们 与此同时,尤还从一个敌人公司的开源基金会取得捐献。 ...

June 24, 2021 · 1 min · jiezi

关于vue.js:vue-实现简单版本-todolist

昨天下午在记事本的性能上做了优化,做成了简略的 todolist,次要是来坚固一下vue的各种指令以下是效果图 以上是简略版本的效果图,好啦,献上我的代码~欢送大家踊跃提出倡议 <!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>todolist</title> <link rel="stylesheet" href="style/index.css" /> </head> <body> <!-- 主体区域 --> <section id="todolist"> <!-- 头部区域 --> <header class="header"> <h1>todolist</h1> <input type="text" autofocus autocomplete="off" placeholder="请输出工作" class="new_todo" v-model="message" @keyup.enter="add" /> </header> <!-- 列表区域 --> <section class="main" v-show="isShow"> <div id="head"> <h5>待办事项</h5> <span>{{ arr.length }}</span> </div> <ul> <li v-for="(item,index) in arr" :key="item.name" @mouseover="mouseOver(index,1)" @mouseleave="mouseLeave(index,1)"> <input type="checkbox" @click="complateList(index)" v-model="item.checked">{{ item.name }} <span v-show="isChecked == index + 1 ? isIconShow : false" @click="remove(index,1)"><svg t="1624355982144" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1214" width="30" height="30"><path d="M512 1255.489906" p-id="1215" fill="#cdcdcd"></path><path d="M718.519288 688.227064 543.827304 513.637418l174.180292-174.180292c8.801119-8.801119 8.801119-23.128523 0-31.827304-8.801119-8.801119-23.128523-8.801119-31.827304 0L512 481.810114 337.819708 307.629822c-8.801119-8.801119-23.230861-8.596442-31.929642 0.102339l0.102339-0.102339c-8.801119 8.801119-8.698781 23.026184 0.102339 31.827304l174.180292 174.180292L305.58305 688.227064c-8.801119 8.801119-8.801119 23.128523 0 31.827304 8.801119 8.801119 23.128523 8.801119 31.827304 0L512 545.464721 686.691985 720.054367c8.801119 8.801119 22.923846 8.903458 31.724965 0.102339l0.102339-0.102339C727.218069 711.355587 727.218069 697.028183 718.519288 688.227064z" p-id="1216" fill="#cdcdcd"></path></svg></span> </li> </ul> <div id="head"> <h5>已实现</h5> <span>{{ complate.length }}</span> </div> <ul> <li v-for="(item,index) in complate" :key="index" @mouseover="mouseOver(index,2)" @mouseleave="mouseLeave(index,2)"> <input type="checkbox" checked disabled @click="complateList(index)">{{item.name}} <span v-show="isComplateChecked == index + 1 ? isComplateIconShow : false" @click="remove(index,2)"><svg t="1624355982144" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1214" width="30" height="30"><path d="M512 1255.489906" p-id="1215" fill="#cdcdcd"></path><path d="M718.519288 688.227064 543.827304 513.637418l174.180292-174.180292c8.801119-8.801119 8.801119-23.128523 0-31.827304-8.801119-8.801119-23.128523-8.801119-31.827304 0L512 481.810114 337.819708 307.629822c-8.801119-8.801119-23.230861-8.596442-31.929642 0.102339l0.102339-0.102339c-8.801119 8.801119-8.698781 23.026184 0.102339 31.827304l174.180292 174.180292L305.58305 688.227064c-8.801119 8.801119-8.801119 23.128523 0 31.827304 8.801119 8.801119 23.128523 8.801119 31.827304 0L512 545.464721 686.691985 720.054367c8.801119 8.801119 22.923846 8.903458 31.724965 0.102339l0.102339-0.102339C727.218069 711.355587 727.218069 697.028183 718.519288 688.227064z" p-id="1216" fill="#cdcdcd"></path></svg></span> </li> </ul> </section> <!-- 统计和清空区域 --> <footer class="footer"> <a href="#" @click="clear" class="clear">clear</a> </footer> </section> </body> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> var todolist = new Vue({ el: '#todolist', data: { // 待办列表 arr: [], // 已实现列表 complate:[], // 数组下标 index: 0, message:'', // 列表显示暗藏 isShow:false, // 待办是否显示icon isIconShow:false, // 待办选中行的索引 isChecked:0, // 已实现选中行的索引 isComplateChecked:0, // 已实现是否显示icon isComplateIconShow:false, }, methods:{ add(){ if (this.message !== '') { // 获取用户输出信息 并 增加到数组中 this.arr.push({name:this.message,checked:false}) // 显示列表 this.isShow = true // 清空输入框 this.message = '' }else{ alert('请输出内容') } }, // 革除所有 clear(){ this.arr.length = 0 this.complate.length = 0 // 暗藏列表 this.isShow = false }, // 鼠标移入 mouseOver(index,flag){ if (flag == 1) { this.isChecked = index + 1 this.isIconShow = true }else{ this.isComplateChecked = index + 1 this.isComplateIconShow = true } }, // 鼠标移出 mouseLeave(index,flag){ if (flag == 1) { this.isChecked = index + 1 this.isIconShow = false }else{ this.isComplateChecked = index + 1 this.isComplateIconShow = false } }, // 删除数组数据 remove(index,flag){ if (flag == 1) { this.arr.splice(index,1) }else{ this.complate.splice(index,1) } }, // 实现待办 complateList(index){ // 增加到已实现数组中 this.complate.push(this.arr[index]) // 删除以后数组内容 this.arr.splice(index,1) // 革除已实现数组中的勾选框 } } }) </script></html>一开始有个小bug , 如果勾选了待办中的第三条数据,数据从待办删除了,然而最初一条的勾选框还在。因为这里复用了组件,保留了之前的状态。要解决这个问题,能够为列表项带上id作为惟一key,那么每次渲染列表时都会齐全替换所有组件,使其领有正确状态。然而我这里没有id,所以我临时用的name做为惟一的key大家理论开发中尽量用id 做为 惟一的 key ...

June 24, 2021 · 2 min · jiezi

关于vue.js:vue-后端返回路由-添加动态路由

参考链接:https://blog.csdn.net/qq_3190... 思路:路由表不在前端进行比对,后盾对用户的权限进行比对,返回给前端一个比对好的路由表,且返回的路由表 { path: '/people', name: 'people', meta: { title: '人口治理', requireAuth: true }, component: () => import('@/views/main/Main'), children: [{ path: '/people-list', name: 'people-list', meta: { icon: 'el-icon-user-solid', title: '人口治理', requireAuth: true }, component: () => import('@/views/people/list') }, { path: '/people-detail', name: 'people-detail', meta: { requireAuth: true, notCache: true, hideInMenu: true, title: route => `人口详情-${route.query.xm}` }, component: () => import('@/views/people/detail') }] }function filterRouter (routes) { const router = routes.map(route => { if (route.component === 'main') { route.component = _import('/main/Main') } else { route.component = _import(route.component) } if (route.meta.routeTitle) { route.meta.title = _title(route.meta.title, route.meta.routeTitle) } if (route.children && route.children.length > 0) { route.children = filterRouter(route.children) } return route }) return router}这个函数的次要作用就是把后盾传过来的字符串型的component转化为真正的组件其中_import()函数的定义如下: ...

June 24, 2021 · 1 min · jiezi

关于vue.js:如何在RestTemplate-结合-Ribbon-使用

一、应用 RestTemplate 与整合 RibbonSpring提供了一种简略便捷的模板类来进行API的调用,那就是 RestTemplate。 应用 RestTemplate首先咱们看看GET申请的应用形式:在 fsh-house 服务的 HouseController 中减少两个接口,一个通过 @RequestParam来传递参数,返回一个对象信息;另一个通过 @PathVarable来传递参数,返回一个字符串。尽量通过两个接口组装不同的模式,具体如上面代码所示。@GetMapping("/data")public HouseInfo getData( @RequestParam("name") String name) { return new HouseInfo(1L, "上海","虹口","东体小区");}@GetMapping("/data/{name}")public String getData2(@PathVariable( "name") String name) { return name;}在 fsh-substitution 服务中用 RestTemplate来调用咱们刚刚定义的两个接口,具体如上面代码所示。 @GetMapping("/data")public HouseInfo getData(@RequestParam("name") String name) { return restTemplate.getForobject( ");} @GetMapping("/data/{name}")public String getData2(@PathVariable("name") String name) { return restTemplate.getForobject( "{name}",String.class,name);}获取数据后果通过 RestTemplate的 getForObject 办法(具体如上面代码所示)来实现,此办法有三个重载的实现: url:申请的 API 地址,有两种形式,其中一种是字符串,另一种是 URL 模式。responseType :返回值的类型。uriVariables : PathVariable 参数,有两种形式, 其中一种是可变参数,另一种是 Map 模式。public <T> T getForobject(String url, Class<T> responseType, ...

June 23, 2021 · 4 min · jiezi

关于vue.js:vue-简单指令使用实现记事本案例

最近公司我的项目不忙,我终于有工夫持续学习vue了,早上看了下官网文档,次要看了下指令,感觉还能够,就上手做了一个小案例,记事本性能。该案列包含以下性能: 输出工作按回车键,列表就会新增一条数据输出完工作按回车后输入框将被清空底部有总记录数和革除所有数据鼠标悬浮列表上显示删除按钮能够删除数据一、实现思路 1、通过输入框的 @keyup.enter 指令 绑定 增加办法,增加方 法中将输出的内容存到数组中保留 2、通过 v-for 指令 循环遍历数组元素并在 ul li 中动态显示进去 3、通过 v-shoow 指令与鼠标移入移出办法(@mouseover、@mouseleave) 管制删除按钮的显示与暗藏 二、实现代码 <!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>todolist</title> <link rel="stylesheet" href="style/index.css" /> </head> <body> <!-- 主体区域 --> <section id="todolist"> <!-- 头部区域 --> <header class="header"> <h1>记事本</h1> <input type="text" autofocus autocomplete="off" placeholder="请输出工作" class="new_todo" v-model="message" @keyup.enter="add" /> </header> <!-- 列表区域 --> <section class="main" v-show="isShow"> <ul> <li v-for="(item,index) in arr" @mouseover="mouseOver(index)" @mouseleave="mouseLeave(index)"> {{ index + 1 + '. '}} {{ item}} <span v-show="isChecked == index + 1 ? isIconShow : false" @click="remove"><svg t="1624355982144" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1214" width="30" height="30"><path d="M512 1255.489906" p-id="1215" fill="#cdcdcd"></path><path d="M718.519288 688.227064 543.827304 513.637418l174.180292-174.180292c8.801119-8.801119 8.801119-23.128523 0-31.827304-8.801119-8.801119-23.128523-8.801119-31.827304 0L512 481.810114 337.819708 307.629822c-8.801119-8.801119-23.230861-8.596442-31.929642 0.102339l0.102339-0.102339c-8.801119 8.801119-8.698781 23.026184 0.102339 31.827304l174.180292 174.180292L305.58305 688.227064c-8.801119 8.801119-8.801119 23.128523 0 31.827304 8.801119 8.801119 23.128523 8.801119 31.827304 0L512 545.464721 686.691985 720.054367c8.801119 8.801119 22.923846 8.903458 31.724965 0.102339l0.102339-0.102339C727.218069 711.355587 727.218069 697.028183 718.519288 688.227064z" p-id="1216" fill="#cdcdcd"></path></svg></span> </li> </ul> </section> <!-- 统计和清空区域 --> <footer class="footer"> <span>{{ arr.length }} num</span> <a href="#" @click="clear" class="clear">clear</a> </footer> </section> </body> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> var todolist = new Vue({ el: '#todolist', data: { arr: [], index: 0, message:'', isShow:false, isIconShow:false, isChecked:0 }, methods:{ add(){ // 获取用户输出信息 并 增加到数组中 this.arr.push(this.message) // 显示列表 this.isShow = true // 清空输入框 this.message = '' }, // 革除所有 clear(){ this.arr.length = 0 // 暗藏列表 this.isShow = false }, // 鼠标移入 mouseOver(index){ this.isChecked = index + 1 this.isIconShow = true }, // 鼠标移出 mouseLeave(index){ this.isChecked = index + 1 this.isIconShow = false }, // 删除数组数据 remove(index){ this.arr.splice(index,1) } } }) </script></html> ...

June 23, 2021 · 2 min · jiezi

关于vue.js:OS和-time模块介绍

import os import shutil #os.rename('text_备份2.txt','text_重命名.txt')#重命名文件 #os.remove('文件名')#删除文件,如果不存在就会报错 #os.mkdir('textCJ')#创立文件夹 #os.rmdir('textCJ')#删除文件夹,只能删除空目录 #os.mkdir('d:/python编程')#在D盘下创立文件夹,还能够一级级创立/,不能间断创立 #os.rmdir('d:/python编程') #os.makedirs('d:/p/d/f')#多级文件创建 #shutil.rmtree('d:p/d/f')#删除非空目录文件shutil print('以后门路:',os.getcwd())#获取当前目录 #print(os.path) #os.path.join(os.path.join(os.getcwd(),'第十一天'))#门路拼接 #获取python中的目录列表,老版本 #print(os.listdir('d:/')) print(''15) #新版本 with os.scandir('D:/test/') as f:#scandir和with一起应用,上下文管理器会在迭代器遍历实现后主动开释资源 for item in f: print(item.name) print(''15) f='D:/test/' for item in os.listdir(f): if os.path.isfile(os.path.join(f,item)):#判断文件,.isdir是判断页游目录 print('只输入文件:',item) 2. 基本操作命令 办法解释 os.getcwd()获取当前工作目录,即以后python脚本工作的目录门路 os.chdir(“dirname”)扭转以后脚本工作目录;相当于shell下cd ...

June 22, 2021 · 1 min · jiezi

关于vue.js:Electron之Main有什么关系

Electron使用指南之Main Process API,Electron API (Electron API 有三种) Main Process (主进过程) Renderer Process(渲染过程) Share Modules(共享模块) App 事件 ready: 当 Electron 实现初始化时被触发。 两种应用办法 app.on('ready', createWindow) app.on('ready', () => { console.log('App is ready!') createWindow() }) 查看利用是否登录:app.isReady() 如果利用没有Ready,app.isReady()的值为 false console.log('利用是否登录:' + app.isReady()) 此时利用应该曾经Ready setTimeout(() => { console.log('利用是否登录:' + app.isReady()) }, 2000) before-quit 在应用程序开始敞开窗口之前触发。 app.on('before-quit', (e) => { console.log('App is quiting') e.preventDefault() }) browser-window-blur 在 browserWindow 失去焦点时收回 app.on('browser-window-blur', (e) => { console.log('App unfocused') }) browser-window-focus 在 browserWindow 取得焦点时收回 ...

June 22, 2021 · 7 min · jiezi

关于vue.js:如何从CDN加载jQuery

上面是从所有3个CDN加载jQuery的代码。 从Google CDN加载jQuery Framework的代码 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> </script> 从Microsoft CDN加载jQuery Framework的手游代码 <script type="text/javascript" src="http://ajax.microsoft.comwww.sangpi.com/ajax/jquery/jquery-1.9.1.min.js"> </script> 从jQuery站点加载jQuery Framework的代码(EdgeCast CDN)

June 21, 2021 · 1 min · jiezi

关于vue.js:VueMixin

vue mixin --- 混入记录文档1. 什么是mixin混入混入 (mixins):是一种散发 Vue 组件中可复用性能的非常灵活的形式。混入对象能够蕴含任意组件选项。当组件应用混入对象时,所有混入对象的选项将被混入该组件自身的选项。2. 什么时候须要应用mixin页面的格调不必,然而执行的办法和须要的数据相似,这时候能够思考将雷同局部封装3. mixin的特点办法和参数在各组件中不共享,a页面扭转了变量值然而b页面取值仍是原来的值。methods,components等为对象局部,当混入对象和页面存在雷同的办法名的状况将执行页面内的局部。created,mounted值为函数的局部,当混入对象和页面存在雷同的办法名的状况会先执行混入对象的再执行本页面的办法。4.怎么应用在mixin.js中编写一个混入对象, 示例: export default { data () { return { show: false } }, methods: { toggleShow () { this.show = !this.show } }}在页面中即可引入混入对象,这时页面内无需从新定义toggleShow办法和数据show即可间接应用, 示例: <template> <div @click="toggleShow"> 这是测试按钮 </div></template><script>import mixin from './mixin/mixin'export default { name: 'pageA', mixins: [mixin], created () { this.toggleShow() }}</script>

June 19, 2021 · 1 min · jiezi

关于vue.js:git-Bash-解决无法上下选择问题vuecli中找到bashrc文件位置

办法一:在应用vue-cli3初始化vue我的项目时,遇到的高低箭头无奈挪动的状况本来的初始化命令是 vue create my-project只须要 winpty vue.cmd create my-project 即可办法二: git Bash  解决高低抉择官网说要在.bashrc文件中退出alias vue='winpty vue.cmd'看到如下快捷命令能够关上这个文件 cd ~touch .bashrcnotepad .bashrc然而我试了试不行,没方法,因为太菜,我总是遇到他人遇不到的问题只能搜笨办法了,最终搜到了上面的办法解决了问题:@vue/cli 版本3.x以上的   要找到.bashrc文件  官网说在  ~/.bashrc(在根目录上面的用户目录下),但我的没有其实文件地位不肯定在官网提醒文件地位下,  .bashrc文件地位是装置git Bash(包管理器)产生的, 所以要找到.bashrc文件地位要害要找到你的git Bash装置地位。我装置git Bash在E盘参考文章:https://blog.csdn.net/qq_3866...

June 19, 2021 · 1 min · jiezi

关于vue.js:创建Vue项目遇到报错

因为电脑以前装过Vue-cli,再次创立我的项目的时候报错了(首先说下报错起因,是vue和vue-template-compiler版本不统一造成的)如下所示: $ vue create test1D:\nodejs\node_global\node_modules\@vue\cli\node_modules\vue-template-compiler\index.js:10 throw new Error( ^Error:Vue packages version mismatch:- vue@2.6.10 (D:\nodejs\node_global\node_modules\vue\dist\vue.runtime.common.js)- vue-template-compiler@2.6.14 (D:\nodejs\node_global\node_modules\@vue\cli\node_modules\vue-template-compiler\package.json)This may cause things to work incorrectly. Make sure to use the same version for both.If you are using vue-loader@>=10.0, simply update vue-template-compiler.If you are using vue-loader@<10.0 or vueify, re-installing vue-loader/vueify should bump vue-template-compiler to the latest. at Object.<anonymous> (D:\nodejs\node_global\node_modules\@vue\cli\node_modules\vue-template-compiler\index.js:10:9) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (D:\nodejs\node_global\node_modules\@vue\cli\node_modules\vue-jscodeshift-adapter\src\parse-sfc.js:1:18) at Module._compile (internal/modules/cjs/loader.js:778:30)网上查到了第一个办法,对我的问题没起作用,预计是问题略微不一样吧,也列出来吧,毕竟他人也是解决问题了,万一有同学能够用这个办法解决呢,是吧 ...

June 19, 2021 · 1 min · jiezi

关于vue.js:W4111-Introduction-to-Databases

W4111 -- Introduction to DatabasesHomework 3Spring 2019, Sections 03, V03, H03IntroductionThis is the specification of for homework 3 for W4111 - Introduction to Databases, section 03,H03, V03 for spring semester 2019. This document is always the current version of thespecification. Developers are responsible for continuously reviewing the document for changes.Document ControlRolesAuthor UNI RoleFerguson, Donald, F. dff9 InstructorApprover UNI RoleFerguson, Donald, F. dff9 InstructorReviewer UNI RoleDalchand, Samantha sd2995 Assistant InstructorDhillon, Kirit ksd2142 Assistant InstructorGandikota, Chandana cg3111 Assistant InstructorGorrela, Meghna mg3740 Assistant InstructorHuang, Rose rh2805 Assistant InstructorHudson, Alysha alh2202 Assistant InstructorKarasev, Mikhail mak2257 Assistant InstructorPeterson, Ara alp2210 Assistant InstructorSaosun, Tahsina ts2931 Assistant InstructorSwaroop, Vatsala vs2671 Assistant InstructorTan, Xinyue xt2215 Assistant InstructorChange LogChange No. Date DocumentVersionChangesChange ProcessStudents should post clarification requests on this Piazza thread. The current version of thisdocument and the change log will note changes/clarifications. There will not be any other sourcedocumenting changes or clarifications.OverviewThis project has two parts: ...

June 19, 2021 · 4 min · jiezi

关于vue.js:vue中使用setInterval循环定时器的注意事项

问题形容在咱们做我的项目中,常常须要应用定时器做一些反复的工作,比方接口轮询更新数据等。本篇文章记录一下vue我的项目中应用定时器的一些注意事项。 注意事项应用定时器的时候,次要是要留神应用定时器的以下状况 什么时候开始setInterval()定时器 页面一进来就应用定时器或者以事件的模式比方点击按钮开始应用定时器什么时候完结setInterval()定时器 页面来到时候革除定时器或者以事件的模式比方点击按钮模式革除定时器特地的须要留神,是否在被缓存组件中应用定时器 即是否在被keep-alive包裹的组件中应用定时器状况一,一般状况下应用定时器假如咱们有两个按钮,点击一个开始定时器,点击另外一个完结定时器。代码如下: <template> <div> <el-button type="primary" plain @click="start">点击开始定时器</el-button> <el-button type="primary" plain @click="end">点击完结定时器</el-button> </div></template><script>export default { data() { return { timer: null,// 初始定时器变量名为null }; }, methods: { start() { // 将定时器名字赋值到变量中 this.timer = setInterval(() => { console.log("开始---"); }, 1000); }, end() { clearInterval(this.timer); this.timer = null // 这里最好革除一下,回归默认值 // 家喻户晓,定时器返回一个随机整数,用于示意定时器的编号,前面通过名字能够勾销这个定时器的执行。 console.log(this.timer); }, }, // 在来到这个页面的时候,(比方路由跳转到别的页面)必须要革除一下这个定时器,定时器不手动革除的话,会始终存在并执行 // 直到咱们的我的项目服务停掉,或者关机。所以适当时候革除定时器是十分有必要的。不然消耗性能,且容易造成代码凌乱 beforeDestroy() { // js提供的clearInterval办法用来革除定时器 clearInterval(this.timer); }, // beforeDestroy或destroyed钩子中都能去革除这个定时器 // destroyed() { // // clearInterval(this.timer); // },};</script>如果是页面一进来就要执行定时器,能够在mounted钩子中写个定时器让其执行,能够手动按钮点击革除,然而来到页面的时候肯定要革除定时器,因为用户可能忘了点击革除定时器的按钮了状况二,keep-alive中应用定时器如果应用了keep-alive包裹组件后,组件的生命周期就是如下了: ...

June 19, 2021 · 1 min · jiezi