关于vue.js:httplxgongxuanwangcomlxzxlxksgghtml

这两个办法都是承受一个参数, 是一个 正则表达式字符串,或者RegExp 对象。 所不同的是, match() 返回被匹配的项, 如果是/g 匹配模式,则返回一组蕴含所有匹配项的数组,否则,返回第一个匹配的到的子串, 其返回辞退后果和exec() 的执行后果雷同。 而search() 的返回后果则是首个匹配项的索引值,如果没有匹配项则返回-1。http://lx.gongxuanwang.com/lx...法接管两个参数,第一个参数能够是一个RegExp对象,或者一个字符串(这个字符串不会转换为正则表达式),第二个参数能够是一个字符串或者一个函数。浙江遴选:http://lx.gongxuanwang.com/ss...福建遴选:http://lx.gongxuanwang.com/ss... 也就是,repalce() 办法能够单纯的用于替换字符串中的子串,也能够用以替换匹配模式匹配的指标子串。

November 27, 2021 · 1 min · jiezi

关于vue.js:setup-函数内部该如何通讯

和传统的 Options API 不同,Composition API 提供了全新的编码方式 ,遴选公务员能够让咱们更好地去组织和复用代码逻辑。过来 Taro 只提供了 Options API 版本的小程序生命周期钩子,开发者往往对于这些钩子和 setup 函数外部该如何通信、如何共享数据等问题感到困惑,更是不能很好地兼容 script setup 语法。http://lx.gongxuanwang.com/ht... 因而 Taro v3.4 提供了 Composition API 版本的小程序生命周期钩子,让开发者更不便地应用 setup 语法,例子:鸿蒙利用 && OpenHarmony Taro 迭代的遴选公务员另一条主线是对鸿蒙利用 && OpenHarmony 的适配,Taro 与 OpenHarmony 团队成立了跨平台 UI 趣味组(SIG-CROSS-PLATFORM-UI),联结社区独特开展适配工作。目前第一阶段的开发工作行将实现,12 月初会公布首个可用的体验版本。http://lx.gongxuanwang.com/lx...

November 27, 2021 · 1 min · jiezi

关于vue.js:Vue前端开发规范

基于Vue官网格调指南整顿 一、强制 组件名为多个单词组件名应该始终是多个单词的,根组件 App 除外。正例: export default { name: 'TodoItem', // ...}复制代码反例: export default { name: 'Todo', // ...}复制代码 组件数据组件的 data 必须是一个函数。当在组件中应用 data 属性的时候 (除了 new Vue 外的任何中央),它的值必须是返回一个对象的函数。正例: // In a .vue fileexport default { data () { return { foo: 'bar'}}}// 在一个 Vue 的根实例上间接应用对象是能够的,// 因为只存在一个这样的实例。new Vue({ data: { foo: 'bar'}})复制代码反例: export default { data: { foo: 'bar'}}复制代码 Prop定义Prop 定义应该尽量具体。在你提交的代码中,prop 的定义应该尽量具体,至多须要指定其类型。正例: props: { status: String}// 更好的做法!props: { status: { type: String,required: true,validator: function (value) { return [ 'syncing', 'synced', 'version-conflict', 'error' ].indexOf(value) !== -1}}}复制代码反例: ...

November 27, 2021 · 4 min · jiezi

关于vue.js:SpringCloud微服务实战搭建企业级开发框架十六集成Sentinel高可用流量管理框架自定义返回消息

 Sentinel限流之后,默认的响应音讯为Blocked by Sentinel (flow limiting),对于零碎整体性能提醒来说并不对立,参考咱们后面设置的对立响应及异样解决形式,返回雷同的格局的音讯。1、在自定义Sentinel返回音讯之前,须要调整一下代码构造,因为这里要用到对立返回异样的格局,思考到前期可能的应用问题,这里须要把gitegg-platform-boot工程里定义的对立响应及异样移到新建的gitegg-platform-base通用定义工程外面,同时在gitegg-platform-cloud中引入gitegg-platform-base和spring-boot-starter-web <!-- 为了应用HttpServletRequest和HttpServletResponse --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.gitegg.platform</groupId> <artifactId>gitegg-platform-base</artifactId> </dependency>2、在GitEgg-Platform子工程gitegg-platform-cloud中自定义Sentinel错误处理类GitEggBlockExceptionHandler.java: package com.gitegg.platform.cloud.sentinel.handler;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;import com.alibaba.csp.sentinel.slots.block.BlockException;import com.fasterxml.jackson.databind.ObjectMapper;import com.gitegg.platform.base.enums.ResultCodeEnum;import com.gitegg.platform.base.result.Result;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 自定义异样处理器 */@Slf4j@Componentpublic class GitEggBlockExceptionHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { response.setStatus(429); response.setContentType("application/json;charset=utf-8"); Result result = Result.error(ResultCodeEnum.SYSTEM_BUSY, ResultCodeEnum.SYSTEM_BUSY.getMsg()); new ObjectMapper().writeValue(response.getWriter(), result); }}3、配置Sentinel控制台,配置容易呈现限流的规定,关上Jmeter进行测试,咱们能够看到返回音讯曾经是咱们自定义的格局了: 本文源码在https://gitee.com/wmz1930/GitEgg 的chapter-16分支。

November 26, 2021 · 1 min · jiezi

关于vue.js:SpringCloud微服务实战搭建企业级开发框架十五集成Sentinel高可用流量管理框架熔断降级

 Sentinel除了流量管制以外,对调用链路中不稳固的资源进行熔断降级也是保障高可用的重要措施之一。因为调用关系的复杂性,如果调用链路中的某个资源不稳固,最终会导致申请产生沉积。Sentinel 熔断降级会在调用链路中某个资源呈现不稳固状态时(例如调用超时或异样比例升高),对这个资源的调用进行限度,让申请疾速失败,防止影响到其它的资源而导致级联谬误。当资源被降级后,在接下来的降级工夫窗口之内,对该资源的调用都主动熔断。 Sentinel 提供以下几种熔断策略: 慢调用比例 (SLOW_REQUEST_RATIO):抉择以慢调用比例作为阈值,须要设置容许的慢调用 RT(即最大的响应工夫),申请的响应工夫大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内申请数目大于设置的最小申请数目,并且慢调用的比例大于阈值,则接下来的熔断时长内申请会主动被熔断。通过熔断时长后熔断器会进入探测复原状态(HALF-OPEN 状态),若接下来的一个申请响应工夫小于设置的慢调用 RT 则完结熔断,若大于设置的慢调用 RT 则会再次被熔断。异样比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内申请数目大于设置的最小申请数目,并且异样的比例大于阈值,则接下来的熔断时长内申请会主动被熔断。通过熔断时长后熔断器会进入探测复原状态(HALF-OPEN 状态),若接下来的一个申请胜利实现(没有谬误)则完结熔断,否则会再次被熔断。异样比率的阈值范畴是 [0.0, 1.0],代表 0% - 100%。异样数 (ERROR_COUNT):当单位统计时长内的异样数目超过阈值之后会主动进行熔断。通过熔断时长后熔断器会进入探测复原状态(HALF-OPEN 状态),若接下来的一个申请胜利实现(没有谬误)则完结熔断,否则会再次被熔断。 熔断降级规定阐明:熔断降级规定(DegradeRule)蕴含上面几个重要的属性:Field阐明默认值resource资源名,即规定的作用对象 grade熔断策略,反对慢调用比例/异样比例/异样数策略慢调用比例count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异样比例/异样数模式下为对应的阈值 timeWindow熔断时长,单位为 s minRequestAmount熔断触发的最小申请数,申请数小于该值时即便异样比率超出阈值也不会熔断5statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级1000 msslowRatioThreshold慢调用比例阈值,仅慢调用比例模式无效 接下来咱们对这三种熔断策略别离进行配置测试:1、寿险在SystemController.java外面增加须要熔断测试的接口 @ApiOperation(value = "慢调用比例熔断策略") @GetMapping(value = "sentinel/slow/request/ratio") public Result<String> sentinelRR() { try { double randomNumber; randomNumber = Math.random(); if (randomNumber >= 0 && randomNumber <= 0.80) { Thread.sleep(300L); } else if (randomNumber >= 0.80 && randomNumber <= 0.80 + 0.10) { Thread.sleep(10L); } } catch (InterruptedException e) { e.printStackTrace(); } return Result.success("慢调用比例熔断策略"); } @ApiOperation(value = "异样比例熔断策略") @GetMapping(value = "sentinel/error/ratio") public Result sentinelRatio() { int i = 1/0; return Result.success("异样比例熔断策略"); } @ApiOperation(value = "异样数熔断策略") @GetMapping(value = "sentinel/error/count") public Result sentinelCount() { int i = 1/0; return Result.success("异样数熔断策略"); }2、浏览器关上Sentinel治理控制台,关上降级规定菜单,新增降级规定,首先测试“慢调用比例”,依据官网介绍,最大RT是指最大容许的响应工夫,咱们这里设置成200ms,比例阈值设置成0.8,熔断时长为10s,最小申请数为5,意思是指:在1ms内申请数目大于5,并且慢调用的比例大于80%,则接下来的熔断时长内申请会主动被熔断,熔断时长是10秒,10秒之后会进入探测复原状态(HALF-OPEN 状态),若接下来的一个申请响应工夫小于200ms, 则完结熔断,若大于200ms 则会再次被熔断。3、关上Jmeter,点击新建->测试计划->线程组->HTTP申请-聚合报告。线程组设置为15,循环次数10004、测试后果5、异样比例和异样数参考下面的测试方法进行测试,这里不再赘述,只是测试之前须要把GitEgg-Platform外面GitEggControllerAdvice.java对立异样解决的代码正文掉,否则测试代码抛出的异样会被捕捉,达不到料想的成果。 ...

November 26, 2021 · 1 min · jiezi

关于vue.js:微信小程序实现watch监听

Vue.js里有watch监听机制,很适宜“一处扭转,多处影响”的场景,在开发小程序的过程中,天然也会遇到这样的场景,上面介绍如何在小程序中实现watch监听。 1. 定义watch.js在根目录(miniprogram)下创立watch.js,代码如下: // watch.jsconst observe = (obj, key, watchFun, deep, page) => { let oldVal = obj[key] // 如果监听对象是object类型并且指定deep(深度监听) if (oldVal !== null && typeof oldVal === 'object' && deep) { // 递归子集,顺次执行observe() Object.keys(oldVal).forEach(item => { observe(oldVal, item, watchFun, deep, page) }) } // 应用Object.defineProperty()劫持数据的写操作,在监听对象扭转后执行传入的watchFun Object.defineProperty(obj, key, { configurable: true, enumerable: true, set(value) { if (value === oldVal) return watchFun.call(page, value, oldVal) oldVal = value }, get() { return oldVal } })}export const setWatcher = (page) => { // 页面里的data字段 const data = page.data // 页面里的watch字段 const watch = page.watch // 对watch里列举的每一个字段(须要监听的字段)执行observe() Object.keys(watch).forEach(key => { let targetData = data const targetKey = key // 反对deep深度监听,应用deep时须要配合handler应用,否则间接编写函数 const watchFun = watch[key].handler || watch[key] const deep = watch[key].deep observe(targetData, targetKey, watchFun, deep, page) })}2. 应用办法在须要应用监听机制页面的js文件(如index.js)onLoad钩子里,执行setWatch(应用import关键词从watch.js引入),并传入以后页面实例this,实现初始化。 ...

November 26, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中学会使用Echarts生成各种各样的图表得学学了必须要会的基本操作了

仍旧还是学妹给的封面 间接进入主题...在vue中应用个啥,都差不多是一个流程。 引入Echarts装置 npm install echarts --save咱们写一个Echarts组件,在内进行引入 import * as echarts from 'echarts'入门应用如果之前没有接触过Vue或者Echarts 的小伙伴,理解形式无疑就是Echarts官网文档或各大搜索引擎了。 我的理解形式无疑也是这个,然而我在看官网文档的时候,感觉官网给的那个例子,有点点不合乎Vue的格调,不过我先贴出来,实现最简略的入门: <template> <div id="echarts" style="width: 600px; height: 600px"></div></template><script>import * as echarts from 'echarts'export default { mounted() { this.createEcharts(); }, methods: { createEcharts() { // 基于筹备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById("echarts")); // 绘制图表 // 最重要的就是了解各个配置的作用吧,这个没啥说的 就算游刃有余 myChart.setOption({ title: { text: "ECharts 入门示例", }, tooltip: {}, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], }, ], }); } }};</script>将这个组件,在app组件中进行引入即可,咱们来看看初始成果是如何的。 ...

November 26, 2021 · 1 min · jiezi

关于vue.js:eltree-树形控件-自定权限授权勾选框

效果图 不废话上代码<template> <div style="width: 360px;"> <el-tree :data="prdList" show-checkbox node-key="id" default-expand-all :expand-on-click-node="false"> <div class="tree-node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <span v-if="!node.isLeaf"> <el-checkbox :indeterminate="data.isIndeterminate" v-model="data.checkedFlag" @change="checkAllChange(node, data.checkedFlag)">全选</el-checkbox> </span> <span v-else> <el-checkbox v-model="data.athrFlag" true-label="1" false-label="0" @change="clickNode(node, data)">经办</el-checkbox> <el-checkbox v-model="data.landFlag" true-label="1" false-label="0" @change="clickNode(node, data)">受权</el-checkbox> </span> </div> </el-tree> </div></template><script> export default { data() { return { prdList: [{ id: 1, label: '一级 1', children: [{ id: 4, label: '二级 1-1', children: [{ id: 9, label: '三级 1-1-1' }, { id: 10, label: '三级 1-1-2', children: [ { id: 22, label: '四级 1-1-1' }, { id: 23, label: '四级 1-1-2' }, { id: 24, label: '四级 1-1-3' }, ] }] }, { id: 14, label: '二级 1-2', children: [{ id: 19, label: '三级 1-2-1' }, { id: 110, label: '三级 1-2-2' }] }] }, { id: 2, label: '一级 2', children: [{ id: 5, label: '二级 2-1' }, { id: 6, label: '二级 2-2' }] }, { id: 3, label: '一级 3', children: [{ id: 7, label: '二级 3-1' }, { id: 8, label: '二级 3-2' }] }], defaultProps: { children: 'children', label: 'label' } } }, created() { this.init() }, methods: { traversalNode(list, callback) { if (!list && !Array.isArray(list)) { throw new Error('required an Array.') } for (const item of list) { let children = item.children; if (children && children.length > 0) { this.traversalNode(children, callback) } const isBreak = callback(item) if (isBreak) { break; } } }, init() { this.traversalNode(this.prdList, (item) => { this.$set(item, 'athrFlag', '0') this.$set(item, "landFlag", '0') this.$set(item, 'isIndeterminate', false) this.$set(item, 'checkedFlag', false) }) }, checkAllChange(node, value) { this.traversalSon(node, value) if(node.parent) { this.traversalParent(node.parent) } }, traversalSon(node, value) { node.childNodes.forEach((item) => { if(item.isLeaf) { item.data.athrFlag = value ? '1' : '0' item.data.landFlag = value ? '1' : '0' } else { item.data.checkedFlag = value item.data.isIndeterminate = false this.traversalSon(item, value) } }) }, traversalParent(node) { let allCount = 0 // 以后节点下 所有子节点 总数 let checkedCount = 0 // 以后节点的所有子节点 已选个数 let isIndeterminate = false node.childNodes.forEach((item) => { if(item.isLeaf) { allCount += 2 // 用两个复选框(经办 受权) // 经办 if(item.data.athrFlag === '1') { checkedCount++ } // 受权 if(item.data.landFlag === '1') { checkedCount++ } } else { allCount++ if(item.data.checkedFlag === false && item.data.isIndeterminate === true) { isIndeterminate = true } if(item.data.checkedFlag) { checkedCount++ } } }) // 设置 以后节点 选中、半选、未选状态 this.$set(node.data, 'checkedFlag', checkedCount === allCount && allCount !== 0) this.$set(node.data, 'isIndeterminate', isIndeterminate ? true : checkedCount > 0 && checkedCount < allCount) if(node.parent) { this.traversalParent(node.parent) } }, clickNode(node) { this.traversalParent(node.parent) } } };</script><style scoped>.tree-node{ flex: 1; display: flex; align-content: center; justify-content: space-between; padding-right: 10px;}</style>

November 25, 2021 · 2 min · jiezi

关于vue.js:Vuejs大型项目实践面向服务设计与业务模块化

前端架构概览思考:咱们有什么,咱们缺什么?前端架构分为很多局部,在每个不同的我的项目里都会有各自的特点。所以,当咱们想优化一个大型项目的时候,能够从一个概览图来动手剖析,比方下图: 从我本人的我的项目特点来剖析,咱们的基础设施比拟齐备,一些公共的根底服务都能够尝试接入,唯独业务代码异样凌乱。 起因:因为业务迭代频繁,接手的人多,导致组件标准不好、公共办法没有抽离。而且各个业务之间代码耦合性很强,看似没关联的业务,外部代码之间却相互调用。长此以往,这个我的项目必然难以保护,新的需要迭代只会越做越慢,最初无人违心接手。那我的切入点就先从这代码构造开始,vuejs框架既然这么自在,那么咱们就能发明更多的属于本人业务特点的货色。 革新一,面向服务设计前端如何有服务?定义所谓服务,是指软件性能的独立单元,其设计用意是实现特定的工作。其中蕴含了执行残缺、离散的业务性能所需的代码和数据集成,并且能够近程拜访、进行交互或独立更新。 以往痛点前端的公共代码往往最多放在一个公共目录,甚至有些还扩散在不同业务页面里,一直的被复制、粘贴,导致代码复用率很低。并且没有版本能够追踪批改历史,导致产生潜在的全局影响。 借鉴点Chrome团队的面向服务架构设计(SOA)。 原来的各种模块会被重形成独立的服务(Service),每个服务(Service)都能够在独立的过程中运行,拜访服务(Service)必须应用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于保护和扩大的零碎,更好实现 Chrome 简略、稳固、高速、平安的指标! 示意图: 结合点前端的独立模块能够用npm包来实现,每个npm包负责一个独立的公共性能,自带版本治理和独立更新。package.json定义进口文件index.js,其中定义此模块提供的性能接口和代码文件。接口调用通过export、import形式实现,能够全局或按需加载。 示意图: 革新二,业务模块化前端如何有模块?定义模块化是指解决一个简单问题时自顶向下逐层把零碎划分成若干模块的过程。每个模块实现一个特定的子性能,所有的模块按某种形式组装起来,成为一个整体,实现整个零碎所要求的性能。 以往痛点前端的业务代码很容易造成低内聚、高耦合的交叉模式,难以保护,可读性差。加上vuejs选项式开发导致逻辑关注点的碎片化,以及mixin导致的办法名、变量名在子组件中的混同。随着我的项目规模变大,几年之后就会呈现难以保护,无人敢碰,只能重构的场面。 借鉴点Symfony的bundle零碎(一套可复用的PHP组件)。 bundle相似于其他软件中的插件,但却更好。要害区别在于:Symfony中的每一样货色都是bundle,包含框架外围性能,以及你编写的程序代码。bundle是Symfony体系中的一等公民。一个bundle,就是一组结构化的文件,存于一个“用于实现某个独立性能”的目录中。每个目录都蕴含着关乎那个性能的所有货色,包含php文件,模板,css,js文件,tests,以及其余。 示意图: 结合点基于vue的multi-page模式,每个page是一个齐全独立的业务模块(App),独立编译部署。每个业务模块中再细分子业务模块subApp,每个subApp自带vuejs框架的store、router、mixins等关乎这个业务的所有货色。编译时将subApp等子模块组装到一起,从而实现一个独立的业务性能。这样就能实现业务代码的解耦,让各个子模块性能更内聚,更易于保护和扩大。 示意图: subApps的聚合和相互调用// index.js,subApp的进口文件import { HcSubApp } from 'hc-micro-pages';import store from './store';import routes from './routes';import { jump2IsvPage, jump2CreateCard } from './libs/utils';const subApp = new HcSubApp();subApp.store = store; // vuex数据注册subApp.routes = routes; // vue router路由注册subApp.routePrefix = 'inquiry'; // 命名空间隔离subApp.storeModule = 'inquiry'; // 命名空间隔离// 输入subApp对象,供交融应用export default subApp;// 输入对外接口,供其余subApp调用export { jump2IsvPage, jump2CreateCard };革新三,多包管理模式为什么还波及到多包?公共服务包 + 业务模块 = ?新问题npm包的模式并不适宜批改频繁的我的项目,总要公布新版本,会升高开发效率。而且包的代码还要和业务代码拆散,同时操作两个我的项目去写同一个业务感觉很决裂,也不利于调试。同时业务模块也短少一个模块该有的个性:版本、批改历史、发版的tag。这样对灰度公布、版本回滚、问题追溯都不敌对。 ...

November 25, 2021 · 1 min · jiezi

关于vue.js:Vue32快速生成模板

VSCode配置门路:file => preferences => user snippets 新建vue.json { "Vue3.2疾速生成模板": { "prefix": "Vue3.2", "body": [ "<!-- $1 -->", "<template>", "\t<div>", "\t\t$3", "\t</div>", "</template>\n", "<script setup>", "\t$2", "</script>\n", "<style lang='scss' scoped>", "\t$4", "</style>" ], "description": "Vue3.2" }}将上述代码放在vue.json文件中,在新建.vue结尾的文件中输出vue3.2 按键盘的Tab 主动生成模板。

November 25, 2021 · 1 min · jiezi

关于vue.js:前端如何处理后端接口返回的gzip压缩的数据

因后端返回的数据量较大,后端应用gzip压缩数据,前端拿到接口返回的压缩数据进行解压。如图所示 咱们采纳pako解决压缩数据 装置npm install pako应用// 导入pakoimport pako from 'pako'// b64Data-->传入加密的数据进行解密function unzip (b64Data) { let strData = atob(b64Data) // Convert binary string to character-number array const charData = strData.split('').map(function (x) { return x.charCodeAt(0) }) // Turn number array into byte-array const binData = new Uint8Array(charData) // // unzip const data = pako.inflate(binData) // Convert gunzipped byteArray back to ascii string: strData = String.fromCharCode.apply(null, new Uint16Array(data)) return strData}// 加密function zip (str) { if (typeof str !== 'string') { str = JSON.stringify(str) } const binaryString = pako.gzip(str, { to: 'string' }) return btoa(binaryString)}export { unzip, zip}示例引入上述pako.js文件 ...

November 25, 2021 · 1 min · jiezi

关于vue.js:elpopover-手动关闭

咱们晓得element 提供的popover 是主动敞开的, 那么想手动管制敞开怎么做呢能够利用$refs['ref_']提供的doClose() 办法比方在表格中, td 项点击弹出popover <el-table-column prop="" label="出价" align="center"> <template slot-scope="scope"> <span>{{ parseFloat(scope.row.price).toFixed(2) }} <el-popover :ref="'ref_'+scope.row.id" placement="right-start" width="200" trigger="click" > <div> <p> <input :id="'price_'+scope.row.id" :value="parseFloat(scope.row.price).toFixed(2)" style="width: 100px; height:30px;"/> <el-button type="text" size="mini" @click="setPrice(scope)">确定</el-button> <el-button type="text" size="mini" @click="cancelPrice(scope)">勾销</el-button> </p> </div> <i slot="reference" class="el-icon-edit cursor-pointer" v-if="editpriceFlg"></i> </el-popover> </span> </template> </el-table-column>js 局部 scope._self.$refs['ref_'+id].doClose() 敞开 cancelPrice(scope){ let id = scope.row.id scope._self.$refs['ref_'+id].doClose() }, setPrice(scope){ let id = scope.row.id let val = $("#price_"+id).val() if(!this.validPrice(val)){ $("#price_"+id).val(scope.row.price) return } this.listLoading = true request.post('/price',{id: id, price: val}).then((resData)=>{ this.$message.info("批改胜利") }).finally((_)=>{ this.listLoading = false this.select() scope._self.$refs['ref_'+id].doClose() }) },

November 24, 2021 · 1 min · jiezi

关于vue.js:提供了更加丰富的语法以便配置

n(binary)代表由 Java 源文件编译后的二进制 class 文件,src(source)代表Java 源文件。个别状况下,抉择 bin 文件进行装置就 OK 了;如果你想本人编译,遴选真题可选 src 版本。tar.gz 压缩格局实用于 Unix 操作系统,zip 实用于 Windows 操作系统;但不是相对的。 该目录只蕴含了一个 plexus-classworlds-xxx-jar 文件,该文件是一个类加载器框架,相当于默认的 Java 类加载器,提供了更加丰盛的语法以便配置,Maven 应用该加载器加载本人的类库。http://lx.gongxuanwang.com/ss...conf 目录:该目录蕴含了一个十分重要的文件 settings.xml。能够间接批改该文件,用来全局定制 Maven 的行为;遴选真题也能够复制该文件到 ~/.m2/ 目录下(~示意用户目录),批改该文件能够在用户范畴内定制 Maven 的行为。 project 是根元素,申明了一些POM相干的命名空间及xsd元素。modelVersion指定了以后POM的版本,对于Maven 3来说,值只能是4.0.0。groupId定义了我的项目属于哪个组织,通常是组织域名的倒序,比如说我的域名是 itwanger.com,所以groupId就是 com.itwanger。http://lx.gongxuanwang.com/ss...

November 24, 2021 · 1 min · jiezi

关于vue.js:事务涉及的数据库操作在同一个数据

把适配后生成的编程文件装入到PLD器件(可编程逻辑器件)中的过程, 或称为下载。通常将对基于EEPROM工艺的非易失构造PLD器件的下载称为编程(Program);遴选真题将基于SRAM工艺构造的PLD器件的下载称为配置(Configure)。 仓储/订单/账户服务部署在不同的服务器上,应用不同的数据库实例,与单机模式齐全不同。单机模式中的事务通常要求事务波及的数据源为同一个,并且事务波及的数据库操作在同一个数据库链接中,分布式状况下显然不满足条件。http://lx.gongxuanwang.com/ss... 事务管理器(Transaction Manager,TM):定义全局事务,开启全局事务、提交全局事务或回滚全局事务;阿里巴巴中间件团队自2014年开始启动该我的项目,用于解决利用架构从繁多服务向微服务转变所带来的分布式事务问题;GTS:寰球交易服务。遴选真题TXC作为阿里云中间件产品,新名称GTS于2016年公布;Fescar:2019年开始了基于TXC/GTS的开源我的项目Fescar,用于开源我的项目社区倒退;资源管理器(Resource Manager,RM):治理分支事务中的资源,向事务管理器注册分支事务和并报告分支事务的状态,负责分支事务提交或回滚;http://lx.gongxuanwang.com/ss...

November 24, 2021 · 1 min · jiezi

关于vue.js:Vue都使用那么久了还不了解它的生命周期吗

前言我记得尤大已经说过,你看Vue源码干嘛?你应用Vue又不须要它的源码,你只须要会用就行了! 然而咱们得卷啊,不卷怎么怀才不遇,我还记得在往年的蓝桥杯群里,有一起届的还不晓得哪个大学的哥们,曾经在读Vue/React/Node的源码了.....作为小菜鸡的我看着大佬娓娓而谈,在群角落里瑟瑟发抖。 最近有在牛客上温习Vue的常识,整顿出这篇文章,一是不便本人将来温习,二是心愿可能帮忙一些跟我一样的敌人们温习一边知识点,学习在什么时候都不晚。 这篇文章会讲到: Vue的生命周期到底是什么Vue生命周期的执行程序生命周期的每个阶段适宜做什么咱们的申请放在哪个生命周期会更适合当然我只会讲我了解的emm,可能会很浅,还请多包涵。 Vue的生命周期到底是什么?与其说是Vue的生命周期,我感觉不如说是其内组件的生命周期。 简略来说,它的生命周期就是用来形容一个组件从引入到退出的全过程。 那简单来说呢?就是一个组件从创立开始经验了数据初始化,挂载,更新等步骤后,最初被销毁。 Vue生命周期的执行程序他整体是分为三个大阶段的,在三个大阶段中,有细分为若干的小阶段。咱们能够在不同的阶段去做不同的事件,后文也会讲到不同的阶段适宜咱们去做具体什么事件的。 咱们先来看看它的执行程序吧: 有两种办法,一种就是Vue的官网文档下面有一个图是专门解释生命周期的,但鉴于可能许多小伙伴们都是跟我一样,看英文文档都要随同着翻译的程度,所以特意在网上找了个翻译过后的汉化版,放在这里给大家做参考: 这个图具体的解释了一个Vue实例从创立到销毁的全过程。 第二种办法,就是咱们在Vue我的项目中打印一下,在控制台中咱们就能清晰的看出,谁执行的早,谁执行的晚,甚至能看出他们有什么区别: beforeCreate: function () { console.group('------beforeCreate创立前状态------'); console.log("%c%s", "color:red", "el : " + this.$el); //undefined console.log("%c%s", "color:red", "data : " + this.$data); //undefined console.log("%c%s", "color:red", "message: " + this.message)},created: function () { console.group('------created创立结束状态------'); console.log("%c%s", "color:red", "el : " + this.$el); //undefined console.log("%c%s", "color:red", "data : " + this.$data); //已被初始化 console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message); //已被初始化},beforeMount: function () { console.group('------beforeMount挂载前状态------'); console.log("%c%s", "color:red", "el : " + (this.$el)); //undefined console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); //已被初始化 console.log("%c%s", "color:red", "message: " + this.message); //已被初始化 },mounted: function () { console.group('------mounted 挂载完结状态------'); console.log("%c%s", "color:red", "el : " + this.$el); //已被初始化 console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); //已被初始化 console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message); //已被初始化 },beforeUpdate: function () { console.group('beforeUpdate 更新前状态===============》'); console.log("%c%s", "color:red", "el : " + this.$el); console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message);},updated: function () { console.group('updated 更新实现状态===============》'); console.log("%c%s", "color:red", "el : " + this.$el); console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message);},beforeDestroy: function () { console.group('beforeDestroy 销毁前状态===============》'); console.log("%c%s", "color:red", "el : " + this.$el); console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message);},destroyed: function () { console.group('destroyed 销毁实现状态===============》'); console.log("%c%s", "color:red", "el : " + this.$el); console.dir(this.$el) console.log("%c%s", "color:red", "data : " + this.$data); console.dir(this.$data) console.log("%c%s", "color:red", "message: " + this.message)}复制代码挂载阶段其实这个代码的先后顺序就是他执行的先后顺序了,为了能有更新的状态,所以我找了个todolist的demo,能够增加跟删除的,不便咱们来看,首先是刚进入页面: ...

November 24, 2021 · 2 min · jiezi

关于vue.js:vue-element组件上传与表单共同提交与下载

一.上面解说一些upload组件中罕用的属性及办法 属性limit: 限度文件上传个数,单个文件可设置为1,根据需要设置个数。accept:限度抉择上传文件时的类型(常见类型:jpg/png/xls/xlxs/doc 等)multiple: 多文件上传时可设置为trueauto-upload: 主动上传,独自上传文件到服务器(不须要和表单一起提交时可设置)action:上传文件的地址。当咱们设置了auto-upload为true时,组件会主动依照action的地址提交。如果不须要独自上传,这个属性可设置为none。2.办法 on-preview:图片的话可做放大操作【window.open()】,对于文件能够做下载附件的操作,具体方法为window.location.href()。on-remove: 文件列表移除文件触发before-upload:上传文件前触发的函数,如果auto-upload敞开 不会主动上传,这个钩子函数也不会触发on-exceed: 超出文件个数限度的钩子函数,能够在用户抉择超过文件个数时,给出有好的提醒。on-change:文件状态扭转时的钩子,增加文件、上传胜利和上传失败时都会被调用。3.具体代码 template局部 <el-form-item label="上传附件" class="form-item-100" prop="file"> <el-upload class="upload-demo" action="none" :file-list="fileList" :on-exceed="handleExceed" :on-remove="handleRemove" :on-change="handleChange" :on-preview="downloadFile" :auto-upload="false" :limit="1" > <el-button size="small" type="primary">点击上传</el-button> </el-upload> </el-form-item>methods局部 // 超出文件限度 handleExceed (files, fileList) { this.$message.warning(`以后限度上传1个文件,共抉择了 ${fileList.length} 个文件`); }, // 文件列表移除文件时的钩子 handleRemove (file, fileList) { this.fileList = fileList }, // 上传文件 handleChange (file, fileList) { this.fileList = fileList }, // 下载附件 downloadFile (file) { window.location.href = file.raw // raw二进制文件 },二.上传文件与表单独特提交 提交表单办法 应用multipart/form-data;格局传参 let file = "" file = this.fileList.length ? this.fileList[0].raw : '' let formData = new FormData() formData.append('id', this.infoForm.id) formData.append('fblx', this.infoForm.fblx) formData.append('fbnr', this.infoForm.fbnr) formData.append('fb_rqsj', this.infoForm.fb_rqsj) formData.append('ggdj', this.infoForm.ggdj) formData.append('fbqxxqdm', this.infoForm.fbqxxqdm) formData.append('fbqxxqjb', this.infoForm.fbqxxqjb) formData.append('ggbt', this.infoForm.ggbt) formData.append('fbqxlb', this.infoForm.fbqxlb) formData.append('file', file) formPost('/zhyq/notice/v1/update', formData, { headers: { 'Content-Type': 'multipart/form-data; charset=utf-8' }, }).then(res => { this.$message({ message: "编辑胜利!", type: "success" }); this.infoShow = false; this.init(); }).catch(err => { });

November 23, 2021 · 1 min · jiezi

关于vue.js:字符编程了长度为4的16进制数

运行的后果为 :68 65 6C 6C 6F E6 88 91 E7 88 B1 47 4F E5 BC 80 E5 8F 91数一下成对呈现的16进制数,咱们就能够发现19个字节长度原来是这么来的。遴选真题通过剖析咱们不难发现一个英文占用了两个字节而中文则占用了3个字节,例如外面的“我”转换之后就是:E6 88 91,那么咱们间接输入s又会是什么呢? 转换成了下面这个是通过什么转换的呢?其实通过utf-8转换成了unicode编码,咱们发现转换成unicode之后,相干的中文字符编程了长度为4的16进制数,那么其实就是相当于是rune所占的字节长度了。 的残余局部map的定义以及相干的操作应用,遴选真题前面还和大家交叉了局部字符串的解决形式,当然还是比拟散的,前面在写我的项目的过程中,咱们到时候在具体用起来,所以在此心愿大家继续关注老猫,另外的也心愿大家多练习,一起提高,加油。http://www.gongxuanwang.com/

November 23, 2021 · 1 min · jiezi

关于vue.js:vue中修改UI组件样式的几种方法

在开发中大家常常遇到一个问题,就是引入了诸如elementUI等UI组件之后,想要批改UI组件的款式却无从下手。组件通过层层封装,咱们须要先找到具体须要批改的最终元素,并找到其选择器。简略列举三种批改形式:(1)另写一个<style></style>, 不要加scoped,将须要笼罩的元素款式写入进去,scoped属性限度了款式仅在以后文件作用域内无效,不会穿透到封装元素上,去掉scoped属性后就能够实现款式穿透,毛病是会笼罩全局款式,但咱们能够在引入组件外包裹一个父元素,而后应用父子选择器来准确命中本组件内的UI组件元素,进而躲避款式净化的问题 <style lang="less"> // 须要笼罩的款式 .wrapper .el-table--body {}</style><style lang="less" scoped> // 本地款式</style>(2)less 和 sass 中都提供了 /deep/ 深度穿透选择器,此时咱们仍旧能够保留scoped属性而不用放心款式净化。 <style lang="less" scoped> /deep/ .el-table--body {}</style>(3)vue中提供了深度选择器>>>,然而sass等工具还无奈辨认他,须要写在独自的style外面 <style scoped> // 须要笼罩的款式 .wrapper >>> .el-table--body {}</style><style lang="less" scoped> // 本地款式</style>

November 23, 2021 · 1 min · jiezi

关于vue.js:vue项目cli3环境下使用AMap进行定位城市

第一步:在index.html中引入,放在body下面: <script type='text/javascript' src='https://webapi.amap.com/maps?v=1.4.13&key=你本人的key&plugin=AMap.CitySearch'></script>第二步在vue.config.js中: configureWebpack: { externals: { 'AMap': 'AMap' }}第三步应用的页面中引入并应用:import AMap from 'AMap' const citysearch = new AMap.CitySearch() citysearch.getLocalCity((status, result) => { if (status === 'complete' && result.info === 'OK') { if (result && result.city && result.bounds) { console.log(result) } } else { console.log(result.info) } })这样就能够获取所在城市的定位了

November 23, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vuex原理图分析及结合生活案例让大家快速理解

来自一名超级美的学妹:Sunday 前言上篇文章说了为什么在vue中有了全局事件总线还要引入vuex的问题,这篇着重讲Vuex的原理图,晓得原理图才可能明确如何去书写Vuex的代码。 一、原理图 来自于Vuex官网 从图中咱们能够看到,vuex中有Actions、Mutations、State三个对象,先从字面意思上了解下哈 Actions:翻译过去即为动作、行为的意思Mutations:翻译过去有变动、转变的意思State:翻译过去就是状态的意思,这里的状态其实就是数据的意思。另外他们三个全部都是Object对象{}。 咱们拿一个自加的案例来走一遍这个原理图的流程,让大家更快的了解。 偷了点懒,不想重画这张图,就在原图上操作啦(手动狗头保命) 残缺流程大抵就是这八步。至于还没说的backend API和Devtools ,前面有说滴。 思考 大家有没有感觉Actions所处的地位比拟难堪丫,因为就是转交一下,并没啥其余的作用啊。 其实在Vuex中,是容许Vue Components 间接调用 commit api的,即如下 我讲到这里,可能大家更感觉actions没啥用啦,其实是有的,还记得我之前没说的backend API 吗 其实backend API 是另一台服务器。 意思就是当咱们调用了dispatch(zijia)时,并不知道要自加你,这个时候,咱们就在actions中向另一台服务器发送申请,问它咱们要自加几。所以这个时候actions还是有用的。存在必会有存在的价值。 Devtools 这里也顺带说一下吧,意思就是可能在vue-devtools的调试工具里,看到数据的全副变动,以及批改的历史记录 上面再来通过一个生存案例来对这个图进行一个了解性记忆吧。 对了稍稍补充一下,其实在vuex的这个官网图,还少了一点点货色只过它在图中用vuex来示意了。 actions、mutations、state这三个对象都被store都管着,多这么个领导者是为了更好的状态治理,因为前面会变得越来越简单。 二、生存案例了解咱们将流程中参加的四个对象别离形象的比喻为客人、服务员、后厨、菜肴,将vuex整体比喻为大酒店 流程解释: 客人来到vuex中,客人和服务员说要点xxxx、xxx菜(调用dispatch API,即派发到actions)。服务员(actions)接管到申请后,再将客人点的菜名提交给(commit())给后厨团队。后厨接管到服务员提交过去的菜名,就开始进行制作(即更新数据),而后通过mutate(主动触发)传递到State中。菜肴制作好后,通过render渲染,送到客人背后(更新视图)再如果你和后厨的xdm玩的特地好,特地相熟,你下次来的时候,就间接越过了服务员,间接和后厨的哥们说,明天还是老样子,后厨的兄弟就懂了。 再或者还有上面的这样状况: 你来到大酒店想间接去找后厨的兄弟,然而最近菜单更新了,服务员拦住你说,咱们店的菜肴更新了,你必须要跟我说一下,你要吃什么,才好给你上菜。(菜肴更新了就是向另外一台服务器申请数据的意思)。 心愿通过这个小案例,可能让大家更好的记忆。 后语大家一起加油!!!如若文章中有不足之处,请大家及时指出,在此郑重感激。 纸上得来终觉浅,绝知此事要躬行。 大家好,我是博主宁在春:主页 一名喜爱文艺却踏上编程这条路线的小青年。 心愿:咱们,待别日相见时,都已有所成。

November 23, 2021 · 1 min · jiezi

关于vue.js:Vue-入门此文足矣

目标 理解 Vue 是什么?理解为什么抉择 Vue用案例来理解 Vue 罕用的外围语法一、Vue 是什么?引自官网—— Vue (读音 /vju/,相似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为能够自底向上逐层利用。Vue 的外围库只关注视图层,不仅易于上手,还便于与第三方库或既有我的项目整合。另一方面,当与现代化的工具链以及各种反对类库联合应用时,Vue 也齐全可能为简单的单页利用提供驱动。构建用户界面的渐进式框架构建用户界面比拟好了解,但渐进式框架是个什么鬼?简略来说,渐进式框架是这样一个东东。你能够边学习边把握边按需利用到我的项目中,而不用将它齐全把握后对我的项目进行重构。[1] 自底向上逐层利用由基层开始做起,把根底的货色写好,再逐层往上增加成果和性能。[1] 只关注视图层申明式渲染、组件式开发、css过渡和动画 等都是为此服务。 便于与第三方库或既有我的项目整合因为 Vue 是一个 渐进式框架,那能实现与既有我的项目整合必定是必然的。 为简单的单页利用提供驱动现代化工具链:webpack、vite各种反对类库:UI、vuex、vue-router二、为什么抉择 Vue[2]理解完 Vue 的特点后,就明确咱们为什么抉择它了: 简化 DOM 与数据的绑定而不用重构我的项目轻量化且易于学习反对构建单页面利用虚构 DOM,晋升运行效率组件化开发社区沉闷就第一点略微阐明一下,以传统办法实现 DOM 和数据的双向绑定,咱们会这样写: <body> <p id="result"> <span>后果是:</span> <span></span> <button onclick="onClick()">获取信息</button> </p> <p> <label for="">批改后果:<input type="text" id="new-result" /></label> </p> <script> var result = '' var resultDom var newResultDom $(document).ready(() => { // 先将相干 DOM 保留下来 resultDom = $('#result span:eq(1)') newResultDom = $('#new-result') // 增加文本输入框的按键结束的事件监听 newResultDom.keyup(() => { // 更新后果 setResult(newResultDom.val()) }) }) /** 按钮点击解决,模仿从服务器获取数据 */ function onClick() { setTimeout(() => { setResult('Hello, World.') }, 1000) } /** 设置后果 */ function setResult(v) { result = v // 更新相干节点的内容 resultDom.text(v) newResultDom.val(v) } </script></body>参考[1] Vue 中的重要概念[2] 咱们为什么抉择VUE来构建前端 ...

November 22, 2021 · 1 min · jiezi

关于vue.js:vuecli-设置html的title

vue.config.js chainWebpack: (config) => { config.plugin('html').tap((args) => { args[0].title = '你想设置的title名字' return args }) }index.html <title> <%= htmlWebpackPlugin.options.title %> </title>

November 22, 2021 · 1 min · jiezi

关于vue.js:Vue路由守卫有哪些怎么设置使用场景等

vue中路由守卫一共有三种,一个全局路由守卫,一个是组件内路由守卫,一个是router独享守卫。 一、全局路由守卫 所谓全局路由守卫,就是小区大门,整个小区就这一个大门,你想要进入其中任何一个房子,都须要通过这个大门的查看全局路由守卫有个两个:一个是全局前置守卫,一个是全局后置守卫 router.beforeEach((to, from, next) => { console.log(to) => //到哪个页面去?console.log(from) => // 从哪个页面来?next() => // 一个回调函数 }router.afterEach(to,from) = {} next():回调函数参数配置 next(false): 中断以后的导航。如果浏览器的 URL 扭转了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。以后的导航被中断,而后进行一个新的导航。你能够向 next 传递任意地位对象,且容许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项 二、组件路由守卫 // 跟methods: {}等同级别书写,组件路由守卫是写在每个独自的vue文件外面的路由守卫 beforeRouteEnter (to, from, next) { //留神,在路由进入之前,组件实例还未渲染,所以无奈获取this实例,只能通过vm来拜访组件实例 next(vm => {}) }beforeRouteUpdate (to, from, next) { // 同一页面,刷新不同数据时调用, }beforeRouteLeave (to, from, next) { // 来到以后路由页面时调用 } ...

November 22, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了为什么Vue在有了全局事件总线后还要引入Vuex呢

今日凌晨,乌云散去 前言上一篇我写了对于Vue中全局事件总线的相干原理及小案例。 在之前文章有简略的说过对于我集体了解的 Vue 核心思想(刚学不久,如有有余,请各位大佬及时斧正) 数据的双向绑定,不必再手动操作DOM元素组件化开发,将一个页面划分成多个小组件,而后再一步一步拼凑而成组件化开发,最大的痛点可能就是要做到任意间组件通信,组件间通信其本质就是数据的共享。 对于组件间的通信,我在之前也是一步一步写过来的 组件间利用props实现组件间通信 (实用于父子组件通信,祖孙组件也行,对兄弟组件不太敌对)组件间利用自定义事件实现组件间通信 (同上)全局事件总线实现任意组件间通信 (任意间组件都可能通信)案例以及通过第三方库公布/订阅形式实现组件间通信(大家私下理解就好,我集体感觉Vue中事件总线比公布订阅更合乎生态,所以没有写这篇文章)注释... 为什么引入Vuex呢?思考 不晓得大家会不会产生这样的一个纳闷, 全局事件总线 明明曾经能够实现任意间组件通信啦,为什么还要额定将 Vuex引入Vue的生态呢?这样的操作不会显得有些反复吗? 组件间通信其实就是实现数据的共享和增删改查。 在全局事件总线中,通过在vm中beforeCreate生命周期中为 Vue 的原型上增加一个 $bus 属性,在所有组件都能够利用 $on和$emit在$bus属性上绑定办法,通过办法参数能够在不同组件传递数据。这个办法解决了兄弟组件或爷爷孙子组件这种层级比拟多的组件间的数据传递。 然而这些数据自身存在的中央是在某一个组件的外部,而后其余的组件通过触发回调,来进行数据的批改。也就意味着,如果咱们要实现组件通信,就必须在子组件中写一个办法来触发父组件中的当时绑定好的回调函数。如果有更多更多的组件要操作这个数据呢??会怎么样?? 认真思考思考,咱们批改的是一个共享数据,为什么还要两端都写类似且反复的代码呢? 难道咱们不能在子组件中写了,而后父组件中就立马检测到数据的变更,而后再更新到视图层吗?? VuexVuex官网文档 在官网文档中,是这么介绍Vuex的: 它采纳集中式存储管理利用的所有组件的状态,并以相应的规定保障状态以一种可预测的形式发生变化。Vuex 也集成到 Vue 的官网调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试性能vuex就是将所有要共享的数据,全副拉进了同一个群聊,集中式的治理,增删改查的办法也是同样如此,你要操作什么数据,间接调用办法即可。 并且vue官网还给出了调试工具,像咱们应用全局事件总线时,操作数据是不会有历史记录的,然而用vuex,关上调试工具,是能够看到你的操作数据的历史记录的,这一点是其余形式无可比拟的。 说重点说重点:为什么用Vuex哈... 咱们的利用非常容易遇到多个组件共享状态时,单向数据流的简洁性很容易被毁坏: 多个视图依赖于同一状态。来自不同视图的行为须要变更同一状态。对于问题一,传参的办法对于多层嵌套的组件将会十分繁琐,并且对于兄弟组件间的状态传递无能为力。 对于问题二,咱们常常会采纳父子组件间接援用或者通过事件来变更和同步状态的多份拷贝。 因而,咱们为什么不把组件的共享状态抽取进去,以一个全局单例模式治理呢?在这种模式下,咱们的组件树形成了一个微小的“视图”,不论在树的哪个地位,任何组件都能获取状态或者触发行为! 就相当于定义了这样的一个地方仓库,所有组件都可能获取到存在外面的数据,也可能对数据进行操作,一旦数据扭转,也会更新应用了相干数据的组件视图。 通过定义和隔离状态治理中的各种概念并通过强制规定维持视图和状态间的独立性,咱们的代码将会变得更结构化且易保护。 咱们通过vuex将所有数据及操作数据的形式都提取进去,不论从代码层面,亦或者数据管理方面,都变得更加方面,无需像全局事件总线那样,都要当时绑定,子组件触发,再执行回调函数,能力更新视图。 倡议: vuex尽管不便了,然而如果你的我的项目利用并不宏大,其实能够应用简略的 store 模式。而无需应用vuex,因为这可能让你的代码显得冗余。 平时写个小demo啥的,咱们用用props、全局事件总线就完事啦。 后语大家一起加油!!!如若文章中有不足之处,请大家及时指出,在此郑重感激。 纸上得来终觉浅,绝知此事要躬行。 大家好,我是博主宁在春:主页 一名喜爱文艺却踏上编程这条路线的小青年。 心愿:咱们,待别日相见时,都已有所成。 摆摊了摆摊了⍤长棍面包 ⍤汉堡⍤薯条⍤炸鸡腿⍤披萨⍤热狗⍤三明治⍤可乐饼⍤夹馍⍤海鲜披萨⍤鸡肉卷⍤三色小丸子⍤炖土豆⍤便利⍤仙贝⍤饭团⍤咖喱饭⍤拉面⍤意大利面⍤寿司⍤炸虾⍤大蛋糕⍤纸杯蛋糕⍤小块蛋榚⍤布丁以上统统一个赞,一个赞你买不了吃亏,一个赞你买不了受骗,真正的物有所值

November 22, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中-Slot-插槽的使用同样也可以实现父子组件之间通信

前言插槽能够说是 Vue 中十分重要的一部分吧,在我学习和练习的过程中,当组件搭配着插槽一起应用的时候,会施展的更好一些。更多时候也会更加不便。 明天介绍Vue中三种插槽吧:默认插槽、具名插槽、作用域插槽。 环境筹备先搭个初始环境给大家看看哈。一步一步讲完这个插槽。 就是写了一个类别组件,别离渲染这三种数据。 Category组件 <template> <div class="category"> <h1>{{title}}</h1> <ul> <li v-for="(item,index) in listData" :key="index">{{item}}</li> </ul> </div></template><script>export default { props: { listData:Array, title: String }}</script><style scoped>.category{ width: 200px; height: 300px; background-color:pink;}</style>App组件 <template> <div id="app"> <Category :listData="games" :title="'Games'" /> <Category :listData="movies" :title="'Movies'" /> <Category :listData="foods" :title="'Foods'" /> </div></template><script>import Category from './components/Category.vue'export default { name: 'App', components: { Category }, data () { return { games:['穿梭前线','qq飞车','洛克王国'], movies:['你好,李焕英','青春派','匆匆那年'], foods:['邵阳米粉','长沙茶颜','重庆火锅'] } }}</script><style>#app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; display: flex; justify-content: space-between;}</style>最开始就是如上图一样的需要,然而当初业务需要更改了,电影变成了只宣传其中一个,其余的不进行宣传,吃的也变成只宣传一个拉。 ...

November 21, 2021 · 3 min · jiezi

关于vue.js:基于Vue3最新标准实现后台前端综合解决方案云盘分享

download:基于Vue3最新规范,实现后盾前端综合解决方案数据库: 对大量信息停止治理的高效处理计划。 依照数据结构来组织、存储和治理数据的库。 数据库系统:(DBS,DATABASE SYSTEM): 数据库(DB,DATABASE) + 数据库管理系统(DBMS,DATABASE MANAGEMENT SYSTEM) 关系型数据库 :建立在关系模型上的数据库系统。 关系模型: 将日常生活中的实体(学生)和实体的属性(学生的学号,姓名等)保存到数据库中时,应该如何处理该实体构造。 1、数据结构能够规定,同类数据,构造一致,就是一个二维表格。 2、数据之间的关系能够设置。实体与实体之间的联系。 实体构造+实体联系 关系型数据库的概念: 数据库database:数据的仓库。 表(table):数据保存在表内,保存在一个表内的数据,应该具备雷同的数据格式。 行与列:行用于记录数据,列用于规定数据格式。 记录:行内的数据。 字段:数据的某个列。 SQL:数据管理系统,用来治理数据的语言,结构化查问语言(structured query language)。 罕用数学符号大全、关系代数符号1、几何符号 ⊥ ∥ ∠ ⌒ ⊙ ≡ ≌ △ 2、代数符号 ∝ ∧ ∨ ~ ∫ ≠ ≤ ≥ ≈ ∞ ∶ 3、运算符号 如加号(+),减号(-),乘号(×或·),除号(÷或/),两个会合的并集(∪),交加(∩),根号(√),对数(log,lg,ln),比(:),微分(dx),积分(∫),曲线积分(∮)等。 4、会合符号 ∪ ∩ ∈ 5、特殊符号 ∑ (圆周率) 6、推理符号 |a| ⊥ ∽ △ ∠ ∩ ∪ ≠ ≡ ± ≥ ≤ ∈ ← ↑ → ↓ ↖ ↗ ↘ ↙ ∥ ∧ ∨ &; § ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ∈ ∏ ∑ ∕ √ ∝ ∞ ∟ ∠ ∣ ∥ ∧ ∨ ∩ ∪ ∫ ∮ ∴ ∵ ∶ ∷ ∽ ≈ ≌ ≒ ≠ ≡ ≤ ≥ ≦ ≧ ≮ ≯ ⊕ ⊙ ⊥ ⊿ ⌒ ℃ 指数0123:o123 7、数量符号 如:i,2+i,a,x,自然对数底e,圆周率。 8、关系符号 如“=”是等号,“≈”是近似符号,“≠”是不等号,“>”是大于符号,“<”是小于符号,“≥”是大于或等于符号(也可写作“≮”),“≤”是小于或等于符号(也可写作“≯”),。“→ ”示意变质变动的趋势,“∽”是相似符号,“≌”是全等号,“∥”是平行符号,“⊥”是垂直符号,“∝”是成正比符号,(没有成反比符号,但可能用成正比符号配倒数当作成反比)“∈”是属于符号,“??”是“蕴含”符号等。 9、拆散符号 如小括号“()”中括号“[]”,大括号“{}”横线“—” 10、性质符号 如正号“+”,负号“-”,值符号“| |”正负号“±” 11、省略符号 如三角形(△),直角三角形(Rt△),正弦(sin),余弦(cos),x的函数(f(x)),极限(lim),角(∠), ∵因为,(一个脚站着的,站不住) ∴所以,(两个脚站着的,能站住) 总和(∑),连乘(∏),从n个元素中每次取出r个元素所有不同的组合数(C(r)(n) ),幂(A,Ac,Aq,x^n)等。 12、排列组合符号 C-组合数 A-排列数 N-元素的总个数 R-参加抉择的元素个数 !-阶乘 ,如5!=5×4×3×2×1=120 C-Combination- 组合 A-Arrangement-排列 13、离散数学符号 ├ 断定符(公式在L中可证) ╞ 满足符(公式在E上无效,公式在E上可满足) ┐ 命题的“非”运算 ∧ 命题的“合取”(“与”)运算 ∨ 命题的“析取”(“或”,“可兼或”)运算 → 命题的“条件”运算 A<=>B 命题A 与B 等价关系 A=>B 命题 A与 B的蕴涵关系 A* 公式A 的对偶公式 wff 合式公式 iff 当且仅当 ↑ 命题的“与非” 运算( “与非门” ) ↓ 命题的“或非”运算( “或非门” ) □ 模态词“必然” ◇ 模态词“可能” 空集 ∈ 属于(??不属于) P(A) 会合A的幂集 |A| 会合A的点数 R^2=R○R [R^n=R^(n-1)○R] 关系R的“复合” (或上面加 ≠) 真蕴含 ∪ 会合的并运算 ∩ 会合的交运算 - (~) 会合的差运算 〡 限度 X 会合对于关系R的等价类 A/ R 会合A上对于R的商集 ...

November 20, 2021 · 2 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中全局事件总线GlobalEventBus原理及探究过程

前言上一篇文章写了 Vue 中的自定义事件,自定义事件是全局事件总线根底。我在上一篇文章中埋下了一个小小的伏笔。如下图: 我说过,在Vue中如果咱们用(@orv-on )给组件绑定上一个自定义事件,其本质就是给子组件VueComponent即vc绑定一个事件,而后子组件通过this.$emit()触发,父组件监听到再执行回调办法。这种也只适宜于父子组件之间通信,对于兄弟组件来说,依然无奈十分不便的通信。 那全局事件总线是什么样的呢? 一、全局事件总线前述提供一个思考方向: 其余组件同样如此。 那么到这一步,咱们要明确一件事件哈,全局事件总线,全局两个字,意思是在全局都可能拜访到。并且可能绑定办法呢? 即xxxx中保障要可能有$on、$off、$emit这些办法,才可能实现组件间通信。 那么只有哪里有?? 咱们之前给子组件绑定自定义事件的时候,其本质是不是给子组件的实例对象new VueComponent绑定上一个自定义事件。 在这个全局事件总线中,咱们就不能再给每个组件的实例对象来绑定自定义事件了,而是要将自定义事件绑定到一个全副组件都可能拜访的对象上。 那么那个对象大家都可能拜访?看下图吧。 ---图:来自于尚硅谷-张天宇老师 咱们将它放在vue原型上,那么全局事件总线就可能做到任意间组件通信拉。 二、装置全局事件总线咱们弄明确要去找谁了,就要将它定义进去,不然怎么用啊。 规范定义如下: import Vue from 'vue'import App from './App.vue'Vue.config.productionTip = false// 对于全局总线的应用阐明// 应用全局总线的时候,更好的利用是在兄弟组件、祖孙组件之间,这些组件他们并不能做到间接通信,这个应用全局事件总线会不便很多new Vue({ render: h => h(App), // beforeCreate 位于数据挂载之前的生命周期函数 beforeCreate () { // 装置全局事件总线 $bus就是以后利用的vm 这里的this就是以后的new Vue() Vue.prototype.$bus = this }}).$mount('#app')beforCreate()办法 是泛滥生命周期中最后面的一个。在此时,它的this就是以后的vue. 三、应用全局事件总线1、接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件本身。即是图示中的第一步。 // 回车减少一个todoaddTodo (todo) { this.todos.unshift(todo)}, // 判断勾选不勾选 checkTodo (id) { this.todos.forEach((todo) => { if (todo.id === id) todo.done = !todo.done }) }, // 删除一个todo deleteTodo (id) { this.todos = this.todos.filter(todo => todo.id !== id) }, // 全选全不选 checkAllTodos (done) { this.todos.forEach((todo) => { todo.done = done }) }, // 革除所有已实现的工作 clearDoneTodos () { this.todos = this.todos.filter(todo => !todo.done) }}, // 在加载实现后就进行全局总线的绑定 mounted () { this.$bus.$on('addTodo', this.addTodo) this.$bus.$on('checkTodo', this.checkTodo) this.$bus.$on('deleteTodo', this.deleteTodo) },2、提供数据:this.$bus.$emit('xxxx',数据) ...

November 20, 2021 · 1 min · jiezi

关于vue.js:前端遇到的那些技术难点

挪动端兼容css篇挪动端的 1px问题形容:1px 的边框。在高清屏下,挪动端的 1px 会很粗。 产生起因:首先先要理解一个概念:DPR(devicePixelRatio) 设施像素比,它是默认缩放为 100%的状况下,设施像素和 CSS 逻辑像素的比值。目前支流的屏幕 DPR=2 或者 3。CSS中设置的px是逻辑像素,这就造成1px变成物理像素的2px或者3px,比方2 倍屏,设施的物理像素要实现 1 像素,所以 CSS 逻辑像素只能是 0.5px。 上面介绍最罕用的办法 通过CSS :before 选择器或CSS :after 选择器设置height:1px,同时缩放0.5倍实现。 / 底边框 /.b-border { position: relative;}.b-border:before { content: ''; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px; background: #d9d9d9; -webkit-transform: scaleY(0.5); transform: scaleY(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0;} / 四条边 /.setBorderAll { position: relative; &:after { content: ' ';position: absolute;top: 0;left: 0;width: 200%;height: 200%;transform: scale(0.5);transform-origin: left top;box-sizing: border-box;border: 1px solid #e5e5e5;border-radius: 4px;}}复制代码CSS动画页面闪白,动画卡顿问题形容:CSS动画页面闪白,动画卡顿 ...

November 19, 2021 · 2 min · jiezi

关于vue.js:vuecli打包npm组件关键点记录

首先创立我的项目vue create 我的项目名(vue init 是老版本) 而后把目录整顿成如下examples是为了本地测试packages外面寄存开发的组件 而后整顿package.json 在npm命令行有了入口文件就不必再在vue.config.js上定义入口文件了 附上vue.config.js配置计划 vue cli官网形容构建库 留神点:css须要合并一起打包的话,须要在vue.config.js减少配置: css: { extract: false }, packages/index.js内容// 导入封装的组件import fontChange from './components/font-change'import Mt1 from './components/mt1'const components = [Mt1,fontChange]const install = function (Vue) { // 遍历注册所有的组件 components.map(com=>{ Vue.component(com.name,com) })}// 留神这里的判断,很重要if(typeof windwo !== 'undefined' && window.Vue) { install(window.Vue)}// 导出组件库export default { install, // 组件列表 ...components,}留神点:组件代码必须定义name,以供index.js 调用 npm公布npm login 先登录 设置好版本号之后就能够 npm publish 如果登陆了依然报错: You must sign up for private packages npm ...

November 19, 2021 · 1 min · jiezi

关于vue.js:input-change-blur-区别

总结下el-input 中事件@input 与@change 的不同: @input 是当值输出时就触发; 而@change 是当值变动且失去焦点时触发通@blur, 只是回调的参数不一样看代码 <el-input id="testId" v-model="test.testId" @input="handleInput" @blur="handleBlur" @change="handleChange" > </el-input> handleBlur(event){ console.log("blur=", event.target.id) console.log("blur value=", this.test[event.target.id]) }, handleInput(val){ console.log("input=", val) }, handleChange(val){ console.log("change=", val) },后果 input= ainput= abinput= abcchange= abcblur= testIdblur value= abc

November 19, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中组件绑定自定义事件实现通信

黄昏的月亮 前言本来这篇打算写Vue中的那个全局事件总线的原理,然而发现自己少写了这个自定义事件,不讲明确这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉。 一、v-on指令要讲自定义事件,就得先说说v-on指令。因为v-on就是实现自定义事件的根底。 v-on官网文档 根本介绍v-on指令能够缩写为@,并且咱们应用v-on指令时,其实它有一个默认参数event. 能够和它一起搭配的修饰符大抵有以下几种: .stop - 调用 event.stopPropagation()。 进行冒泡.prevent - 调用 event.preventDefault()。 阻止默认行为.capture - 增加事件侦听器时应用 capture 模式。.self - 只当事件是从侦听器绑定的元素自身触发时才触发回调。.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。 键修饰符,键别名.native - 监听组件根元素的原生事件。.once - 只触发一次回调。.left - (2.2.0) 只当点击鼠标左键时触发。.right - (2.2.0) 只当点击鼠标右键时触发。.middle - (2.2.0) 只当点击鼠标中键时触发。.passive - (2.3.0) 以 { passive: true } 模式增加侦听器这些修饰符局部是能够串联起来应用的。 作用:绑定事件监听器。事件类型由参数指定。表达式能够是一个办法的名字或一个内联语句,如果没有修饰符也能够省略。用在一般元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也能够监听子组件触发的自定义事件。 明天第二点才是咱们滴重点哈。 示例:<!-- 办法处理器 --><button v-on:click="doThis"></button><!-- 动静事件 (2.6.0+) --><button v-on:[event]="doThis"></button><!-- 内联语句 --><button v-on:click="doThat('hello', $event)"></button><!-- 缩写 --><button @click="doThis"></button><!-- 动静事件缩写 (2.6.0+) --><button @[event]="doThis"></button><!-- 进行冒泡 --><button @click.stop="doThis"></button><!-- 阻止默认行为 --><button @click.prevent="doThis"></button><!-- 阻止默认行为,没有表达式 --><form @submit.prevent></form><!-- 串联修饰符 --><button @click.stop.prevent="doThis"></button><!-- 键修饰符,键别名 --><input @keyup.enter="onEnter"><!-- 键修饰符,键代码 --><input @keyup.13="onEnter"><!-- 点击回调只会触发一次 --><button v-on:click.once="doThis"></button><!-- 对象语法 (2.4.0+) --><button v-on="{ mousedown: doThis, mouseup: doThat }"></button>在子组件上监听自定义事件 (当子组件触发“my-event”时将调用事件处理器): ...

November 19, 2021 · 2 min · jiezi

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

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

November 18, 2021 · 1 min · jiezi

关于vue.js:vuecliservice源码分析

1. vue-cli-service 解决什么问题?依据官网文档的形容,vue-cli-service 是 vue-cli 的运行时依赖。它能够: 基于webpack构建,内置了正当的默认配置;能够通过配置文件进行配置webpack;能够通过插件扩大 vue-cli-service 的命令2. 带着问题看源码vue-cli-service 次要流程是怎么的?vue-cli-service 帮咱们预设了正当的webpack配置,也反对咱们在 vue.config.js 里批改webpack配置,是如何做到webpack配置的缝合的?vue-cli-service serve 和 vue-cli-service build 做了什么?如何注册一个新的命令?3. vue-cli-service 次要流程是怎么的?3.0 目录构造├─lib| ├─options.js| ├─PluginAPI.js| ├─Service.js| ├─commands| | ├─help.js| | ├─inspect.js| | ├─serve.js| | ├─build| | | ├─demo-lib-js.html| | | ├─demo-lib.html| | | ├─demo-wc.html| | | ├─entry-lib-no-default.js| | | ├─entry-lib.js| | | ├─entry-wc.js| | | ├─formatStats.js| | | ├─index.js| | | ├─resolveAppConfig.js| | | ├─resolveLibConfig.js| | | ├─resolveWcConfig.js| | | ├─resolveWcEntry.js| | | └setPublicPath.js├─bin| └vue-cli-service.js留神:这里只展现了局部目录和文件,为了直观显示本文须要讲述的文件以及所在的目录。 ...

November 18, 2021 · 16 min · jiezi

关于vue.js:使用vhtml造成的问题

1 失常应用v-htmlexport default { data() { return { msg: '<div>这是一个期待渲染的html</div>' } }, } <div v-html="msg"></div> 渲染的后果是: 这是一个期待渲染的html 2. 非凡的数据export default { data() { return { msg: '<div>这是一段文本<w56656565465</div>' } }, } <div v-html="msg"></div> 你们是不是认为后果是:这是一段文本<w56656565465 然而事实是: 这是一段文本 3. 论断咱们在返回的数据不确定的状况下,要将返回数据做下本义,防止数据渲染出错同时也避免xss攻打

November 17, 2021 · 1 min · jiezi

关于vue.js:vue项目下载文件重命名监测进度

摘要:当后盾返回一个文件地址给前端,须要前端下载并重命名,展现下载进度。应用技术:ajax、blob、vue插件file-saver 1、插件咱们不做过多解释,咱们这里只是应用,这是插件教程地址:http://vuejscomponent.com/pac... 2、我的项目代码import FileSaver from 'file-saver'// URL:文件寄存地址,fileName:保留文件名称,downloadType:保留文件格式const singleFileDownload = (url, fileName, downloadType) => { return new Promise((resolve, reject) => { if (!url || !fileName) { reject('文件不存在') return } var xhr = new XMLHttpRequest() xhr.open('GET', url, true) xhr.responseType = 'blob' xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200 || xhr.status === 0) { let file = null if (downloadType === 'pdf') { file = new Blob([xhr.response], { type: "application/pdf" }); } else { file = new Blob([xhr.response], { type: "application/zip" }); } FileSaver.saveAs(file, fileName) resolve('下载胜利') } else { reject(new Error(fileName + '下载失败'), null) } } } xhr.addEventListener('progress', (e) => { // e.total就是文件的总字节 e.loaded就是文件已加载了多少字节了 // downloadFile.progress = (e.loaded * 1.0 / e.total * 100).toFixed(2) + '%' // downloadFile.progress = (e.loaded / (1024 * 1024)).toFixed(2) + 'M/' + (e.total / (1024 * 1024)).toFixed(2) + 'M' }) xhr.send() })}

November 17, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中利用全局事件总线实现组件之间通信

月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了。 前言前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种形式是最简略也是最根底的组件之间的通信形式。父组件通过 props 向下传数据给子组件,当子组件有事件通知父组件时会通过$emit事件通知父组件。对于父子组件,这种传递形式,是较为不便且实用的,然而对于祖孙组件或者兄弟组件,就显得不那么友善了。 在Vue自身的生态中,也有一个独立的Vuex库用来解决组件之间的通信,但很多时候,咱们并不需要动用相似Vuex这种大杀招,而能够思考更简略的 Vue 中的事件总线,即EventBus。 在这提出一个简略的思考: 一旦当你看到我的项目中,某段代码或者是要点很多下能力进去的变量,再或者获取到的形式都雷同,这个时候你就肯定要思考能不能让代码达到复用,咱们要学会偷懒哈,偷懒能力后退的更快哈. 上面开始明天的注释哈... 一、什么叫全局事件总线1.1、概念的引入咱们先认清一件事件,所谓的组件之间的交互,就是咱们将数据可能做到组件之间可能共享数据。 无论是props、EventBus、Vuex、公布订阅等实现组件交互,实质就是做到数据共享。弄清这一点,对于应用全局事件总线,就简略多了哈。不过明天的文章,次要是先带着大家应用,原理等周末拉。 EventBus 又称为事件总线。在Vue中能够应用 EventBus 来作为沟通桥梁的概念,就像是所有组件共用雷同的事件核心,能够向该核心注册发送事件或接管事件,所以组件都能够高低平行地告诉其余组件,但也就是太不便所以若应用不慎,就会造成难以保护的劫难,因而才须要更欠缺的Vuex作为状态管理中心,将告诉的概念回升到共享状态档次。 1.2、装置全局事件总线//想要成为事件总线的条件://1、所有的组件对象必须都能看失去这个总线对象,因而咱们把这个对象放在了Vue原型//2、这个事件总线对象必须能调用$on和$emit办法(总线对象必须是Vue的实例化对象或者是组件对象)确定全局事件总线: 将vm对象作为事件总线挂载到vue的原型对象上 import Vue from 'vue'import App from './App.vue'Vue.config.productionTip = false// 对于全局总线的应用阐明// 应用全局总线的时候,更好的利用是在兄弟组件、祖孙组件之间,这些组件他们并不能做到间接通信,这个应用全局事件总线会不便很多new Vue({ render: h => h(App), // beforeCreate 位于数据挂载之前的生命周期函数 beforeCreate () { // 装置全局事件总线 Vue.prototype.$bus = this }}).$mount('#app')1.3、根本应用小案例: 在App组件内引入一个demo组件,demo组件中有一个按钮,点击能够批改app组件传给子组件的值,并更新视图。 App组件 <template> <div class="todo-container"> //数据的传递,还是用props快哈 <Demo :msg="msg"></Demo> </div></template><script>import Demo from './components/Demo'export default { components: { Demo }, data () { return { msg: 'hello,你好' } }, methods: { updateMsg () { this.msg = 'hello,你好丫,我是博主宁在春' }, updateMsg2 (value) { this.msg = value } }, // 在加载实现后就进行全局总线的绑定 mounted () { // 绑定办法,'updateMsg'是全局事件总线办法名,而前面是回调时须要执行的办法 this.$bus.$on('updateMsg', this.updateMsg) this.$bus.$on('updateMsg2', this.updateMsg2) }, // 养成习惯 在组件销毁的时候,将事件进行解绑 beforeDestroy () { //就是解绑事件,有多种形式,参数为空,间接是让所有办法解绑 //多个的时候,能够间接放一个数组进去。 // this.$bus.$off(['updateMsg',....]) this.$bus.$off('updateMsg') this.$bus.$off('updateMsg2') // 原理就让我留到下次吧,兄弟们 }}</script>demo组件 ...

November 17, 2021 · 1 min · jiezi

关于vue.js:Vue项目优化打包前端加分项

前言Vue我的项目开发结束后,对我的项目进行打包公布之前,必不可少的操作就是我的项目优化,这也是程序猿的加分项。追随本文的脚步来看看如何对我的项目进行优化吧~ 一、路由懒加载 为什么须要路由懒加载当刚运行我的项目的时候,发现刚进入页面,就将所有的js文件和css文件加载了进来,这一过程非常的耗费工夫。 如果关上哪个页面就对应的加载响应页面的js文件和css文件,那么页面加载速度会大大晋升。如何实现路由懒加载vue官网文档:路由懒加载 代码如下(示例):{ path: '/login', component: () => import('@/views/login/index'), hidden: true },复制代码路由懒加载中的魔法正文通过在正文中指定webpackChunkName,能够自定义这个文件的名字。 代码如下(示例):components = () => import(/* webpackChunkName:"login"*/ "../component/Login.vue")复制代码二、剖析包大小 需要想要晓得打包生成的文件中,每个文件所占的空间大小。以便于咱们剖析,对代码进行优化解决。如何生成打包剖析文件终端中运行 npm run preview -- --report, 这个命令会从咱们的入口main.js进行依赖剖析,剖析出各个包的大小。最终会在生成的dist文件夹下生成一个report.html的文件,关上后就能够看到咱们在我的项目应用文件占据的空间大小啦~(效果图如下:) 三、webpack配置排除打包 需要将一些不罕用的包,排除在生成的打包文件以外。 例如:上图所示的xsxl.js 、 element.js,能够将其排除在打包生成的文件以外排除打包找到 vue.config.js, 增加 externals 项,具体如下:代码如下(示例): configureWebpack: { // 配置单页应用程序的页面的题目 name: name, externals: { /** * externals 对象属性解析。 * 根本格局: * '包名' : '在我的项目中引入的名字' * */ 'vue': 'Vue', 'element-ui': 'ElementUI', 'xlsx': 'XLSX' }, resolve: { alias: { '@': resolve('src') } }}复制代码四、 援用网络资源 ...

November 16, 2021 · 2 min · jiezi

关于vue.js:Vue项目发布到springboot中的系列配置

一、配置vue打包参数假如springboot的context-path为/ ,即根门路,那么我须要为动态资源分配一个路由,这里以pages为例,前端vue.config.js配置如下: publicPath: '/pages/', outputDir: 'dist', assetsDir: 'static',二、springboot系列配置与解决将context-path配置为根门路/,并设置shiro等权限框架对pages权限拦挡的疏忽,基于diboot低代码开发平台的我的项目配置如下: server.servlet.context-path=/diboot.iam.anon-urls=/pages/**将前端打包好的dist中的文件夹和文件都放到 springboot我的项目的 resource/static/pages 目录下,如下:拜访 localhsot:8080/pages/index.html 即可胜利三、拜访门路优化:上述计划每次必须拜访pages的路由才能够拜访到,那么咱们是否能够重定向到这里呢,是能够的。 增加以下controller代码,可从根门路主动重定向到上述门路: @RestControllerpublic class RootRedirectController { @GetMapping("/") public void redirect(HttpServletResponse response) throws Exception { response.sendRedirect("/pages/index.html"); }}增加权限框架对根门路疏忽权限查看,基于diboot低代码开发平台的我的项目配置如下: diboot.iam.anon-urls=/,/pages/**diboot 简略高效的低代码开发框架

November 16, 2021 · 1 min · jiezi

关于vue.js:分布式网链创业经济体建设者招募

咱们由谁组成?咱们是一个由技术开发者、产品设计师、创业者、大学生、跨学科探索者独特组成的分布式网链守业经济体 - Comunion 咱们为什么聚在一起?在这个人工智能与自动化正在逐步剥夺人类就业机会的年代,咱们看到到本人靠无休止的内卷保留本人工作机会的辛酸,咱们看到守业追梦者在巨头的碾压下对事实躺平的无奈,咱们看到传统从业者对如何在数字社会生存的徘徊……咱们心愿可能借由涌现的力量像网一样链接在一起,独特建设属于每一位平庸创新者的守业经济体 在这个经济体的建设过程中,咱们致力于解决以下问题: 晋升劳动者收益突破巨头垄断升高守业门槛升高贫富差距突破阶层固化咱们在做什么事件?1.咱们在发明下一代组织模式与守业互助网络2.咱们在开发面向数字时代的全新商业基础设施3.咱们在摸索可能高效产出生产力的分布式组织模式 咱们产品的个性是?1.去中心化的组织与经营模式 2.价值导向的人才交易网络与结算形式 3.劳动价值与资本价值量价统一 4.从新定义组织募资形式 5.社群共治,人才多节点连贯 咱们的现状?组织构造相似于分布式基金会构造,最高治理机构为治理委员会,下设三个治理委员会:成员治理委员会、开发治理委员会和网链基金会,别离对应人、钱、事 产品研发目前已在以太坊 Goerli 测试网顺利运行,目前正在从易用性、视觉、平安等角度进行全面降级,预计最晚将于明年五月一日正式登录以太坊主网 组织成员目前大多利用空闲工作工夫进行经济体建设,多数核心成员已开始全职建设;成员散布区域有北京、上海、河北、南京、武汉、成都、杭州、阿布扎比、尼日利亚等;目前次要经济体建设成员49人,直接参与产品开发成员15人 咱们想要邀请哪些成员退出?因为近程业余开发的特色,咱们尽可能利用近程合作工具(如Taiga、语雀、Github等)进行离线的合作,缩小对于各位成员生存的侵入,所以对于各位小伙伴的自律性有肯定的要求 基于咱们对本身画像的形容,咱们心愿退出咱们的成员可能:有极强的工夫观点;有极强的自我管理能力;有被动学习的意识;有极客般的工作能力;有更强的团队合作意识;有极强的责任感;有扭转本人的信心;有成为超级个体的信念 咱们心愿成员领有哪些技能?1.资深的 Golang 后端工程师2.成熟的 Vue 前端工程师3.成熟的 Solidity 智能合约工程师4.产品经理5.UI/UE 设计师6.社群、媒体经营师7.组织建设师8.其余违心独特建设的小伙伴 退出咱们可能失去什么?有形资产:咱们会把所有工作拆成若干个绝对独立的工作,在工作开始之前,依据工作工作量进行绝对主观的评估,并标定与之绝对应的团队倒退权利报酬。当工作实现的时候,咱们会依照这个报酬金额进行领取。同时咱们设计了团队倒退权利与产品自身的价值绑定机制,当前经济体成长的同时团队倒退权利的价值也会增长。团队倒退权利可在产品主网上线后与法币进行兑换(目前不反对法币结算) 无形资产:整个团队由独特的愿景凝聚在一起,经验了三年的倒退,团队成员整体信任度很高,咱们也在合作的过程中摸索出一套实用于网状分布式组织大规模合作的生产力实践和工具。咱们衷心的心愿每一位成员可能学到这套体系的精华,在疫情常态化和分布式办公比重减少的趋势下,积攒更多面向未来的合作技能。更心愿每一位成员可能利用团队中的优质人脉,在咱们独特构建的守业范式之下开启本人的事业,实现本人的人生价值 理解更多:官网:https://comunion.org/Wiki:https://wiki.comunion.io/BBS: https://bbs.comunion.io/ 联系方式:微信:QianChen_2020邮箱: chen.qian@comunion.org

November 15, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue中Props配合自定义方法实现组件间的通信

前言废话: 上篇文章写了对于Vue 中的 propsprops,讲述了概念、根本应用及留神点,在这篇文章中,咱们也会用到 props和办法来让组件之间实现通信。 正题: 组件是Vue中十分重要的一个概念,也是模块化开发的根底。在应用vue的开发过程中,每个页面就是由多个不同的组件组合而成的。如下图: 既然有多个组件,就必须要做到数据的动态性,也要可能使多个组件之间可能通信。 组件之间的通信无疑是上面几种: 父子组件之间通信祖孙组件之间通信(蕴含隔多代)兄弟组件之间通信本文大抵举出案例的有 props配合办法回调实现组件通信props进行数据传递,自定义事件实现组件通信我目前只学了这些哈,继续更新中,莫慌哈。 一、props配合办法回调实现组件通信咱们先初始化一个我的项目,之后的操作也都在这根底上进行操作,源码及相干我的项目代码都在文末仓库中。 删除些没用的,保留这些就够了。 需要:咱们须要在 HelloWorld组件中削减一个按钮,点击之后可能批改父组件传过来的值,并展现进去。 理一下思路: 首先咱们不可能间接在子组件对值进行更改,这是vue所不容许的。那么咱们实在的更改值的办法应该写在父组件中。最初只有做到点击子组件按钮,可能调用到父组件的批改办法就算胜利拉。那么第一步,咱们先在父组件中定义一个批改msg值的办法。 methods: { updateMsg () { this.msg = '大家好,我是博主宁在春' }}定义好之后,咱们该如何传递给子组件呢?从而让子组件可能调用到这个办法呢? 通过Props,在子组件中 prop是能够接管函数类型的。 那么咱们就能够把咱们的函数传递给子组件。 <!-- :msg 是传递给子组件的值 子组件在props 中写什么名称,这里就写什么名称"msg" 是咱们本人定义的变量办法同样如此--><HelloWorld :msg="msg" :updateMsg="updateMsg"/>在这里写了之后,咱们还须要去子组件中接管一下: 这样只算是接管实现了,最初要做的就是触发他拉。咱们给按钮绑定个点击事件就能够了。 <button @click="updateMsg">点击批改msg的值</button> 这样子其实也是能够实现的。 然而这样局限性太大,咱们平时都是要传值的,那样才算通信丫,咱们略微更改下。 在app组件中,咱们将要接管一个值。 methods: { updateMsg (value) { this.msg = value }}在子组件中更改如下图:也能够实现同样的成果 上述是实现父子组件之间通信,那么如果是兄弟组件呢?子孙组件呢?该如何呢? 因为代码非常简单,我不再反复操作了,做了几张图,帮忙大家了解。 二、props搭配自定义事件实现组件通信本文只是简略搭配应用下,并没有细讲自定义事件哈。有需要可看官网文档 说起来,这个props搭配自定义事件实现组件通信,要改变的中央蛮小哈。 1、第一步:把App组件中的绑定的办法名前的引号,改为@符号哈。 <HelloWorld :msg="msg" @updateMsg="updateMsg"/>2、第二步:子组件也不必再在props中进行接管,另外调用父组件的形式也有一点变动。 如此也是能够实现跟第一种形式同样的成果的。 如果是父子组件,这种形式我感觉十分不便,不必再借助props来进行接管,可间接进行绑定。 ...

November 14, 2021 · 1 min · jiezi

关于vue.js:基于Vue3最新标准实现后台前端综合解决方案mkw

download:基于Vue3最新规范,实现后盾前端综合解决方案import org.json.JSONArray;import android.app.Activity;import android.app.AlertDialog;import android.content.ActivityNotFoundException;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import com.phonegap.api.PhonegapActivity;import com.phonegap.api.Plugin;import com.phonegap.api.PluginResult;public class PluginTest extends Plugin { 在HTML文件中调用方法在html文件中引入phonegap和插件的js文件,调用方法 复制代码 <html> <head><meta charset="utf-8"><title>JAVA传参</title><script src="phonegap.js"></script> phonegap包--><script src="js/jquery.js"></script><script src="simplePlugin.js"></script>自定义的插件文件--><script> $(document).ready(function(e) { $("#btn_test").click(function(){ window.plugins.simplePlugin.hello( function(result) { alert("返回的第一个参数:"+result.str1+"返回的第二个参数"+result.str2); }, function(error) { }, "第一个参数", "第二个参数" ); });});</script></head><body><button type="button" id="btn_test">Click Me!</button></body></html>复制代码

November 13, 2021 · 1 min · jiezi

关于vue.js:后端小伙伴来学前端了关于-Vue中的-props

校园的朝霞 前言学vue必须要会的就是组件这玩意啦,不然可能就约等于白学。 我本人后期实现老师安排的工作,不瞒你说,交上去,间接被骂,起因就是我一个组件没抽(一边学,一边敲,没想那么多,只想着实现)。 一个小小页面,1163行(捂脸)。 而后就下定决心来好好整vue组件,其实我感觉还蛮好玩的。接下来就让咱们看看组件必会的 props 理解这个之前肯定得懂点组件根底哈。 介绍vue.js文档在props这节真就是间接上手,把我当大佬 组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内间接援用父组件的数据。父组件的数据须要通过 prop 能力下发到子组件中。也就是说props是子组件拜访父组件数据的惟一接口。即咱们想要动静的传递数据给子组件的话,子组件中必须有props才行。 如果子组件想要渲染父组件的元素,那么就必须要在prop中申明一个变量才行,这个变量就能够援用父元素的数据,而后就能够进行渲染。 根本用法咱们写了一个小组件demo,而后在App中援用 <template> <div> <p>子组件demo</p> <h1>{{message}}</h1> </div></template><script>export default { props: ['message'] }</script>App里的 <template> <div class="todo-container"> <Demo ></Demo> </div></template><script>import Demo from './components/Demo'export default { components: { Demo }}</script>初始化成果 那行<h1>{{message}}</h1>并没有展现进去。 子组件尽管曾经接管,然而咱们要如何在App组件中传值勒? <!-- :message 对应的是子组件 prop 中接管变量的名称"message" 对应的父组件中data中定义的数据--><Demo :message="message"></Demo>data () { return { message: 'hello' }}接下来咱们再看看子组件有没有被渲染 曾经是渲染胜利啦。 另外在子组件接管props时,我上述的形式是最简略的,实践上接管时该当指定类型,因为JavaScript是一门弱语言。 props: { title: String, likes: Number, isPublished: Boolean, commentIds: Array, author: Object, callback: Function, contactsPromise: Promise // or any other constructor}这就是最根本的父组件传递给子组件数据的形式啦。 ...

November 13, 2021 · 1 min · jiezi

关于vue.js:vue脚手架安装流程

webpack本人配置环境繁琐 官网提供脚手架, 疾速搭建我的项目根底构造 概念脚手架是为了保障各施工过程顺利进行而搭设的工作平台 在代码里的体现, 就是一套固定规范的, 文件夹+文件+webpack配置益处开箱即用0配置webpackbabel反对css, less反对开发服务器反对筹备装置@vue/cli全局模块包, 失去Vue命令, 当前创立Vue脚手架我的项目步骤全局装置@vue/cli模块包yarn global add @vue/cli# ORnpm install -g @vue/cli留神: 如果半天没动静(95%都是网速问题), 能够ctrl c 进行从新来换一个网持续重来查看Vue命令版本vue -V总结: 如果呈现版本号就装置胜利, 否则失败脚手架-创立我的项目-启动服务用Vue命令, 创立一个脚手架我的项目, 并启动webpack开发服务器 步骤创立我的项目 ==留神: 我的项目名不能带大写字母, 中文和特殊符号== # vue和create是命令, vuecli-demo是本人的文件夹名vue create vuecli-demo抉择模板 ==能够高低箭头抉择, 回车确定, 默认第二条,间接回车,弄错了ctrl+c从第1步来 抉择包管理器! User Yarn期待下载脚手架我的项目, 须要的依赖包(此过程会有些漫长...)终端切换脚手架我的项目下, 启动内置的==webpack热更新开发服务器==cd vuecil-demoyarn serve# 或 npm run serve绿色进度条显示胜利!

November 13, 2021 · 1 min · jiezi

关于vue.js:基于Vue3最新标准实现后台前端综合解决方案MK

download:基于Vue3最新规范,实现后盾前端综合解决方案public class Demo03{ int age;public static void main(String []args){ System.out.println(Demo04.name);//动态调用动态1 Demo04.eat(); Demo04 d = new Demo04();//动态调用动态2 System.out.println(d.name); d.eat(); Demo03 d1 = new Demo03();//动态调用非动态 d1.method(); System.out.println(d1.age);}public void method(){ System.out.println("first method");}}复制代码复制代码1 public class Demo04{2 static String name = "张三";3 4 public static void eat(){5 System.out.println("肉夹馍");6 }7 }复制代码复制代码 1 public class Demo05{ 2 static int age; 3 String name; 4 public static void main(String []args){ 5 6 Demo05 d1 = new Demo05();//动态调非动态 实例化 7 d1.method(); 8 } 9 10 public void method(){11 System.out.println(age); //非动态调动态 12 method1(); //非动态调动态 13 System.out.println(name);//非动态调非动态 14 method2(); //非动态调非动态 15 System.out.println("first method");16 }17 public static void method1(){18 System.out.println("second method");19 }20 public void method2(){21 System.out.println("third method");22 }23 }复制代码复制代码 1 public class Demo06{ 2 3 public static void main(String []args){ 4 5 Demo06 d1 = new Demo06(); //动态调非动态 实例化 6 d1.method(); 7 } 8 public void method(){ 9 System.out.println(Person.name); //非动态调动态10 Person.method1(); //非动态调动态11 Person p = new Person(); //非动态调非动态 实例化12 p.method2();13 System.out.println("first method");14 }15 }16 class Person{17 static String name;18 int age;19 public static void method1(){20 System.out.println("second method");21 }22 public void method2(){23 System.out.println("third method");24 }25 }复制代码复制代码 1 public class Demo09{ 2 //实参到形参是单向的,所以在传送过程中形参值发生改变不会影响实参 3 public static void main(String []args){ 4 int i =1; 5 String s = "ww"; 6 Demo09 d = new Demo09(); 7 d.method(i,s); 8 System.out.println(i); 9 System.out.println(s);10 }11 public void method(int i,String s){12 i = 100;13 s = "asd";14 }15 public void method116 }复制代码复制代码public class ChuanDiZhi{ ...

November 13, 2021 · 2 min · jiezi

关于vue.js:后端小伙伴来学前端了Vue脚手架中-render-函数

前言上一篇文章写了:「后端小伙伴来学前端了」剖析Vue脚手架构造 简略阐明了Vue的脚手架构造,然而上篇文章还欠了个小点没有说完,就在这篇文章中补齐。就是所谓的render函数。 一、main.js中引入的原来是完好版vue.js咱们来接着看看main.js这个入口文件。 // 引入vueimport Vue from 'vue'// 引入app组件import App from './App.vue'// 敞开生产提醒Vue.config.productionTip = false// 创立 Vue 实例对象 Vmnew Vue({ render: h => h(App) // 这里不是一下就能说完的,这里简略说下: // App 组件渲染,这里的 h 即是 vm.$createElement ,便是在vm.render这个阶段 // 最粗略的了解,执行完这里,就是将app 放入了 容器中去了。}).$mount('#app')// Vue 的$mount()为手动挂载 这个也不是一下能说清,我也学艺不精,当前再补上 哈哈这个代码,我想咱们只有创立过vue我的项目,大家必定都写过了哈。 然而不晓得大家有没有纠结过或者思考过new Vue() 中的 render:h=>h(App)是干什么。 (我是纯属刚学,好奇宝宝) 依照咱们最开始的学习: 上面这种写法也是可行的吧,组件咱们引入了,也注册了。 import Vue from 'vue'import App from './App.vue'Vue.config.productionTip = falsenew Vue({ template:'<App></App>' components:{App}}).$mount('#app')看页面: 页面上是空白的,而后有以下报错信息: //报错vue.runtime.esm.js?2b0e:619 [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available.//提醒的解决形式Either pre-compile the templates into render functions, or use the compiler-included build.(found in <Root>)这里的报错意思:您正在应用仅运行时版本的Vue ...

November 13, 2021 · 1 min · jiezi

关于vue.js:vue自定义指令使用以仿写vshow和实现vcopy为例讲解

vue自定义指令产生的背景咱们晓得前端程序员,写的各种代码,最终是要作用于页面上的DOM元素的。比方用HTML固定好DOM的根底构造,用CSS设置DOM的款式,用JS去做一些DOM的交互。因为DOM元素相当于“物理层”,要出现给用户看的。DOM相当于积木一样,咱们去操作这个积木,最终“搭建”成各式各样的成果进去。 所以所有花里胡哨的前端框架都是,基于前端三件套HTML、CSS、JS封装进去的所以jQuery中就通过$符,间接操作DOM就挺不便的,不便是不便了,然而间接操作DOM会引起页面的回流重绘,又会略为有点节约浏览器的性能,容易呈现页面卡顿的状况,造成用户体验不太好。 万事皆有利弊,间接操作DOM,有时候,也可能,会是一个简略方便快捷的抉择。所以vue和react就闪亮退场了,用数据驱动的思维,并不是间接操作DOM,通过虚构DOM做一个缓冲,虚构DOM会收集谁须要操作DOM,操作了DOM的哪些货色,对立先记录好,最终全副一块操作DOM。有点像js文档碎片的感觉。这样的话,浏览器性能就会优化晋升不少。所以,vue中并不提倡间接操作DOM,因为有虚构DOM在呢,你还间接操作实在DOM干啥啊。用vue指令啊 虚构DOM的确是个好货色,给大佬点赞。咱们晓得vue提供的内置指令很不便,能解决大多数的DOM操作问题,然而,并不能解决所有的问题。所以某些状况下,vue内置指令不能满足咱们的需要,咋办呢。当然Vue创始人也想到了这个问题,所以,就搞了vue自定义指令,封装了一套钩子函数和对应参数的规定、以供咱们应用去,从而更不便解决相应问题 vue自定义指令就是间接操作DOM了,某些场景下,vue自定义指令是一个很好的抉择vue自定义指令的分类vue自定义指令有两种 1. 全局自定义指令(须要全局注册)2. 组件自定义指令(须要组件外部注册)自定义指令其实就是一个对象,对象身上有一些钩子函数,自定义指令对象身上的钩子函数和vue组件的生命周期钩子函数相似,后续会通过案例论述 个别应用全局自定义指令会多一些,毕竟复用不便 vue自定义指令应用解说案例一 el-input初始获取焦点(组件自定义指令 )这个案例其实官网的案例,这里咱们批改一下,更加便于咱们了解之。 假如咱们须要这样一个成果:页面加载结束当前,el-input输入框主动获取焦点,相似关上百度一下页面当前,输入框主动获取焦点一样。 <template> <div> <!-- 将指令挂在元素上 --> <el-input v-myFocus></el-input> </div></template><script>export default { name:"myCode" // 本例是部分自定义指令,所以directives写在组件外部 directives: { // 给指令起个名字,叫做myFocus myFocus: { inserted: function (el) { // inserted钩子是这个元素行将插入到文档里的时候,具体程序是在created后、mounted前。可看打印程序 // el参数是:自定义写在谁身上,挂在那个DOM元素上,这个el就是那个dom元素对象,钩子函数还有别的参数,这个后续会说 console.log("自定义指令-->", el.childNodes); // 先让元素聚焦 el-input是在原生input外包了一层,所以须要通过原生js取子元素,找到input,具体看一下打印后果就分明了 el.childNodes[1].focus(); // 执行原生input的focus办法 }, }, }, created() { console.log("created-->") }, mounted() { console.log("mounted-->") }}</script>演示的话,间接复制粘贴代码即可案例二 仿写v-show性能(全局自定义指令)效果图如下 看了效果图,性能其实和v-show没啥区别,举这样一个例子是不便更加好了解vue自定义指令 第一步,新建utils文件夹中寄存index.js文件,此文件用于书写全局自定义指令// 引入vue并应用vue的directive办法去注册一个自定义指令import Vue from 'vue'Vue.directive('showshow', { // 指令的名字叫做showshow // bind函数个别用来做初始化数据,也能够绑定事件什么的 bind(el, binding, vnode) { console.log(el, binding.value, vnode); // el参数是以后应用指令的元素,bind参数是指令绑定的数据,vnode是虚构dom const flag = binding.value // 找到组件中绑定的标识 if (flag == false) { el.style.display = 'none' } else { el.style.display = 'inline-block' } }, // inserted函数是在元素插入dom节点调用 inserted(el, binding, vnode) { }, // update和componentUpdated都是更新应用,然而前者更加罕用些,oldVnode参数只有在这两个钩子中才会有 componentUpdated(el, binding, vnode, oldVnode) { }, update(el, binding, vnode, oldVnode) { const flag = binding.value if (flag == false) { el.style.display = 'none' } else { el.style.display = 'inline-block' } }, // unbind解绑时候应用,比方用来移除第一个bind函数中绑定的事件 unbind(el, binding, vnode) { }});第二步,在main.js中引入这个书写全局自定义指令的文件(示意应用之)import Vue from 'vue'import App from './App.vue'import router from "@/router/index.js" //引入路由表import store from './store/index' // 引入vuex// ...// 引入就能够应用全局自定义指令啦 ^_^import './views/utils/index.js'let vvvue = new Vue({ render: h => h(App), router, store // 挂载下来}).$mount('#app')第三步,在组件中应用全局自定义指令<template> <div> <el-button @click="change" type="primary">显示暗藏来回切换</el-button> <!-- 给这个按钮加上vue的自定义指令v-showshow ,并且让这个自定义指令绑定vue组件中data的数据 所以这里绑定的是isShowBtn标识,通过管制这个标识管制显示与暗藏 --> <el-button type="primary" plain v-showshow="isShowBtn">仿写v-show按钮</el-button> </div></template><script>export default { data() { return { isShowBtn: true, // 初始为true,让其显示 }; }, methods: { // 点击来回切换显示与暗藏 change() { this.isShowBtn = !this.isShowBtn }, },};</script>有的道友说,蛤?这不是多此一举嘛?其实不是,因为还没遇到特定的场景。上述两个例子次要是学习自定义指令的思维。接下来咱们举一个小例子,点击文字一键复制性能。案例三 实现v-copy自定义指令效果图 ...

November 12, 2021 · 2 min · jiezi

关于vue.js:推荐一款基于nodejskoavue开发的开源智慧物业系统

「e家宜业」开源智慧物业零碎无加密,无阉割,来一次真正的开源! 我的项目介绍「e家宜业」是一整套智慧物业解决方案。实现了微信公众号、小程序、PC、H5、智能硬件多端买通,旨在晋升物业公司效率、标准物业服务流程、晋升物业服务满意度、增强小区智慧化建设、便捷业主服务。 后端采纳Koa + Typescript轻量级构建,反对分布式部署;前端应用vue + view-design开发。 心愿通过开源促成产品的倒退,可能结识乏味的灵魂,有想法的敌人。我的项目地址:https://github.com/chowa/ejyy官网地址:https://ejyy.chowa.cnQQ交换群:786743759 技术亮点自主独立研发,无阉割、无加密、真正的开源web中台页面采纳view-design开发,清新易用轻量级开发计划,借助node.js高io、异步、cluster等个性欠缺的权限治理,精密到每一个菜单对接公众号和小程序,数据买通精密的ui界面和晦涩的交互动画前后拆散,二次开发不便反对定时工作和长连贯可对接小区硬件设施页面展现web端 业主端 员工端 如何部署服务器环境举荐要求NignxNode.js 12.1.0MySQL 5.7Redis部署文档部署前的筹备服务端部署web端部署业主端小程序员工端小程序公众号模板音讯短信音讯模板小区硬件接入智能硬件门禁类产品举荐应用凯帕斯(K-pass) 演示web中台演示版为saas多物业公司版本,小区开明上略有差别https://pc.ejyy.chowa.cn 账号/明码:guest/guest123 微信公众号 业主小程序 物业员工小程序 开源版应用阐明1.容许用于集体学习、教学案例、公益事业; 2.如果商用必须保留版权信息(请尊重开源,开源不易),请自觉遵守,未经受权批改版权信息后自负,如果须要去版权请进群分割管理员; 3.禁止将本我的项目的代码和资源进行任何模式的发售,产生的所有任何结果责任由侵权者自负。 参加开发欢送反馈问题欢送提交代码

November 12, 2021 · 1 min · jiezi

关于vue.js:element-plus-代码片段插件Element-Plus-Snippets代码写的飞起

插件名称搜寻: Element Plus Snippets 各种根底代码提醒,让代码写的腾飞基本上所有 element plus 标签如下。咱们通过关键字触发, 例如 epb 代表 <el-button>,理论代码片段: <el-button type="primary">{$1}</el-button>所有的代码片段,基于 element-plus.v, 关键字vue3-ts-构造代码 Snippets List新增No.Trigger KeyElement Tag1.vvue3-ts-构造代码2.temp<template>2.eptm<table> 多选Basic 根底组件No.Trigger KeyElement Tag1.eprow<el-row>2.epcol<el-col>3.ephchidden-xs-only,hidden-sm-only,etc4.epcon<el-container>5.epas<el-aside>6.ephe<el-header>7.epma<el-main>8.epfo<el-footer>9.epcb#409EFF10.epcs#67C23A11.epcw#E6A23C12.epcd#F56C6C13.epci#90939914.epcpt#30313315.epcrt#60626616.epcst#90939917.epcht#C0C4CC18.epcbb#DCDFE619.epclb#E4E7ED20.epclrb#EBEEF521.epelb#DCDFE622.eptypofont-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;23.epbbsbox-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)24.epblsbox-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)25.epbep-button26.epbgep-button-group27.eplep-linkForm 表单组件No.Trigger KeyElement Tag1.epr<el-radio>2.eprg<el-radio-group>3.eprbg<el-radio-group> with <el-radio-button>4.eprb<el-radio-button>5.epc<el-checkbox>6.epcg<el-checkbox-group>7.epcbg<el-checkbox-group> with <el-checkbox-button>8.epcbt<el-checkbox-button>9.epi<el-input>10.epit<el-input type="textarea">11.epa<el-autocomplete>12.epis<template slot=''>13.epin<el-input-number>14.epsel<el-select>15.epselr<el-select remote>16.epop<el-option>17.epopg<el-option-group>18.epca<el-cascader>19.epcap<el-cascader-panel>20.epsw<el-swtich>21.epsl<el-slider>22.eptp<el-time-picker>23.epts<el-time-select>24.eptsr<el-time-select> * 225.eptpr<el-time-picker is-range>26.epdp<el-date-picker>27.epdpr<el-date-picker type="daterange,monthrange">28.epdtp<el-date-picker type="datetime">29.epdtpr<el-date-picker type="datetimerange">30.epu<el-upload>31.epra<el-rate>32.epcp<el-color-picker>33.eptr<el-transfer>34.epf<el-form>35.epfi<el-form-item>数据展现No.Trigger KeyElement Tag1.ept<el-table>2.eptc<el-table-column>3.epta<el-tag>4.eppr<el-progress>5.eptree<el-tree>6.epp<el-pagination>7.epba<el-badge>8.epav<el-avatar>反馈组件No.Trigger KeyElement Tag1.epal<el-alert>2.eploadsepement-loading-*3.epme$app.$message({})4.epmeal$app.$alert({})5.epmecon$app.$confirm({})6.epno$app.$notify({})7.epnot$app.$notify.type({})7.epmel$app.$loading({})导航No.Trigger KeyElement Tag1.epmen<el-menu>2.epsubmen<el-submenu>3.epmeni<el-menu-item>4.eptabs<el-tabs>5.eptabp<el-tab-pane>6.epbr<el-breadcrumb>7.epbri<el-breadcrumb-item>8.eppa<el-page-header>9.epdr<el-dropdown>10.epdri<el-dropdown-item>11.epsts<el-steps>12.epst<el-step>Others PartNo.Trigger KeyElement Tag1.epdi<el-dialog>2.epto<el-tooltip>3.eppo<el-popover>4.eppoco<el-popconfirm>5.epcard<el-card>6.epcaro<el-carousel>7.epcaroi<el-carousel-item>8.epcolla<el-collapse>9.epcollai<el-collapse-item>10.epti<el-timeline>11.eptii<el-timeline-item>12.epd<el-divider>13.epcal<el-calendar>14.epim<el-image>15.epback<el-backtop>16.epinfiv-infinite-scroll17.epdra<el-drawer>

November 12, 2021 · 1 min · jiezi

关于vue.js:vue-模板循环绘制多行上传文件功能

咱们在上传多个文件时, 循环绘制模板, el-upload 拿不到以后操作的节点 , 能够在其外层减少一个div 加上点击事件,记下以后操作节点, 代码如下 <el-form-item :label="val.label+':'" v-for="(val, key, index) of orther_license_info" :key="key + '_'+index" :prop="key"> <el-col :span="8"> <el-input type="text" readonly v-model="conf[key]" ></el-input> </el-col> <el-col offset="1" :span="7"> <div @click="fileDivClick(key)"> <el-upload :on-change="fileChange" :show-file-list="false" :auto-upload="false" :accept="key!=='otherQualification'?'image/jpeg,image/png':'image/jpeg,.zip'" > <el-button slot="trigger" type="primary" style="width: 83px" >{{val.sltFlg?"已抉择":"抉择文件"}}</el-button> <el-button class="margin-left-10" type="primary" @click="uploadFile(key)">上传文件</el-button> </el-upload> </div> </el-col> </el-form-item>事件 fileDivClick(curKey){ this.curKey = curKey }, fileChange(file, fileList) { }

November 11, 2021 · 1 min · jiezi

关于vue.js:用明道云实现与物流信息交互

文/明道云施行参谋 周亮 在信息卓越的时代,企业外部与物流联合管控曾经成为2C和2B畛域的迫切需要。上面分享一家企业通过明道云实现的物流对接,真正做到了外部系统对物流的整个过程管控。 首先咱们来看一下出现成果: 发货单属于外部系统生成数据,物流信息属于调用后果。这种出现成果大家是否很眼生,平时的京东,天猫商城购买商品也会有这样的物流后果展示。 一、数据交互的益处是什么现在的物流老本越来越高,大部分企业的物流是通过外包给第三方平台。那么也就意味着有两套独立的应用程序。第三方的物流信息不能即时的获取,也就会导致跟进不及时,客户对接音讯不精确,投入太多的人力和工夫老本等等。 数据交互大大减少了与第三方没必要的沟通环节,也大大减少了信息传递的错误率,最要害的就是买通了外部数据流转,更加精确的判断,即时的应答和剖析,升高工夫和人力老本。 二、数据交互的流程是什么1.销售内勤告诉仓库发货,仓库人员依据指令进行配货同时抉择快递公司后生成发货单。 2.发货单生成之后通过API将数据信息传递给物流公司,同时主动生成一条快递单。 3.物流接单后届时咱们调用物流公司的快递单号,实时去跟踪物流状态,并将每笔物流状态数据写入到物流信息表(依据webhook的能力)。 4.主动反向更新外部发货单的物流状态;以及销售订单的整体状态,实现订单执行跟踪表。 三、明道云如何实现信息交互1.首先要创立六个表单别离是发货单和发货单明细表单,快递单和快递单明细(物流信息)表单,API获取打印编码和参数明细表单。 2.配置关键字段 1.发货单上必须有关联表快递公司(作为物流公司传值的标记)2.快递单配置关联表发货单,同时发货单双向关联发货单明细3.快递单双向关联快递信息4.API打印编码设置双向关联API列表参数3.创立工作流第一个工作流:发货单确认的时候新增快递单,此工作流能够通过按钮触发也能够通过表单中某个值发生变化的时候触发。第二个工作流:主动创立电子面单工作流,首先触发条件是物流单创立的时候,将API表单中的参数获取进去,而后H5解密,最初通过WEBHOOK推送音讯给物流平台。 获取API参数: 传参并解析代码: var crypto = require('crypto');let sdata ={ "type":"10", "partnerId":""+input.partnerId, "partnerKey":""+input.partnerKey, "partnerSecret":""+input.partnerSecret, "net":"", "kuaidicom":""+input.kuaidicom, "recMan":{ "name":""+input.name, "mobile":""+input.mobile, "printAddr":""+input.printAddr, "company":"" }, "sendMan":{ "name":"xx", "mobile":"185xxxxxxxxx", "printAddr":"上海市青浦区徐泾镇xxxxxxxx", "company":"上海xxxxxx有限公司" }, "cargo":"日用品", "count":"1", "weight":"", "payType":""+input.payType, "expType":""+input.expType, "remark":""+input.remark, "tempid":""+input.tempid, "siid":""+input.siid, "valinsPay":"1000" };let t = ""+Date.parse(new Date());let md5str = JSON.stringify(sdata)+t+'KVKbiTrE4320'+'a9ffc8fd2b28441395f4b24cf95bcf58';var result = crypto.createHash('md5').update(md5str).digest("hex").toUpperCase(); output = {param:JSON.stringify(sdata),md5:result,t:t}WEBHOOK传值给物流平台: 最初更新快递单号的内容: 第三个工作流:通过WEBHOOK申请URL物流平台,调用字段获取关联表单快递单,并将其余翻译值写入物流信息表单中。 最初依据参数语言翻译成不同的状态类型更新到快递单中造成闭环: 四、总结疾速开发和第三方平台对接始终以来都是低代码平台的劣势。其实通过以上的操作流程咱们不难看出只有学会了表单的搭建,工作表的关联,以及工作流的搭建实现起来就十分的轻松,万变不离其中,大家能够亲自体验下搭建的乐趣,肯定有意想不到的播种,http://www.mingdao.com体验官网。

November 11, 2021 · 1 min · jiezi

关于vue.js:调试工具vuedevtools安装

下载devtools下载vue-devtools插件的地址 下载实现 解压,而后 加载已解压的扩大程序

November 11, 2021 · 1 min · jiezi

关于vue.js:Vue30基于vuegridlayout插件实现拖拽布局

最近遇到个需要须要对页面布局进行拖拽而后扭转布局,保留布局插件首先,咱们抉择的插件是vue-grid-layout npm i vue-grid-layout --save官网:https://jbaysolutions.github.... 插曲装置完依赖,发现我的项目能启动起来,依照官网demo发现页面空白,控制台提醒没有找到子组件 扭转思路,不应用部分引入组件,应用全局引入组件。 实现 const layout = ref<LayoutItem[]>([ { x: 0, y: 0, w: 1, h: 1, i: 0 }, { x: 1, y: 0, w: 2, h: 1, i: 1 }, { x: 0, y: 1, w: 2, h: 1, i: 2 }, { x: 0, y: 2, w: 3, h: 1, i: 3 }, { x: 2, y: 1, w: 1, h: 1, i: 4 }, ]); <grid-layout :layout="layout" :col-num="3" :row-height="240" :is-draggable="true" :is-resizable="true" :is-mirrored="false" :maxRows="3" :vertical-compact="true" :margin="[10, 10]" :use-css-transforms="true" > <grid-item v-for="item in layout" :x="item.x" :y="item.y" :w="item.w" :h="item.h" :i="item.i" :key="item.i" @moved="onItemMoved" >{{ item.i }}</grid-item> </grid-layout>成果: ...

November 10, 2021 · 2 min · jiezi

关于vue.js:APP性能监测工具之友盟的-UAPM产品入门使用

APP性能监测工具之友盟的 U-APM产品入门应用 前言: 最近公司做了一款新的APP,要求可能看到用户每天的新增量和沉闷量,还有一些页面的点击量、停留时间等的监测,还有更重要的一点就是可能监测到app的异常情况。于是开始对第三方工具开始一番钻研,比照之后我抉择应用了友盟。废话不多说,开始介绍下我的集成过程。 这里有一个整体的流程图 注释: 第一步:集成筹备 友盟的利用性能监控平台 U-APM的传送门:https://at.umtrack.com/HHDSrm 如果没有账号能够先注册一下,注册完登录后,间接点击进入后盾 进入后盾后,点击立刻创立,填写上利用的相干信息,点击注册利用即可 这里的AppKey很重要哦,集成的时候要用到的,而后点击持续集成,上面就能够欢快的集成了。 第二步:开始集成,集成分主动集成和手动集成两种模式 还是先来看下整个集成的流程图 主动集成(举荐) 通过在Android Studio工程build.gradle配置脚本中增加maven线上依赖,导入最新版本组件化统计SDK。 maven依赖配置 在工程build.gradle配置脚本中buildscript和allprojects段中增加【友盟+】SDK新maven仓库地址。 maven { url 'https://repo1.maven.org/maven2/' }在工程App 对应build.gradle配置脚本dependencies段中增加统计SDK库和其它库依赖: dependencies { implementation fileTree(include:['*.jar'], dir:'libs') // 上面各SDK依据宿主App是否应用相干业务按需引入。 // 友盟统计SDK implementation  'com.umeng.umsdk:common:9.4.2'// 必选 implementation  'com.umeng.umsdk:asms:1.4.1'// 必选 implementation 'com.umeng.umsdk:apm:1.4.2' // 谬误剖析降级为独立SDK,看crash数据请肯定集成,必选 implementation  'com.umeng.umsdk:abtest:1.0.0'//应用U-App中ABTest能力,可选 } 留神:在Android Studio 3.1及以上版本开发环境下,指定援用最新版本依赖写法”latest.integration”可能导致下载库超时,此时须要指定具体版本号。 清单文件中的权限配置 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> 如果利用应用了代码混同,请增加如下配置,以防止【友盟+】SDK被谬误混同导致SDK不可用 -keep class com.umeng.* {;} -keepclassmembers class * { ...

November 10, 2021 · 1 min · jiezi

关于vue.js:Vue-Div-实现可输入文本功能类似聊天可输入文本可添加整体文本整体文本删除

实现内容区域可输出文本,也能够通过点击按钮增加内容,输出得文本单个删除,增加得内容为一个整体,整体删除,不可反复增加。难点1:增加得内容整体删除,这时候就得是一个整体,只能增加整个标签,删除得时候能力整体删除。 <div :style="{borderColor:isLargeNum?'#f54e45':'#c3c7cb'}" id="container" v-html="temps" @input="deleteEvent" contenteditable="true" //此属性可使div可输出 ref="custom-text" class="custom-text" @paste.prevent="() => {return false}" //禁止输出空格 ></div> deleteEvent() { const that = this; this.$nextTick(() => { //先获取以后dom外面所有内容,通过id惟一来匹配是否剔除已选数据 let tes = this.$refs["custom-text"].innerHTML; this.objectList = JSON.parse( JSON.stringify( this.objectList.filter(i => { return tes.includes(i.obj_id+'-'+i.obj_name); }) ) ); setTimeout(() => { that.matter.desc_forepart = that.$refs["custom-text"].innerText; that.matter.desc_objs = that.objectList; that.matter.description = that.$refs["custom-text"].innerText; if (that.matter.desc_forepart.trim().length > 1000) { this.isLargeNum = true; } else { this.isLargeNum = false; } }); }); }, //选择对象后的进行对应数据的保留 handleChangeObj(data) { const that = this; let tes = this.$refs["custom-text"].innerHTML; data.forEach(i => { if (!this.$refs["custom-text"].innerHTML.includes(i.obj_id+'-'+i.obj_name)) { const templates = `<span id=${i.obj_id}-${i.obj_name} style='color: rgb(0, 145, 255); font-size: 14px; -webkit-user-modify: read-only;'>@${i.obj_name}</span><i></i>`; tes += templates; } }); //通过增加span属性得id+name来标识唯一性,利于反复增加和删除, this.temps = tes; this.isSHowaddObject = false; this.objectList = data; setTimeout(() => { this.matter.desc_forepart = this.$refs["custom-text"].innerText; this.matter.desc_objs = this.objectList; this.matter.description = this.$refs["custom-text"].innerText; if (that.matter.desc_forepart.trim().length > 1000) { this.isLargeNum = true; } else { this.isLargeNum = false; } }); // this.$set(this.workOrderQuery[this.findVluaindex], 'value', data) },

November 10, 2021 · 1 min · jiezi

关于vue.js:vhtml富文本内容如何触发预览图片功能

把间接绑定事件在v-html的元素上 <p @click="hanldeImage($event)" v-html="Mdetail.kfKnowledgeContent.content" />通过event办法定位出,点击触发的nodeName是否是img类型如果是触发预览图片性能,能够用el-image间接触发,在我的上一篇文章里 Element-ul的 el-image-viewer组件实现点击或者js触发能预览大图性能 hanldeImage(event) { if (event.target.nodeName == 'IMG' || event.target.nodeName == 'img') { const img = event.target.currentSrc this.showImage([img]) // 预览图片办法 } },

November 10, 2021 · 1 min · jiezi

关于vue.js:Elementul的-elimageviewer组件实现点击或者js触发能预览大图功能

element-ul有大图预览性能 但咱们不想展现图片,想实现的是点击按钮,或者通过js事件触发,能预览大图(多张也能够预览)的性能。 1、导入组件 // 导入组件import ElImageViewer from "element-ui/packages/image/src/image-viewer";2.注册组件 components: { ElImageViewer, },3.应用组件 <p @click="showImage(picture)">查看图片</p> <el-image-viewer v-if="showViewer" :on-close="closeViewer" :url-list="srcList" ></el-image-viewer>4.相干的data定义 data() { return { srcList: [], showViewer: false // 显示查看器 }}5.methods // 查看图片showImage(path) { this.srcList = path; this.showViewer = true;},// 敞开查看器closeViewer() { this.showViewer = false;},

November 10, 2021 · 1 min · jiezi

关于vue.js:基于Vue3最新标准实现后台前端综合解决方案MK

JAVA的办法调用以及传参静態办法:有static润饰的办法。 非静態办法:沒有static润饰的办法。 办法調用:一静態办法調用 静態办法/屬性 1)一個類:间接調用。 2)不同類/不同文件: a: 類名.屬性名/办法名 b:實例化對象。 類名 對象名 = new類名(); 對象名. 屬性/办法 二静態調用 非静態办法/屬性都先實例化對象。 類名 對象名 = new類名(); 對象名. 屬性名/办法名 一非静態調用静態办法 二非静態調用非静態办法 1)同一類中:间接調用 2)不同類中: a: 類名 . 办法(只能是静態屬性)b:實例化對象 總結:可间接調用的三種情況 1.一個類中 静態調静態 。 一個類中 非静態調用 静態/非静態。静態 類名.静態屬性/静態办法。復製代码public class Demo03{ int age;public static void main(String []args){ System.out.println(Demo04.name);//静態調用静態1 Demo04.eat(); Demo04 d = new Demo04();//静態調用静態2 System.out.println(d.name); d.eat(); Demo03 d1 = new Demo03();//静態調用非静態 d1.method(); System.out.println(d1.age);}public void method(){ System.out.println("first method");}}復製代码復製代码1 public class Demo04{2 static String name = "張三";3 4 public static void eat(){5 System.out.println("肉夾馍");6 }7 }復製代码復製代码 1 public class Demo05{ 2 static int age; 3 String name; 4 public static void main(String []args){ 5 6 Demo05 d1 = new Demo05();//静態調非静態 實例化 7 d1.method(); 8 } 9 10 public void method(){11 System.out.println(age); //非静態調静態 12 method1(); //非静態調静態 13 System.out.println(name);//非静態調非静態 14 method2(); //非静態調非静態 15 System.out.println("first method");16 }17 public static void method1(){18 System.out.println("second method");19 }20 public void method2(){21 System.out.println("third method");22 }23 }復製代码復製代码 1 public class Demo06{ 2 3 public static void main(String []args){ 4 5 Demo06 d1 = new Demo06(); //静態調非静態 實例化 6 d1.method(); 7 } 8 public void method(){ 9 System.out.println(Person.name); //非静態調静態10 Person.method1(); //非静態調静態11 Person p = new Person(); //非静態調非静態 實例化12 p.method2();13 System.out.println("first method");14 }15 }16 class Person{17 static String name;18 int age;19 public static void method1(){20 System.out.println("second method");21 }22 public void method2(){23 System.out.println("third method");24 }25 }復製代码復製代码 1 public class Demo09{ 2 //實參到形參是單向的,所以在傳遞過程中形參值發生改變不會影響實參 3 public static void main(String []args){ 4 int i =1; 5 String s = "ww"; 6 Demo09 d = new Demo09(); 7 d.method(i,s); 8 System.out.println(i); 9 System.out.println(s);10 }11 public void method(int i,String s){12 i = 100;13 s = "asd";14 }15 public void method116 }復製代码復製代码public class ChuanDiZhi{ ...

November 10, 2021 · 2 min · jiezi

关于vue.js:Vue中-thisset的用法-可用于修改对象中数组的某一个对象-可用于更新数据到视图

夜晚的月,想着怀念的人 前言最近在写老师安排的vue我的项目,真的说实话,每天真就是在百度、google、bing等各个搜索引擎之间重复横跳,不然就是掘金搜一搜、思否搜一搜,还有CSDN看一看。我的前端是吃百家饭长大的,每天不晓得要遇到多少问题,而后基本上四周所有的前端同学都被我问到了,基本上就是谁有空就拉谁来教我。 前端太多细节问题了,一旦遇到没有接触过问题,就会十分麻烦,如果有学习前端的后端小伙伴,我感觉最快相熟前端的形式,就是整个我的项目写。这可能是最快上手前端框架的形式了吧。 一、vue中批改数组对象下的数组里的某一个对象我的对象构造如下: sections: [ { id: 0, addInputBool: true, generallnformationBool: false, generallnformation: '', updateGenerlInfoImgBool: false, pullUpQusetionBool: true, upQusetionBool: true, downQuestionBool: false, questions: [ { id:'', name:'', isCheckbox:'', answer:'', conditions:[], dropdownMultiSelections:[] } ] }]要实现的需要是通过数组下标,批改数组里某一个对象。 最开始我的想法就是将数值一个一个的赋值进数组,和写Java代码一样的思维。 this.sections[index].question[id]=this.addQuestion这里的index和id是咱们点击页面批改传过来的值,最初发现这样始终报错,不可能实现批改。 起初查百度说: 问题:依据数组的索引间接赋值没法批改数组的中对象。 起因:Vue 不容许在曾经创立的实例上动静增加新的根级响应式属性 (root-level reactive property)。然而它能够应用 Vue.set(object, key, value) 办法将响应属性增加到嵌套的对象上 而后就查到了要应用this.$set来进行操作 解决:// 数组:第一个参数是要批改的数组, 第二个值是批改的下标或字段,第三个是要批改成什么值this.$set(sections[index].question,id,{ id:'123', name:'宁在春', isCheckbox:true, answer:'测试集', conditions:[1,2,3], dropdownMultiSelections:[a,b,c]});或者// 对象:第一个参数是要批改的对象, 第二个值是批改属性字段,第三个是要批改成什么值Vue.set(sections[index].question,id,{ id:'123', name:'宁在春', isCheckbox:true, answer:'测试集', conditions:[1,2,3], dropdownMultiSelections:[a,b,c]})看到有这个this.$set办法,就想去理解理解,看看它还有什么利用场景,不便下次有须要的时候,可能间接用上。 二、this.$set2.1、this.$set可能实现什么性能官网解释:向响应式对象中增加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上增加新属性,因为 Vue 无奈探测一般的新增属性 (比方 this.myObject.newProperty = 'hello,ningzaichun') ...

November 9, 2021 · 1 min · jiezi

关于vue.js:elementUI-多文件上传只执行一次onSuccess的解决方法

起源 应用两个fileList变量,一个赋值给组件只做展现用,一个理论作为新增/删除/上传应用. 应用组件 <el-upload class="upload" action="url" name="files" :file-list="uploadList" :on-error="errUpload" :on-preview="handlePreview" :on-success="handleSuccess" :on-remove="handleRemove" multiple :limit="uploadLimit" :on-exceed="handleExceed" list-type="picture" size="small"> <el-button type="success" size="small" plain>抉择图片</el-button> <div slot="tip" class="el-upload__tip" style="height: 20px"> 只能上传jpg/png文件,且不超过500kb</div> <div slot="tip" class="el-upload__tip">默认第一张为封面,点击将图片设置为第一张</div> </el-upload>定义列表 // 上传文件列表uploadList: [],realFileList: [],操作 handleRemove(file, fileList) { let list = this.realFileList; let len = this.realFileList.length; for (let i = 0; i < len; i++) { if (file.name == list[i].name) { list.splice(i, 1); break; } } }, handlePreview(file) { let list = this.uploadList; let len = this.uploadList.length; for (let i = 0; i < len; i++) { if (file.name == list[i].name) { list.unshift(file); list.splice(i + 1, 1); break; } } }, handleSuccess(res, file, fileList) { let arr = []; fileList.forEach((item) => { let obj = {}; if (item.response) { obj.name = item.response.data[0].fileName; obj.url = item.response.data[0].fileSrc; obj.fileId = item.response.data[0].fileId; } else { obj.name = item.name; obj.url = item.url; obj.fileId = item.fileId; } arr.push(obj); }); this.realFileList = arr; },

November 9, 2021 · 1 min · jiezi

关于vue.js:Vue理论随笔

1.v-if和v-for的优先级哪个更高,同时应用时如何正确处理?v-for的优先级更高,在每次渲染时,都会先循环再判断,在源码中,能够看到两者的解决逻辑,先for再if,若是同时应用,最好在v-for外层写一层template,后行判断,再进行循环。 2.Vue组件中的data为什么必须是个函数,而根实例时则没有该限度?次要是为了避免数据净化,组件有可能会是多个,也就是说多个Vue组件共用一个data,如果这时data是对象的话,那么一个组件的数据变更会影响到所有共用这个data的组件,而根实例创立时是间接new了一个新的Vue,它每次都是新的且只有一个,所以不会呈现这种数据净化的状况。 3.key的作用和原理Key的次要作用是更高效的更新虚构DOM,原理是vue在patch过程中能够通过key精准判断两个节点是否是同一个,防止频繁更新DOM,提高效率,以插入数组节点为例,若不应用key,须要更新每一个数组节点,而后最初在创立节点并插入最初一位,而应用key后,则是去循环数组,进行首尾节点比拟,雷同则不做任何更新操作,不同则创立新节点并插入。不应用key进行插入:应用key进行插入:(Vue中diff执行的时刻是组件实例执行其更新函数时,它会比照上一次渲染后果oldVnode和新的的渲染后果newVnode,此过程称为patch) 4.diff算法a.必要性 组件中可能会存在多个data中的key应用,特地是watcher中,能够精准监找到变动产生的中央b.执行形式 策略:深度优先,同级比拟, 找到节点中最初一个孩子,再进行比拟,比拟实现后上移持续比拟c.高效性 次要解决同级比拟

November 9, 2021 · 1 min · jiezi

关于vue.js:从零开始搭建vue框架启动项目最新搭建

脚手架 vuecli3.4全局装置:如果你电脑中有老的版本 如vuecli2npm uninstall vue-cli -g 写在老版本的cli(1.x 2.x)如果没有装置的 略过 npm i -g @vue/cli yarn global add @vue/cli 测试有没有装置胜利 vue --version 呈现了版本号 装置胜利 vue create myapp 启动你的我的项目 接下来抉择最上面一行回车 而后空格键抉择你须要的配置回车 而后输出no在抉择第一个不太倡议抉择第二个(容易呈现问题)再持续回车 留神在启动我的项目时 有时候因为 node-sass下载不下来会报错 解决办法:cnpm i -D node-sassnpm i -D node-sass --sass_binary_path=/Users/lzwme/Downloads/darwin-x64-48_binding.node 接下来依据须要来抉择ESLint语法标准 而后抉择本人喜爱的配置回车 而后抉择本人抉择是否在package.json文件夹下 接下来问你是否保留这次的配置,如果心愿保留输出y回车,不要就跳过这个过程输出n 接下来起名字回车,下次创立新的我的项目就间接应用就行 接下来期待就ok 最初页面是这样就胜利了 *npm run serve 开发环境构建*npm run build 生产环境构建 *npm run lint 代码检测工具npm run serve之后依据代码提醒在地址栏输出localhost ...

November 8, 2021 · 1 min · jiezi

关于vue.js:vuex

vuex参考:https://vuex.vuejs.org/zh/ 装置npm run vuex --save生产依赖 简略应用三局部 显示的应用Vue.use()来应用vuex import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)生成store实例 const store = new Vuex.Store({ state: { count: 0 }, getters: { getterCount(state) { return state.count + 1 } }, mutations: { changeCount(state, payload) { state.count = payload.count } }, actions: { changeCount({ commit }) { commit('changeCount') } }})应用,通过store.state来获取对象,通过store.commit来触发状态变变更 store.commit('changeCount') // 触发mutationsstore.dispatch('changeCount') // 散发actionsconsole.log(store.state.count) // -> 1console.log(stroe.getters.getterCount) // -> 2下面步骤曾经能够应用vuex了,然而在组件中应用不不便,每在一个组件中应用都要进行导入,所以,Vuex 提供了一个从根组件向所有子组件,以 store 选项的形式“注入”该 store 的机制: ...

November 8, 2021 · 3 min · jiezi

关于vue.js:vue-渲染对象object

间接用一个demo来看item 对应 object 键值对中的 valuekey 对应 object 键值对中的 key index 对应 键值对的 索引<a-radio-button v-for="(item, key, index) of statusObj" :key="key" :value="key"> {{ item }}-{{ key }}-{{ index }}</a-radio-button>data () { return { statusObj: { 'doing' : '进行中', 'done': '已完结' }, }},渲染后果:

November 8, 2021 · 1 min · jiezi

关于vue.js:Vue项目嵌套

问题形容想要在A零碎中关上B零碎的内容进行数据操作。 产生起因现有已存在的前端我的项目中,有些零碎数据是相关联的,从A我的项目批改数据后,又要关上B我的项目拿数据操作,以致用户操作不不便。 解决方案一、iframe嵌套父零碎1、在父零碎中须要配置相干菜单(或者说是路由)2、在父零碎中依据路由创立页面文件html局部:页面嵌套一个iframe标签,src就是须要调用的页面url(线上残缺门路)。 <template> <iframe @load="sendMessage" :src="url" ref="iframe"></iframe></template>js局部:当iframe加载完后,向浏览器通过postMessage发送约定俗称的信息(比方:code为200是两个零碎约定的标记,示意这是约定的信息;token也能够间接拼接在url上,次要思考到token外泄、字符过长等场景,才把token放在通信里)。postMessage能够实现跨域通信,第一个参数示意要通信的内容,第二个参数示意要通信的指标地址(该场景是A嵌套B,A要向B发送信息,所以应该是B地址。'*'示意任意窗口都能够接管到)。 sendMessage() { const iframe = this.$refs.iframe.contentWindow; iframe.postMessage( { code: '200', token: 'xxx', }, '*' );}3、iframe嵌套存在无奈缓存的问题,但能够把全副的iframe放在一个组件里,通过v-show管制是否展现,让人视觉上感觉页面已缓存。(iframe组件要与<keep-alive>节点平级)布局文件: <keep-alive :include="alive" :exclude="exclude"> <router-view></router-view></keep-alive><iframeTemporary></iframeTemporary>iframeTemporary文件:第一个v-show是管制是否呈现iframeTemporary这个组件,因为若是呈现这个组件,须要占据整个页面;第二个v-show是管制呈现路由对应的iframe标签页面。(具体细节就须要缓缓调整,比方tab页显示,iframe页面切换操作等。 <template> <div class="iframe" v-show=""> <iframe v-show="$route.name === item.name" v-for="item in iframeList" :key="" :src="item.src" :key="item.key"></iframe> </div></template>子系统1、在路由文件中监听postMessage传输过去的数据。onmessage 事件肯定要在beforeEach外面,要管制在iframe嵌套的状况下,监听到约定内容(code为200,解决完token信息),页面能力跳转;否则就会token生效。 router.beforeEach((to, form , next) => { if(window.top.location !== window.self.location) { // iframe 嵌套 window.onmessage = (event) => { if(event.data && '200' === event.data.code) { // 通过约定俗成的内容,判断是否是已知窗口传递过去的音讯 // 解决内容,比方token信息 // 页面跳转 ... } } } else { // 页面失常跳转 ... }})2、若是存在多个页面跳转,且带有参数信息,子项目也能够通过postMessage传递音讯。(可在路由的query局部,加一个标记字段辨别是否要在iframe中关上,比方isFrame)。 ...

November 8, 2021 · 1 min · jiezi

关于vue.js:如何查看Vue最初版本-v100

拷贝Vue源码: git clone https://github.com/vuejs/vue.git查看版本历史记录(倒序): git log --reverse回退版本: git reset --hard a879ec06ef9504db8df2a19aac0d07609fe36131这时就能看到vue1.0.0版本的代码了 上面是如何打包代码: 装置依赖: npm install这时间接运行npm run build会报错, 须要进行一些的文件内容批改: 批改package.json中的scripts:"scripts": { "dev": "webpack --watch", "test": "mocha", "build": "node build/build.js NODE_ENV=devlopment" },批改.babelrc:{ "env": { "development": { // "presets": ["es2015", "stage-2"] "presets": [[ "es2015", { "modules": false } ]] }, "production": { "presets": ["es2015-rollup", "stage-2"] } }}在根目录下新建dist目录打包: npm run build在dist目录中能够看到打包的三个文件: 查看 ./dist/vue.js: 能够看到, Vue1.0.0总共有2500行左右的代码

November 7, 2021 · 1 min · jiezi

关于vue.js:Vue-基础自查条件渲染和列表渲染

v-if和v-show的区别是什么?v-if和v-for为什么不能一起用?v-for中的key有什么作用?1 v-if 和 v-show1.1 作用都用来管制元素的显示和暗藏 1.2 管制元素显隐的形式v-if管制虚构DOM树上元素的创立和销毁,Vue的响应零碎会依据虚构DOM树对理论DOM进行更新,从而间接管制理论DOM上元素的显隐 v-show通过给元素增加款式display:none来让元素暗藏 1.3 初始渲染比照v-if是惰性的,如果初始渲染条件为false,什么都不做;只有条件为true,才会开始编译 v-show不论初始渲染条件如何,元素始终被编译并保留,之后依据条件通过CSS切换 1.4 切换耗费比照如果频繁切换显示与暗藏,v-if会频繁创立、销毁元素,而v-show只是切换款式 故v-if的切换耗费更高 1.5 应用场景比照如果元素的显示暗藏在一开始就定下来不会再变了,应用v-if 如果元素须要频繁切换显隐,应用v-show 1.6 其余v-if能够搭配template应用,v-show不能够v-if能够搭配v-else,v-show无非凡语法2 v-if 和 v-for2.1 v-if 和 v-for 不能同时用的起因为什么不能把v-if和v-for同时用在同一个元素上? 当 Vue 解决指令的时候,v-for的优先级比v-if高,因而这个模板: <ul> <li v-for="item in list" v-if="item.isActive" :key="item.id"> {{item.name}} </li></ul>会通过如下运算: this.list.map(function(item) { if (item.isActive) { return item.name }})咱们每次从新渲染的时候都要遍历整个列表,即便isActive为true的item很少,这会带来性能方面的极大节约,因而两者不能同时用在同一个元素上 2.2 v-if 和 v-for 一起用的解决方案1、如果想管制整个列表的显隐,能够将v-if挪动到容器元素上,比方: <body> <div id="example"> <ul v-if="listShow"> <li v-for="item in activeItems" :key="item.id">{{item.name}}</li> </ul> </div></body><script> const vm = new Vue({ el: "#example", data: { list: [ { id: 1, name: "路飞", isActive: true }, { id: 2, name: "索隆", isActive: false }, { id: 3, name: "山治", isActive: true }, ], listShow: false, } });</script>2、如果想过滤列表中的我的项目,能够应用计算属性(computed)返回过滤后的列表,比方: ...

November 6, 2021 · 1 min · jiezi

关于vue.js:vue-动态路由设置对比query方式跳转

一、动静路由配置router.config.js设置path门路时,减少 冒号 ":" 申明前面的为变量,间接拼接在path中 { path: '/sign-detail/:id', name: 'sign-detail', component: () => import('@/views/adv-order-management/sign-detail'), meta: { title: '报名详情', keepAlive: false }}二、动静跳转办法间接将变量id拼接在 path 前面即可(上面跳转后为 '/sign-detail/5') let id = 5this.$router.push({ path: '/sign-detail/' + id})三、在动静路由的页面获取参数在对应页面的路由跳转对象 $route 的 params 中获取 created () { const { id } = this.$route.params}以上就是动静路由的简略应用办法。四、query键值对跳转query 在应用上更加简洁,不须要配置路由,有多个参数时也更加不便跳转时,在 query 中传入键值对( 上面跳转后为 '/sign-detail?id=5&type=1') let id = 5this.$router.push({ path: '/sign-detail', query: { id, // 间接设置多个键值对 type: 1 }})获取时,在路由跳转对象 $route 的 query 中获取 created () { const { id, type } = this.$route.query}五、两种形式异同?1、重要! 仅参数变动时,两种形式都是仅更新路由,不触发页面刷新例如 '/sign-detail/5' 跳转到 '/sign-detail/4' 或者 '/sign-detail?id=5' 跳转到 '/sign-detail?id=4' ...

November 5, 2021 · 1 min · jiezi

关于vue.js:手机H5-必备

手机调试<!--手机调试--> <% if (VUE_APP_ERUDA === 'true') { %> <script src="//cdn.bootcss.com/eruda/1.5.2/eruda.min.js"></script> <script> window.eruda.init() </script><% } %>手机调试<meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,viewport-fit=cover" /><meta name="apple-mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-status-bar-style" content="black" /><meta content="telephone=no,email=no" name="format-detection" />

November 5, 2021 · 1 min · jiezi

关于vue.js:VUE路由跳转记住滚动位置返回时回到上次滚动位置

本解决方案原理是利用Keep-Alive、监听滚动事件 与 watch中监听$route 实现。 应用watch监听$route的计划实用于滚动区域在子组件中的状况。 因为,beforeRouteLeave 路由导航守卫,只能作用在路由组件内,不能被路由组件内的子组件所触发。 vue-router文档截图如下:本样例应用element-ui 下的 el-table表格组件,原生或其余UI组件思路同理。 router.js{ path: '/dispatchDetail', name: 'dispatchDetail', component: () => import('@/views/dispatchDetail/index.vue'), meta: { title: '日调度状况查问', keepAlive: true } //须要缓存},App.vue<keep-alive> // 缓存组件跳转的页面 <router-view v-if="$route.meta.keepAlive"></router-view></keep-alive>// 不须要缓存组件的页面<router-view v-if="!$route.meta.keepAlive"></router-view>dispatchDetail.vue <template> <el-table ref="listBox"> // 在el-table标签上 增加ref属性 用于获取滚动区域dom ... </el-table> </template> <script> export default { data() { return { listBox: '', scrollTop: 0, } } // 进入缓存组件时监听滚动事件 activated() { this.$refs.listBox.bodyWrapper.addEventListener('scroll', this.scrollToTop) }, // 来到缓存组件时监听滚动事件 deactivated() { this.$refs.listBox.bodyWrapper.removeEventListener('scroll', this.scrollToTop) }, watch: { $route(to, from) { // 如果是来自指标页 并且this.scrollTop > 0 则给滚动区域设置来到时缓存的距顶部高度值 if (from.name == 'schedulingDetails') { if (this.scrollTop > 0) { setTimeout(() => { this.$refs.listBox.bodyWrapper.scrollTo(0, this.scrollTop) }, 0) } } // 如果不是去指标页 则将 this.scrollTop 复原为 0 if (to.name !== 'schedulingDetails') { this.scrollTop = 0 } }, }, methods: { // 定义获取 距顶部滚动高度 办法 scrollToTop() { const scrollTop = this.$refs.listBox.bodyWrapper.scrollTop // 实时获取el-table组件以后滚动地位,距顶部的滚动高度 this.scrollTop = scrollTop // 赋值给 this.scrollTop 用于下次进入时调用 }, } }</script>

November 5, 2021 · 1 min · jiezi

关于vue.js:Spring-BootVue实现汽车租赁系统毕设

一、前言汽车租赁零碎,很常见的一个零碎,然而网上还是以前的老框架实现的,于是我打算从设计到开发都用当初比拟风行的新框架。想学习或者做毕设的能够私信分割哦!! 二、技术栈- 后端技术 SpringSpringBootMybatis- 前端技术 vueElement UIaxiosnodeecharts- 数据库 MySQLRedis三、管理员界面展现管理员登录界面: 管理员批改明码界面: 增加车系界面: 增加车辆界面: 用户治理界面: 订单治理界面: 评估治理界面: 报表剖析界面: 礼物治理界面:增加批改礼物界面:用户兑换礼物账单界面:兑换礼物报表界面: 四、用户界面用户注册界面: 用户登录界面: 登录后首页展现界面: 车辆出租展现界面: 车辆详情界面: 订单页面页面:订单导出Excel界面:Excel查看:礼物兑换展现页面: 五、总结总来的说我的项目的性能点大同小异,翻新点在于报表剖析和导出订单Excel。对于以前的汽车租赁零碎来说还是有很大的改良,特地是框架方面。

November 5, 2021 · 1 min · jiezi

关于vue.js:iview的坑

select filter时候,如果点开select没抉择,然而失去焦点,会使query残留在select中 <Select filterable v-model="formData.template" clearable ref="templateSelect" @on-open-change="handleOpenChange" > <Option value="custom"> 自定义 </Option> <Option v-for="item in poolTemplateList" :key="item.id" :value="item.id" > {{item.name}} </Option> </Select> handleOpenChange(state) { if (!state && this.formData.template === "custom") { this.$refs.templateSelect.query = "" } },

November 5, 2021 · 1 min · jiezi

关于vue.js:Vue3组件reactive-object警告的可能出处router

正告在应用ant-design-vue开发时,每次进入页面都有报以下这个warning: [Vue warn]: Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`. 大略意思就是有一个组件,被包装成了响应式的对象,会造成不必要的性能开销。这个正告指向于以下的文件: /src/layouts/BasicLayout.vue第一反馈就是在这个layout外面找问题,但始终解决不了。这里其实是进入了一个误区,以上正告其实是通知你,BasicLayout这个组件被包装成了reactive的对象,而不是问题出在这个组件外部。 定位跳出误区后就好定位问题了,寻找援用了BasicLayout这个组件的性能代码。一个可能的出处,是在router外面。因为我的项目里应用了动静路由,筛选后的路由对象,会存储在store外面,其中就蕴含了BasicLayout这个组件。 // 动静路由export const asyncRouterMap: Array<RouteRecordRaw> = [ { path: '/', name: 'index', meta: { title: '首页' }, component: BasicLayout, // 这里援用了BasicLayout组件 redirect: '/welcome', children: [ { path: 'welcome', name: 'Welcome', meta: { title: '欢送页', icon: 'icon-antdesign' }, component: () => import('@/views/welcome.vue') }, ... ] }, { path: '/:catchAll(.*)', name: 'NotFound', redirect: '/404' }]解决依据官网提醒,将间接引入BasicLayout批改为shallowRef(BasicLayout)即可。 ...

November 5, 2021 · 1 min · jiezi

关于vue.js:Vue-基础自查watchcomputed和methods的区别

1 前言创立一个Vue实例时,能够传入一个选项对象 const vm = new Vue({ data: { msg: 'hello' }, computed: {}, methods: {}, watch: {}})这个选项对象能够指定十分多的选项(或者说属性),和数据相干的选项有:包含但不限于data、methods、computed、watch等等 其中methods、computed、watch都能通过函数来对数据进行解决或作出响应,这三者有差别,但很容易混同 2 根底用法用script引入vue.js,上面的代码都在如下html中运行 <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Methods</title> <!-- 引入 vue.js --> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> </head> <body> </body> <script> </script></html>2.1 methods 办法methods选项中的定义的函数称为办法,在Vue实例化的过程中,methods对象中的办法将被混入到Vue实例中,成为Vue实例的办法。能够间接通过Vue实例拜访这些办法 <body> <div id="example"> <!-- 显示:a:1 --> <p>a:{{ plus() }}</p> </div></body><script> const vm = new Vue({ el: "#example", data: { a: 0, }, methods: { plus: function () { return this.a + 1; }, }, }); console.log(vm); // 查看控制台输入的vm,能够看到它有一个办法是:plus: ƒ (),⚠️留神是办法 console.log(vm.plus()); // 间接通过vm实例拜访办法,输入:1</script>须要被动调用methods中的函数能力执行,a的值扭转并不能让页面中的<p>a:{{plus()}}</a>跟着更新 ...

November 4, 2021 · 1 min · jiezi

关于vue.js:Vue-题记录

vue 父子组件加载程序父 beforeCreate父 created父 beforeMount子 beforeCreate子 created子 beforeMount子 mounted父 mounted子组件若有 props 的话更新程序是四步,若无的话两步不触发父亲的钩子。 父 beforeUpdate子 beforeUpdate子 updated父 updated父组件更新程序是 父 beforeUpdate子 deactivated父 updated销毁过程是 父 beforeDestroy子 beforeDestroy子 destroyed父 destroyed

November 4, 2021 · 1 min · jiezi

关于vue.js:Vue-修复了-watch-的-BUG

前言在之前的我的项目中,须要做全局谬误的收集和上报,最初有个头疼的问题就是 Vue watch 中的异步谬误无奈上报到 errorHandler 外面,而后在某一天我再次浏览 Vue 代码的时候,发现他在 2.6.13 版本上修复了这个问题,开心!!! 例子大家能够切换 Vue 的版本号,来看看成果,你会发现 <= 2.6.12 版本的 watch 都不会捕捉到异步谬误 <!-- vue 2.6.12 --><script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script><div id="app"> <button @click='num++'>{{ num }}</button></div><script> Vue.config.errorHandler = (err, vm, info) => { console.log('收集到谬误:', err) } new Vue({ el: '#app', data: { num: 100 }, watch: { async num() { // 加 await 是为了捕捉异步谬误 await this.errorFnc() } }, methods: { errorFnc() { return new Promise((resolve, reject) => { reject('promise 谬误') }) }, // 或者 async 函数 // async errorFnc() { // throw 'async 谬误' // }, } })</script>复制代码Vue 是如何解决的2.6.12 ...

November 4, 2021 · 2 min · jiezi

关于vue.js:vue-项目中以cdn引入的方式使用插件-减少打包体积

在index.html 中通过script 标签引入cdn链接 <html lang="zh"> <head> <title>vue-demo</title> <script src="https://cdn.jsdelivr.net/gh/zh-lx/pinyin-pro@latest/dist/pinyin-pro.js">这是引入的cdn链接</script> </head> <body> <div id="app"></div> </body></html>在vue.config.js中配置插件, 缩小打包体积 通过 webpack 的 externals 节点,来配置并加载内部的 CDN 资源。但凡申明在 externals 中的第三方依赖包,都不会被打包。 configureWebpack: config => { Object.assign(config, { externals: { pinyinPro: 'pinyin-pro' } }) }在 .eslintrc.js 中配置globals (如果应用了eslint) module.exports = { ... globals: { pinyinPro: 'readonly' // readonly = true } }index.vue 中应用 // script 中引入<script> const { pinyin } = pinyinPro const test = pinyin('阳光明媚') console.log(test) // yang guang ming mei</script>以上。 ...

November 4, 2021 · 1 min · jiezi

关于vue.js:nuxtjs-多环境变量配置

前言个别在咱们我的项目开发中,个别会有以下3个环境 开发环境也叫测试环境(test)RC环境也叫预公布环境(rc)线上环境(production)最近花了500块钱 搞了个配置较高 阿里服务器 来学习 node 及对应的框架,当初:,阿里云双11流动 1核2G1M,69元/1年,180元/3年 场景那么有一种状况是咱们须要在不同环境下辨别不同的api接口例如 测试环境(test) api=test.ydhtml.com预公布环境(rc) api=rc.ydhtml.com线上环境(production) api=ydhtml.com创立环境接下来咱们在我的项目的根目录中创立 env.js 文件内容如下 module.exports = { test: { MODE: 'test' }, rc: { MODE: 'rc', }, prod: { MODE: 'prod', }}配置好对应得环境之后,咱们在 package.json 下得 scripts 减少打包命令,如下"build:test": "cross-env MODE=test nuxt build","build:rc": "cross-env MODE=rc nuxt build","build:prod": "cross-env MODE=prod nuxt build",注入环境变量关上 nuxt.config.js 文件,减少以下代码 const env = require('./env')module.exports = { env: { NUXT_ENV: env[process.env.MODE] }}最初最初咱们在页面外面应用,代码如下 const api = { prod: 'http://ydhtml.com', test: 'http://test-ydhtml.com', rc: 'http://rc-ydhtml.com'}const baseURL = api[process.env.NUXT_ENV.MODE]

November 3, 2021 · 1 min · jiezi

关于vue.js:在VUE中低延迟300毫秒播放海康威视RTSP视频流支持H265

一、背景如果你问一个前端技术人员,近几年最火的前端框架技术是什么,必定会有人说VUE,的确VUE凭借其简略个性博得了大家的青睐,而近期公司有个我的项目,须要在VUE框架网页上播放RTSP实时视频。 小编对目前市场上的所有计划进行了测试,发现市面上行大部分计划都是转码转流计划,须要服务器不停的转码转流,不仅提早高,能达到几秒甚至几分钟,播放高清视频或者H.265格局视频容易卡顿,同时多路播放成果也差,比方WebAssembly甚至本地录像抓图性能都不能实现,很难用于商业。 二、计划1.服务器转流前端转码计划服务器端先把RTSP流用Web Socket或WebRTC推送到前端,再通过WASM转码MP4播放。此计划虽号称是无插件计划,然而须要服务器反对,两次转码导致提早较高,个别高达数秒甚至数分钟。此计划首屏画面显示很慢。因为须要服务器一直转码转流,对CPU和内存耗费较大,带宽占用高,长期综合应用老本也很高。如果多路播放或者看高分辨率或 H.265视频,很可能就会呈现卡顿、花屏等状况。 综合来看,此计划摄像头较少或者对提早、画面要求较低的需要,商用难堪重任。 2.服务器转码转流再转码计划原理是服务器端先把RTSP流转FLV后,再用Web Socket或WebRTC推送到前端,而后再转为MP4播放。目前在高版本浏览器(除IE外)中,曾经反对 WASM技术,能够应用此技术在终端电脑上把RTSP视频流转码后播放。此计划同样须要服务器的反对,因为在终端电脑转码,终端电脑配置好坏决定了播放品质,并且因为WASM只能软解码,无奈利用终端电脑的减速能力,且不反对多线程,不反对水印、字幕及本地录像及抓图等,多路播放或者H.265格局视频,也容易呈现卡顿、花屏等状况,大量占用电脑CPU和内存,电脑无奈再做其余事件,体验十分不好。 综合来看,此计划也尽量慎用。 3.低版本浏览器计划(VLC原生播放插件):2015年之前Chrome等浏览器还未勾销对 NPAPI插件反对的时候计划,持续应用低版本Chrome、Firefox等浏览器,通过VLC原生播放器间接播放,也不须要服务器反对,提早非常低,终端也能够应用硬件的减速能力,多路播放也毫无压力。 毛病也非常明显:无奈应用最新的浏览器和操作系统,不适宜商用。如果能解决高版本的Chrome、Firefox、Edge等浏览器应用,此计划无疑是最佳抉择! 4.最终降级计划:猿巨匠内嵌VLC原生播放程序猿巨匠的VLC播放程序是基于猿巨匠中间件提供的内嵌网页播放的专利技术,底层调用VLC客户端的ActiveX控件可实现在Chrome等高版本浏览器中内嵌播放海康威视、大华等摄像头的RTSP视频流。因为理论调用的是VLC本地原生播放控件,因而可充分利用本机硬件加速能力实现高效硬解码播放多路或高清视频(H.265),低提早至300毫秒,反对回访、抓图、录像,最多可反对25路同时播放,最低可用在Chrome 41、Firefox 50、Edge 80(Chromium内核)、360极速/平安、IE、Oprea 36、QQ等浏览器,也兼容运行于这些浏览器的最新版本。 与大华官网网页提早比照:https://www.bilibili.com/vide... 与海康威视官网网页提早比照:https://www.bilibili.com/vide...

November 2, 2021 · 1 min · jiezi

关于vue.js:Vue-input文本框自动获取焦点的问题

性能: 在文本框展现进去的那一刻,让它主动获取焦点 1.在input的框里写入 ref="iptRef"(起名用Ref为后缀,识别是援用) 先拿到DOM元素 2.在 methods 里调用 focus()办法, 如下图所示: 3.此时会发现报错,这是为什么呢?Cannot read property 'focus' of undefined意思是:无奈读取“focus”办法后面未定义的内容 (教训论证:正确理解) 报错起因:起因就出在"this.inputVisible = true",此时数据尽管变动了,然而文本框还没有渲染展现到页面上,所以就拿不到它的援用ref,去调用focus()办法就会报错为 undefined; 解决问题:Vue提供了一个办法 this.$nextTick(回调函数)组件的$nextTick(cd)办法,会把cd回调推延到下一个DOM更新周期之后执行.艰深的了解是:等组件的DOM 更新实现之后,在执行cd回调函数.从而保障cd回调函数能够操作到最新的 DOM 元素. 留神: 如果在生命周期函数里的 Updated()中用,会报错,因为Updated函数当数据发生变化的时候就会从新渲染组件DOM构造 (生命周期函数和methods是并列关系)

November 2, 2021 · 1 min · jiezi

关于vue.js:vue中-thisxx使用说明

this.$xx是零碎定义的属性,罕用的: this.$message,this.$route,this.$router,this.$ref(已写过),this.$confirm,this.$emit,this.$store,this.$loading... ### 1.this.$confirm , this.$messageremoveQuestion(id) { this.$confirm("确定删除吗?", "提醒", { confirmButtonText: "确定", cancelButtonText: "勾销", type: "warning", }).then(() => { AdminApi.library .removeQuestion({ id: id, pageName: this.pageName, }) .then((res) => { if (res.status == "200") { this.popVisible = false; this.$message.success("操作胜利!"); this.getQuestionDict(); } }); }); },### 2.this.$router,this.$routesetTimeout(() => { this.$router.push("/enterprise/info/" + this.eid); }, 3000);$this.$router.push()获取参数:this.$route.params.userId 3.this.$emit组件之间的通信(模态框点击确定提交并敞开模态框)### 4.this.$store 数据缓存store/index.jsimport Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ state: { userId: localStorage.getItem('userId'), userEmail: localStorage.getItem('userEmail'), userMobile: localStorage.getItem('userMobile'), }, getters: { isLogin(state) { return state.userId && state.userId > 0 }, userId(state) { return state.userId; }, userEmail(state) { return state.userEmail; }, userMobile(state) { return state.userMobile; } }, mutations: { login(state, user) { state.userId = user.id; state.userEmail = user.email; state.userMobile = user.mobile; localStorage.setItem('userId', user.id); localStorage.setItem('userEmail', user.email); localStorage.setItem('userMobile', user.mobile); }, logout(state) { state.userId = 0; state.userEmail = ''; state.userMobile = ''; localStorage.removeItem('userId'); localStorage.removeItem('userEmail'); localStorage.removeItem('userMobile'); } }})export default store应用:this.$store.commit("login", user); this.$store.getters.isLogin ? "是" : "否"; this.form.operatorName = this.$store.getters.adminName;

November 1, 2021 · 1 min · jiezi

关于vue.js:文档菜单生成

https://blog.csdn.net/csdnzou...i5ting_toc -f manual.md -ohttp://caibaojian.com/vuepres...生成依赖文件都是绝对路径 选中的菜单不高亮左边内容局部太窄不晓得咋改

November 1, 2021 · 1 min · jiezi

关于vue.js:vue-selecttree清除-搜索结果-提示文字展示中文

<treeselect v-model="formInline.department" clear-value-text="革除" :multiple="false" no-options-text="暂无数据" :normalizer="normalizer" :options="menuOptions" placeholder="抉择部门" />之前成果之后:略

November 1, 2021 · 1 min · jiezi

关于vue.js:Vue3-Ts-封装axios

封装思路index.ts咱们须要在src的根目录下创立一个axios文件夹,其中创立一个index.ts文件,这个文件次要用来封装axios的配置(实例化申请配置、申请拦截器、相应拦截器)及相应的办法(登录跳转、音讯提醒、错误处理等) base.ts这个文件次要用于我的项目扩大的状况下 不同模块须要调用不同接口(申请的base地址 baseURL )而后期做的筹备,便于前期的保护 request.ts次要用于封装基于axios配置的get/post/put/delete等应用办法。 api.ts在前面的 main.ts 中引入该模块,包含所有接口数据信息写入该文件中。 index.ts封装如下。思考到繁多职责,index这块只封装axios // index.tsimport axios, { AxiosRequestConfig, Method } from "axios";import router from "@/router";import store from "@/store";import { message } from 'ant-design-vue'import { storage } from "../storage/storage";import { dataList } from "@/components/aspin/data";/** * 跳转登录页 * 携带以后页面路由,以期在登录页面实现登录后返回以后页面 */const toLogin = () => { router.replace({ name: 'LoginPage', });}/** * 申请失败后的谬误对立解决 * @param {Number} status 申请失败的状态码 */const errorHandle = (status: number, other: string) => { // 状态码判断 switch (status) { case 302: message.error('接口重定向了!'); break; case 400: message.error("收回的申请有谬误,服务器没有进行新建或批改数据的操作==>" + status) break; // 401: 未登录 // 未登录则跳转登录页面,并携带以后页面的门路 // 在登录胜利后返回以后页面,这一步须要在登录页操作。 case 401: //重定向 message.error("token:登录生效==>" + status + ":" + store.state.Roles) storage.remove(store.state.Roles) storage.get(store.state.Roles) router.replace({ path: '/Login', }); break; // 403 token过期 // 革除token并跳转登录页 case 403: message.error("登录过期,用户失去受权,然而拜访是被禁止的==>" + status) // store.commit('token', null); setTimeout(() => { router.replace({ path: '/Login', }); }, 1000); break; case 404: message.error("网络申请不存在==>" + status) break; case 406: message.error("申请的格局不可得==>" + status) break; case 408: message.error(" 申请超时!") break; case 410: message.error("申请的资源被永恒删除,且不会再失去的==>" + status) break; case 422: message.error("当创立一个对象时,产生一个验证谬误==>" + status) break; case 500: message.error("服务器产生谬误,请查看服务器==>" + status) break; case 502: message.error("网关谬误==>" + status) break; case 503: message.error("服务不可用,服务器临时过载或保护==>" + status) break; case 504: message.error("网关超时==>" + status) break; default: message.error("其余谬误谬误==>" + status) }}// 定义接口interface PendingType { url?: string; method?: Method; params: any; data: any; cancel: any;}// 勾销反复申请const pending: Array<PendingType> = [];const CancelToken = axios.CancelToken;// 移除反复申请const removePending = (config: AxiosRequestConfig) => { for (const key in pending) { const item: number = +key; const list: PendingType = pending[key]; // 以后申请在数组中存在时执行函数体 if (list.url === config.url && list.method === config.method && JSON.stringify(list.params) === JSON.stringify(config.params) && JSON.stringify(list.data) === JSON.stringify(config.data)) { // 执行勾销操作 list.cancel('操作太频繁,请稍后再试'); // 从数组中移除记录 pending.splice(item, 1); } }};/* 实例化申请配置 */const instance = axios.create({ headers: { //php 的 post 传输申请头肯定要这个 不然报错 接管不到值 "Content-Type": "application/json;charset=UTF-8", "Access-Control-Allow-Origin-Type": '*' }, // 申请时长 timeout: 1000 * 30, // 申请的base地址 TODO:这块当前依据不同的模块调不同的api baseURL: process.env.VUE_APP_API_URL, // ? "测试" // : "正式", // 示意跨域申请时是否须要应用凭证 withCredentials: false,})/** * 申请拦截器 * 每次申请前,如果存在token则在申请头中携带token */instance.interceptors.request.use( config => { removePending(config); config.cancelToken = new CancelToken((c) => { pending.push({ url: config.url, method: config.method, params: config.params, data: config.data, cancel: c }); }); // 登录流程管制中,依据本地是否存在token判断用户的登录状况 // 然而即便token存在,也有可能token是过期的,所以在每次的申请头中携带token // 后盾依据携带的token判断用户的登录状况,并返回给咱们对应的状态码 // 而后咱们能够在响应拦截器中,依据状态码进行一些对立的操作。 // const token = store.state.token; // localStorage.setItem('token', token); if (storage.get(store.state.Roles)) { store.state.Roles config.headers.Authorization = storage.get(store.state.Roles); } return config; }, error => { message.error(error.data.error.message); return Promise.reject(error.data.error.message); })// 响应拦截器instance.interceptors.response.use(function (config) { dataList.show = true removePending(config.config); // 申请胜利 if (config.status === 200 || config.status === 204) { setTimeout(() => { dataList.show = false }, 400) return Promise.resolve(config); } else { return Promise.reject(config); } // 申请失败}, function (error) { const { response } = error; if (response) { errorHandle(response.status, response.data.message); // 超时从新申请 const config = error.config; // 全局的申请次数,申请的间隙 const [RETRY_COUNT, RETRY_DELAY] = [3, 1000]; if (config && RETRY_COUNT) { // 设置用于跟踪重试计数的变量 config.__retryCount = config.__retryCount || 0; // 查看是否曾经把重试的总数用完 if (config.__retryCount >= RETRY_COUNT) { return Promise.reject(response || { message: error.message }); } // 减少重试计数 config.__retryCount++; // 发明新的Promise来解决指数后退 const backoff = new Promise<void>((resolve) => { setTimeout(() => { resolve(); }, RETRY_DELAY || 1); }); // instance重试申请的Promise return backoff.then(() => { return instance(config); }); } return Promise.reject(response); } else { // 解决断网的状况 // eg:申请超时或断网时,更新state的network状态 // network状态在app.vue中管制着一个全局的断网提醒组件的显示暗藏 // 后续减少断网状况下做的一些操作 store.commit('networkState', false); }})// 只须要思考繁多职责,这块只封装axiosexport default instancebase.ts辨别每个模块的 baseUrl 不便前期保护治理 ...

November 1, 2021 · 4 min · jiezi

关于vue.js:Vue-调整elselect高度之后-箭头错位问题解决

利用深度选择器调整el-select高度::v-deep {height: 30px;}胜利之后,el-select箭头错位,状况如下图 解决办法:批改el-input__icon的height属性,同时借助绝对定位实现地位挪动。.el-input__icon { height: 44px; //设置高度,icon元素复原原来的高度,这时arror能力垂直居中 position: relative; top: -7px; // 元素整体上移,让箭头也居中}

October 31, 2021 · 1 min · jiezi

关于vue.js:常见框架的-Diff-算法

残缺高频题库仓库地址:https://github.com/hzfe/awesome-interview 残缺高频题库浏览地址:https://febook.hzfe.org/ 相干问题虚构 DOM 是什么虚构 DOM 的作用讲一下 Vue 的 Diff 算法答复关键点虚构 DOM 工夫复杂度O(n) 古代网站大多具备简单布局,大量的节点和交互操作等特色,间接操作 DOM 办法不当带来的性能问题不可漠视。虚构 DOM 的实质是 JavaScript 对象,它能够代表 DOM 的一部分特色,是 DOM 的形象简化版本。通过事后操作虚构 DOM,在某个机会找出和实在 DOM 之间的差别局部并从新渲染,来晋升操作实在 DOM 的性能和效率。 为达到这个目标,还须要关注两个问题:什么时候从新渲染,怎么高效抉择从新渲染的范畴。找出须要从新渲染的范畴,就是 Diff 的过程。React 和 Vue 的 Diff 算法思路基本一致,只对同层节点进行比拟,利用惟一标识符对节点进行辨别。 知识点深刻1. Diff 算法两棵树的比对和更新,波及到树编辑间隔(Tree Editing Distance)算法:将一棵树转化为另一棵树的最小操作老本。操作类型包含:删除、插入、批改。工夫复杂度为 O(n^3)。 为了升高工夫复杂度,React 和 Vue 的思路是基于以下两个假如条件,缩减递归迭代规模,将 Diff 算法的工夫复杂度升高为 O(n): 雷同类型的组件产生雷同的 DOM 构造,反之亦然。所以不同类型组件的构造不须要进一步递归 Diff。同一层级的一组节点,能够通过惟一标识符进行辨别。2. React Reconciliation在 React 中,将虚构 DOM 和实在 DOM 进行比对而后同步的过程被称为 Reconciliation(和谐),Fiber 是 React 16 中新的和谐引擎。它的次要指标是实现虚构 DOM 的增量渲染。 ...

October 30, 2021 · 2 min · jiezi

关于vue.js:vuecli2-components的使用

<template> <div> <div class="crumbs"> <el-breadcrumb separator="/"> <el-breadcrumb-item> <i class="el-icon-lx-cascades"></i> 体系配置 </el-breadcrumb-item> </el-breadcrumb> </div> <div class="container" v-if="hasObject('options')"> <div class="handle-box"> <el-form @submit.native.prevent> <el-input v-model="query.keyword" placeholder="id" class="handle-input mr10" @keyup.enter.native="search" > </el-input> <el-select v-model="query.tab" placeholder="类别" class="handle-select mr10" > <el-option key="" label="全副" value="">全副</el-option> <el-option v-for="(item, key) in options.checkSystemTab" :key="key" :label="item" :value="key" > {{ item }} </el-option> </el-select> <el-select v-model="query.tpl" placeholder="模板" class="handle-select-tpl mr10" > <el-option v-for="(item, key) in options.webConfigKV['tpl']" :key="key" :label="item" :value="key" > {{ item }} </el-option> </el-select> <el-button type="primary" icon="el-icon-search" @click="search" >搜寻</el-button > <el-button type="primary" @click="addCheck">增加</el-button> <el-button type="primary" @click="eximportVisible = true" >导入导出</el-button > <el-button type="primary" @click="referVisible = true">查看参考</el-button> </el-form> </div> <el-table :data="tableData" :cell-style="{ background: '#fff' }" border tooltip-effect="dark" style="width: 100%" > <el-table-column prop="id" label="ID" width="100" align="center" ></el-table-column> <el-table-column prop="control" label="管制项" min-width="200" ></el-table-column> <el-table-column prop="desc" label="形容" width="250"></el-table-column> <el-table-column prop="purpose" label="查看目标" width="250" ></el-table-column> <el-table-column label="类别" width="100"> <template slot-scope="scope"> {{ options.checkSystemTab[scope.row.tab] || "" }} </template> </el-table-column> <el-table-column label="操作" width="180" align="center"> <template slot-scope="scope"> <el-button type="text" icon="el-icon-edit" @click="editCheck(scope.row.id, 'edit')" ></el-button> <el-button type="text" icon="el-icon-view" :title="'预览法律依据[' + scope.row.id + ']'" @click="editCheck(scope.row.id, 'previewLaw')" > </el-button> <el-button type="text" icon="el-icon-view" :title="'预览规范根据[' + scope.row.id + ']'" @click="editCheck(scope.row.id, 'previewStandard')" ></el-button> <el-button type="text" icon="el-icon-close" title="删除" @click="removeCheck(scope.row.id)" ></el-button> </template> </el-table-column> </el-table> <div class="pagination"> <el-pagination background layout="total, prev, pager, next" :current-page="parseInt(query.page) || 0" :page-size="parseInt(query.limit) || 0" :total="parseInt(query.total) || 0" @current-change="toPage" > </el-pagination> </div> </div> <el-dialog :title="dialogTitle" :visible.sync="popVisible" v-if="popVisible" width="80%"> <el-form :ref="pageName" :rules="rules" :model="check" label-width="100px" > <el-form-item label="ID" prop="id"> <el-input v-model="check.id"></el-input> </el-form-item> <el-form-item label="管制项" prop="control"> <el-input v-model="check.control"></el-input> </el-form-item> <el-form-item label="形容" prop="desc"> <el-input v-model="check.desc"></el-input> </el-form-item> <el-form-item label="查看目标" prop="purpose"> <el-input v-model="check.purpose"></el-input> </el-form-item> <el-form-item label="危险条件" prop="dangerConditions"> <TableDangerCondition :options="options" :instance="check"> </TableDangerCondition> </el-form-item> <el-form-item label="存在条件" prop="conditions"> <el-input :value="JSON.stringify(check.conditions)" @input="handleChange($event, 'conditions')" ></el-input> </el-form-item> <el-form-item label="相干问题" prop="source"> <el-input :value="JSON.stringify(check.source)" @input="handleChange($event, 'source')" ></el-input> </el-form-item> <el-form-item label="类别" prop="tab"> <el-select v-model="check.tab" width="100"> <el-option v-for="(item, key) in options.checkSystemTab" :key="key" :value="key" :label="item" >{{ item }}</el-option ></el-select > </el-form-item> <el-form-item label="规范根据" prop="standard"> <Editor :content="check.standard" ref="standardEditor"></Editor> </el-form-item> <el-form-item label="法律依据" prop="law"> <Editor :content="check.law" ref="lawEditor"></Editor> </el-form-item> <el-form-item label="模板" prop="tpl"> <el-select v-model="check.tpl" class="handle-select-tpl"> <el-option v-for="(item, key) in options.webConfigKV['tpl']" :key="key" :value="key" :label="item" >{{ item }}</el-option ></el-select > </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="popVisible = false">取 消</el-button> <el-button type="primary" @click="saveCheck">确 定</el-button> </span> </el-dialog> <el-dialog title="预览法律依据" :visible.sync="previewVisibleLaw" width="50%" > <div v-html="check.law" class="preview-html"></div> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="previewVisibleLaw = false" >确 定</el-button > </span> </el-dialog> <el-dialog title="预览规范根据" :visible.sync="previewVisibleStardard" width="50%" > <div v-html="check.standard" class="preview-html"></div> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="previewVisibleStardard = false" >确 定</el-button > </span> </el-dialog> <ExImport :options="options" :eximportVisible="eximportVisible" @closeExImport="closeExImport" :source="pageName" ></ExImport> <!-- 参考模态框 --> <Refer :referVisible="referVisible" @closeRefer="closeRefer"></Refer> </div></template><script>import { Common } from "@admin/mixin/common";import { Has } from "@admin/mixin/has";import { Rules } from "@admin/mixin/rules";import { Library } from "@admin/mixin/library";import Editor from "../common/editor";import TableDangerCondition from "./tableDangerCondition.vue";import ExImport from "./eximport.vue";import Refer from "./refer.vue";export default { mixins: [Common, Rules, Has, Library], name: "CheckSystem", components: { Editor, TableDangerCondition, ExImport, Refer, }, data() { return { pageName: "checkSystem", check: {}, rulesInfo: { id: "请输出id", control: "请输出管制项", desc: "请输出形容", purpose: "请输出查看目标", tpl: "请抉择模板", }, }; }, methods: { handleChange(e, field) { this.check[field] = JSON.parse(e); }, }, mounted() { this.getCheckDict(); },};</script> ...

October 28, 2021 · 3 min · jiezi

关于vue.js:如何在vuex中对token进行存储

1:在Login.vue中通过http申请获取到token和用户信息 //依据api接口获取tokenthis.$axios .post(url, { username: this.loginForm.username, password: this.loginForm.pass, }) .then((res) => { // console.log(res.data); this.$message.success('登录胜利') let data = res.data //依据store中set_token办法将token保留至localStorage/sessionStorage中,data["Authentication-Token"],获取token的value值 this.$store.commit('set_token', data['Authentication-Token']) }) .catch((error) => { // this.$message.error(error.status) this.loading = false // console.log(error) })2:在store.js中对token状态进行监管 import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({ state: { token: '' }, mutations: { set_token(state, token) { state.token = token sessionStorage.token = token }, del_token(state) { state.token = '' sessionStorage.removeItem('token') } }})3: 在touter/index.js 中 ...

October 27, 2021 · 1 min · jiezi

关于vue.js:Vue2页面刷新

router刷新这种办法页面会一瞬间的白屏 this.$router.go(0)location这种也是一样,画面一闪 location.reload()以上整个浏览器进行了从新加载,闪动,体验不好 provide/inject容许一个先人组件向其所有子孙后代注入一个依赖,不管组件档次有多深,并在起上下游关系成立的工夫里始终失效。 provide:选项应该是一个对象或返回一个对象的函数。该对象蕴含可注入其子孙的属性。 inject:一个字符串数组,或一个对象,对象的 key 是本地的绑定名 搭配provide、inject应用,首先在主页面 app.vue <keep-alive include="GjTable"> <router-view v-if="isRouterAlive"></router-view ></keep-alive>js export default { provide () { return { reload: this.reload }, data () { return { isRouterAlive: true } }, methods: { reload () { this.isRouterAlive = false this.$nextTick(function () { this.isRouterAlive = true }) } }}在页面注入app.vue组件提供(provide)的 reload 依赖,在逻辑实现之后(删除或增加...),间接this.reload()调用,即可刷新以后页面 inject: ['reload'], //调用刷新: // 此页面加了缓存须要从新加载数据 this.getgjtype('vue') this.reload() // 刷新页面

October 27, 2021 · 1 min · jiezi

关于vue.js:携手企业创新-共创美好未来低代码助力企业数字化

本文已获原作者受权转载 一、后疫情时代,我国中小制造业向何处去?众所知周,中国是一个制造业大国,目前中低端市场竞争加剧,供大于求,产能过剩,而且同质化竞争十分重大,订单利润降落。如何去产能成了这些行业首当其冲的问题。与此同时,我国中小制作企业还面临着诸多其它问题,如厂房、原材料、人工、节能环保等老本一直飙升,电荒、用工荒,企业经营压力增大;粗放式治理让企业难以冲破老本瓶颈;结构性劳动力短缺,人才匮乏,企业不足翻新潜能;企业家精力缺失,企业内迁和外迁。 近两年,加之国内外新冠疫情的暴发,无异于成为压死骆驼的最初一根稻草,进一步加剧了中小制作企业的生存危机,如何冲破重围,实现转型降级,火烧眉毛! 1.软件行业推出各种信息化解决方案。 信息化建设是企业疾速倒退的助推器,企业要倒退,信息化建设需走在后面。为进步企业的信息化管理水平,各种软件研发公司堪称是殚精竭虑,一直新陈代谢,利用新技术和新平台,打造了各种行业化的业余零碎,如ERP、进销存、CRM、HR、财务软件等等。 依据中国产业调研网的《中国中小企业信息化行业现状剖析与发展前景钻研报告(2020年版)》显示,我国中小企业只有30%左右施行了ERP和CRM计划,绝大多数企业的信息化程度仍停留在文字处理、财务管理等办公自动化及劳动人事治理阶段,ERP上线成功率不到20%。 2.企业病急乱投医,征询治理计划未能解决中小企业转型难题。 当企业都在寻找脱困良方的时候,市面上各种类型的征询公司纷纷充当起了“医生”的角色,深刻各个企业进行问诊,从企业的营销策略、管理策略、员工激励、流程优化等多个维度为企业把脉,其中甚至不乏“跳大神”的江湖骗子为企业乱开药方。还有一些企业管理者不惜花重金加入MBA、EMBA,以及各种“打鸡血式”的胜利学速成班,堪称“病急乱投医”。 在经济新常态下,为推动中小企业转型降级,各个领域的专家学者投入了很多精力和资源,以大多数经营艰难的中小企业为钻研对象,纷纷围绕如何加重企业累赘、提供资金搀扶、如何帮忙企业取得订单等方面提出了各种策略,试图通过外部环境的扭转让企业从每况日下的经营好转中脱身进去。然而这些钻研带来的变动微不足道,不仅未能缓解中小微企业的生存危机,部分行业还呈现了进一步好转的状况。 二、中小制作企业治理上的外围问题1.中小制造业不晓得应该做什么。治理的外围就是对资源的优化配置产生最大的经济效益,具体的办法就是调度公司无限的资源投入到可能产生最大经济效益的机会中,并专一于这些方向。然而,在对各个企业中的资源和工作量理论调配的状况进行了剖析之后发现,大量的工夫、工作、注意力和金钱首先是投向“问题”而不是机会。另一种状况则是投向一些无论做得再好对业绩也没有什么影响的方向上。 企业不是天然景象,而是一种社会景象。在社会环境下,为数很少的业务——10%,至少20%发明了90%的业绩,而其余的大多数业务合起来也只发明出剩下的10%的业绩(以下简称“二八定律”)。但事实中只有极少数企业家抓住了这一简略的企业治理法则。这意味着,大多状况下,企业80%的精力投向了实际上毫无功效的工作上。他们的分配原则是基于“业务量”的须要而不是可能发明多少效益。事实上,最低廉的和最具备生产潜力的资源(如训练有素的人员)将不得不为功效起码的业务耗心劳神。 2.不足成本核算的无效工具。如果人们对“无效”和“有效率”的差异分辨不清的话,他们也就同样分不清“做正确的事”和“正确地做事”。以极高的效率实现基本不须要做的工作,是最大的无用功。企业真正须要的是:识别何为效益(或最佳成绩)的办法;而后专一于这些方向。 传统成本会计法对间接成本以摊销形式入账,难以统计出产品的实际成本。随着治理技术的一直晋升,一种新型的成本核算办法——作业成本法(即ABC成本法)逐步被各大企业所承受。作业成本法把间接老本和间接成本(包含期间费用)作为产品(服务)耗费作业的老本等同地看待,拓宽了老本的计算范畴,使计算出来的产品(服务)老本更精确实在。这种新型的核算办法能够帮忙管理人员很容易地发现价值是如何实现最大化的,企业业绩是如何被进步的。有助于大幅度降低制作老本,在某些状况下可能高达三分之一,甚至更高。 3.不晓得如何有效率的做事。中小制作企业大多沿用的是传统家族式小作坊模式,公司的组织构造、管理模式、薪酬制度重大妨碍了效率的晋升。德鲁克在《新生产力的挑战》的论文中具体阐述了如何有效率的做事,具体的步骤是:第一步先定义工作的工作;第二步专一于工作的工作;第三步对业绩进行定义,制订以后果为导向的薪酬制度,多劳多得;第四步是管理层与成员之间要造就一种伙伴关系;第五步是要继续一直的学习及分享。 4.对海量信息的误会和适度依赖。随着科技的倒退,各种软件系统的涌现,为企业推送了空前丰盛的数据信息,很多企业认为信息越多越好,于是常常陷入于繁杂的数据分析之中。对数据适度的依赖和敏感,以及海量的错误信息的影响,极易对经营决策产生重大的副作用。 三、商道颠覆性的解决方案商道在线软件有限公司成立于2012年,是一家致力于为中小制造业提供ERP服务的软件公司。自成立之日起,公司就以“优化企业资源配置,帮助企业转型降级”作为倒退方向,并为之不懈努力。近十年来,商道在线软件有限公司为珠三角地区上泛滥中小制作企业提供了行之有效的ERP服务,以当先的技术和专业化的服务,为客户发明价值,博得了泛滥客户的好评。 历经多年,商道公司为中小制作企业量身打造了一款通用型的ERP软件,实用于电子加工、数码产品与零配件生产、电器组装、注塑、LED、灯具照明、电池、五金冲压、模具加工等行业。软件简略易学,上线周期短,应用成果好。具体而言,商道ERP具备以下外围劣势。 1.以作业成本法为成本核算的领导办法。商道ERP以作业成本法为成本核算准则,将订单接管、产品研发、产品生产、直到送货实现等整个流程中的次要作业产生老本归集到老本核心,由此统计出每个订单的理论产生老本,具体包含业务老本、人工成本、资料老本、设施老本、工夫老本、税务老本等。有了这些老本数据信息,企业管理者就能够通过老本核心有针对性地对每个作业流程进行老本管控,进步整体效益。 2.将“二八定律”融入其中。通过表单录入,零碎主动核算每一款产品的作业老本,以及每个订单的毛利润,而后再依照二八定律,主动统计出为企业发明80%利润的次要客户和产品。从而领导企业优化资源配置,不再贪大求全,做减法,重点关注产生最大效益的劣势我的项目。 3.提倡外部市场化,进步企业生产效率。商道公司通过多年的企业治理实际,翻新了一种颠覆性的企业运作模式,即“外部市场化”。具体做法是,勾销以往科层式的部门治理,将原来的生产部门按技术职能组建成若干个项目组,公司接单后再以外部承包的模式分包给各个项目组,按我的项目进行独立验收结算。这种做法能够做大限度地激发员工的积极性和创造性。 4.去繁就简,为企业提供最无效的经营数据。商道ERP抓住企业的外围问题,抓大放小,重点关注生产经营的外围老本,如人工、机台、资料等老本投入,淡化低值易耗品的开销;同时精准统计企业与客户、供应商、外部承包部门之间的对账结算信息。而其余ERP关注的仅是繁冗的组织构造、流程表单、工艺治理等数据。商道ERP去繁就简,让企业屏蔽信息“噪声”,疾速把握有用的数据“信号”,从而疾速做出正确的经济决策。 四、商道ERP案例目前,商道ERP的信息化解决方案曾经成熟稳固,实用面广,通用性强,服务形式已造成标准化,具备了跨地区、跨行业的复制条件,能在短时间为企业带来微小的扭转,产生可观的经济效益。已有为数不少的制作企业依附咱们的ERP零碎进行全面的成本核算,逐步形成了企业的外围竞争力,并在外部市场化的模式领导下进行了外部改制,获得了十分好的功效。 1.助力五鑫公司转型降级深圳市五鑫科技有限公司主营塑胶模具加工和注塑成型业务,同周边的中小型模具塑胶企业一样,面临订单有余,企业利润急速降落的生存危机。2014年,五鑫公司胜利引入了趋于成熟的商道ERP零碎,全面进行企业信息化改革。 在确定主攻中高端精细模具市场后,五鑫公司对外部管理模式进行了大刀阔斧的组织变革,全面推行“外部市场化”模式。具体做法是:将模具设计、模具组装、注塑等生产部门独立进去,变成了多个自负盈亏的“小单位”;将自有的厂房和大型加工设施出租给技术工匠,而后以适度竞争的形式,由公司对立发单给各个“小单位”,自主报价,自负盈亏。这样一来,生产部门的工人们由以往为公司干活转变成了为本人干活,积极性和主动性失去了极大晋升,公司也因而缩小了许多繁杂的治理环节,老本失去了很好的管制;次要精力更集中于客户服务、生产服务和产品设计研发上,以后利润率在20%以上。 表2:五鑫公司改革前后经营指标比照 2.帮忙千与田公司扭亏为盈东莞千与田电子有限公司是一家劳动密集型的日资线束工厂,随着市场竞争加剧,企业经营老本居高不下,在传统管理模式下,公司经营继续下滑,间断多年亏损。2018年底胜利引进外部市场化模式。在一年多工夫里,营业额稳步增长,公司人员规模由原来的近580人精简到200多人,单工资一项一年就缩小了两千万以上老本收入。仅两年工夫里,公司的利润率由负4%回升到盈利6.5%。千与田的转型胜利充分证明了外部市场化模式是一种见效快的企业治理新模式。 五、打造基于低代码/零代码平台的商道ERP这些年来,商道ERP在为客户提供服务的过程中发现,企业为了适应市场需求,会一直衍生出了大量数字化利用需要。而传统的开发方式须要大量的IT人员去消化这些需要,造成开发成本的居高不下,传统的软件开发形式周期长,客户体验差等起因在很长一段时间内,始终制约着商道ERP的倒退。 和国内许多企业管理软件提供商一样,正当商道ERP感到困惑迷茫之际,低代码时代的降临,让咱们看到了新的心愿。用“柳暗花明疑无路,柳暗花明又一村”来形容,一点也不为过。 低代码开发平台能够解放开发生产力,将开发利用的一些工作调配到业务人员身上。这样也更有利于业务人员依据需要去开发利用,打造更加合乎用户、客户的企业应用。低代码平台的位置越来越重要,也是企业减速实现数字化转型,晋升业务敏捷性、效率性的关键所在。 明道云,是国内当先的零代码利用平台产品,深受企业IT用户青睐,并在企业数字化建设中表演重要的角色。明道云的劣势在于:进步开发效率,降低成本,更好满足客户定制需要,真正帮忙更多企业实现数字化转型。 去年年底咱们接触了明道云,通过零碎的培训学习后,咱们尝试用明道云帮忙了几家企业进行低代码零碎开发,反应十分不错。随后,咱们很快依靠明道云平台搭建了一套全面反对外部市场化模式的行业通用版ERP。 以后,我国制造业正面临着逐渐从价值链的低端向中高端,从制作大国向制作强国转变的要害历史期间。以信息化和工业化的高层次深度交融为次要特色的制造业信息化建设与翻新驱动,是我国从制作大国迈向制作强国的重要策略动作。面向未来,商道在线软件有限公司将依靠低代码开发平台,打造更加先进的ERP零碎,降本增效,助推企业转型降级。商道ERP期待与更多的中小制作企业携手单干,共创美好未来。 注:如您对本文上述所提计划感兴趣可分割本文作者吕先生:13923726819(深圳市商道在线软件有限公司)

October 27, 2021 · 1 min · jiezi

关于vue.js:SpringCloud微服务实战搭建企业级开发框架七自定义通用响应消息及统一异常处理

 平时开发过程中,无可避免咱们须要解决各类异样,所以这里咱们在公共模块中自定义对立异样,Spring Boot 提供 @RestControllerAdvice 注解对立异样解决,咱们在GitEgg_Platform中新建gitegg-platform-boot子工程,此工程次要用于Spring Boot相干性能的自定义及扩大。1、批改gitegg-platform-boot的pom.xml,增加spring-boot-starter-web和swagger依赖,设置optional为true,让这个包在我的项目之间依赖不传递。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.gitegg.platform</groupId> <artifactId>gitegg-platform-swagger</artifactId> <optional>true</optional> </dependency>2、自定义通用响应音讯类,Result和PageResult,一个是一般响应音讯,一个是分页响应音讯。Result类: package com.gitegg.platform.boot.common.base;import com.gitegg.platform.boot.common.enums.ResultCodeEnum;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.*;/** * @ClassName: Result * @Description: 自定义通用响应类 * @author GitEgg * @date 2020年09月19日 下午9:24:50 */@ApiModel(description = "通用响应类")@Getter@ToStringpublic class Result<T> { @ApiModelProperty(value = "是否胜利", required = true) private boolean success; @ApiModelProperty(value ="响应代码", required = true) private int code; @ApiModelProperty(value ="提示信息", required = true) private String msg; @ApiModelProperty(value ="响应数据") private T data; /** * * @param code * @param data * @param msg */ private Result(int code, T data, String msg) { this.success = ResultCodeEnum.SUCCESS.code == code; this.code = code; this.msg = msg; this.data = data; } /** * * @param resultCodeEnum */ private Result(ResultCodeEnum resultCodeEnum ) { this(resultCodeEnum.code, null, resultCodeEnum.msg); } /** * * @param resultCodeEnum * @param msg */ private Result(ResultCodeEnum resultCodeEnum , String msg) { this(resultCodeEnum, null, msg); } /** * * @param resultCodeEnum * @param data */ private Result(ResultCodeEnum resultCodeEnum , T data) { this(resultCodeEnum, data, resultCodeEnum.msg); } /** * * @param resultCodeEnum * @param data * @param msg */ private Result(ResultCodeEnum resultCodeEnum , T data, String msg) { this(resultCodeEnum.code, data, msg); } /** * * * @param data 数据 * @param <T> T 响应数据 * @ */ public static <T> Result<T> data(T data) { return data(data, ResultCodeEnum.SUCCESS.msg); } /** * * * @param data 数据 * @param msg 音讯 * @param <T> T 响应数据 * @ */ public static <T> Result<T> data(T data, String msg) { return data(ResultCodeEnum.SUCCESS.code, data, msg); } /** * * * @param code 状态码 * @param data 数据 * @param msg 音讯 * @param <T> T 响应数据 * @ */ public static <T> Result<T> data(int code, T data, String msg) { return new Result<>(code, data, msg); } /** * 返回Result * * @param * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> success() { return new Result<>(ResultCodeEnum.SUCCESS); } /** * 返回Result * * @param msg 音讯 * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> success(String msg) { return new Result<>(ResultCodeEnum.SUCCESS, msg); } /** * 返回Result * * @param * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> success(ResultCodeEnum resultCodeEnum ) { return new Result<>(resultCodeEnum); } /** * 返回Result * * @param * @param msg 提示信息 * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> success(ResultCodeEnum resultCodeEnum , String msg) { return new Result<>(resultCodeEnum, msg); } /** * 返回Result * * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> error() { return new Result<>(ResultCodeEnum.ERROR, ResultCodeEnum.ERROR.msg); } /** * 返回Result * * @param msg 音讯 * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> error(String msg) { return new Result<>(ResultCodeEnum.ERROR, msg); } /** * 返回Result * * @param code 状态码 * @param msg 音讯 * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> error(int code, String msg) { return new Result<>(code, null, msg); } /** * 返回Result * * @param * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> error(ResultCodeEnum resultCodeEnum ) { return new Result<>(resultCodeEnum); } /** * 返回Result * * @param * @param msg 提示信息 * @param <T> T 响应数据 * @返回Result */ public static <T> Result<T> error(ResultCodeEnum resultCodeEnum , String msg) { return new Result<>(resultCodeEnum, msg); } /** * * @param <T> * @param flag * @return */ public static <T> Result<T> result(boolean flag) { return flag ? Result.success("操作胜利") : Result.error("操作失败"); }}PageResult类: ...

October 27, 2021 · 7 min · jiezi

关于vue.js:Vue-thisrefs的使用

<template> <div class="hello"> <h1>{{ msg }}</h1> <div id="test" ref="div1"> <input type="text" ref="input1" name="name" /> <button @click="add">增加</button> </div> </div></template><script>export default { name: 'HelloWorld', data () { return { msg: 'Welcome to Your Vue.js App' } }, methods:{ add(){ // this.$refs.input1.value = '22'; let input1 = this.$refs.input1; let div1 = this.$refs.div1; console.log(input1,div1); } }}

October 27, 2021 · 1 min · jiezi

关于vue.js:vuetable自定义表格数据

<template> <v-app> <v-main> <v-btn class="error" @click="btnClick">测试</v-btn> <v-simple-table> <template v-slot:default> <thead> <tr> <th></th> <th> </th> <th></th> <th> ()</th> <th></th> <th></th> </tr> </thead> <tbody> <tr v-for="vert in verticies" :key="vert.name"> <td class="pa-4"> <div class="text-h6" :style="{color: $vuetify.theme.themes.light.primary}"> {{ vert.init ? 'S' : '' }}{{ vert.childrens.length == 0 ? 'F' : '' }} </div> </td> <td class="pa-4"> <v-text-field outlined label=" " v-model="vert.name" hide-details ></v-text-field> </td> <td class="pa-4"> <v-text-field outlined label="" v-model="vert.code" hide-details ></v-text-field> </td> <td class="pa-4"> <v-text-field outlined label="" suffix="" v-model="vert.duration" hide-details ></v-text-field> </td> <td class="pa-4"> <v-text-field outlined label="" suffix="." v-model="vert.price" hide-details ></v-text-field> </td> <td class="pa-4"> <v-btn icon color="error"> <v-icon> mdi-delete-outline</v-icon> </v-btn> </td> </tr> </tbody> </template> </v-simple-table> </v-main> </v-app></template><script>export default { name: "GraphDrawer", data: () => ({ verticies: [ {x: 1, y: 1, init: 'S', childrens: [{x: 1, y: 1}], name: '赵云', code: 101, duration: '长枪', price: 15}, {x: 1, y: 1, init: 'S', childrens: [{x: 1, y: 1}], name: '张飞', code: 102, duration: '蛇矛', price: 16}, {x: 1, y: 1, init: 'S', childrens: [{x: 1, y: 1}], name: '刘备', code: 103, duration: '双股剑', price: 17} ], result: [], }), mounted() { }, methods: { btnClick(){ console.log(this.verticies); } }}</script>更多建站及源码交易信息请见 GoodMai ...

October 27, 2021 · 1 min · jiezi

关于vue.js:Vue处理n无法换行的问题

问题形容在开发Vue的组件时,总会遇到大段文本的组件,此时,如果该大段文本作为参数时,那么文本的换行符(\n)却无奈失常换行,而是被替换为空格。 解决办法咱们能够利用 css 款式中的 white-space,把文本区域的款式设置为: white-space: pre-line;, 就能够很不便的解决。留神不要应用 white-space: pre-wrap; ,该款式会把前后空格也保留了,会呈现对齐异样。 拓展常识white-space 可配置的值如下: normal间断的空白符会被合并,换行符会被当作空白符来解决。换行在填充「行框盒子(line boxes)」时是必要。nowrap和 normal 一样,间断的空白符会被合并。但文本内的换行有效。pre间断的空白符会被保留。在遇到换行符或者元素时才会换行。pre-wrap间断的空白符会被保留。在遇到换行符或者元素,或者须要为了填充「行框盒子(line boxes)」时才会换行。pre-line间断的空白符会被合并。在遇到换行符或者元素,或者须要为了填充「行框盒子(line boxes)」时会换行。break-spaces与 pre-wrap的行为雷同,除了:任何保留的空白序列总是占用空间,包含在行尾。每个保留的空格字符后都存在换行机会,包含空格字符之间。这样保留的空间占用空间而不会挂起,从而影响盒子的固有尺寸(最小内容大小和最大内容大小)。

October 26, 2021 · 1 min · jiezi

关于vue.js:SpringCloud微服务实战搭建企业级开发框架六使用knife4j集成Swagger2接口文档

 knife4j是为集成Swagger生成api文档的加强解决方案,前后端Java代码以及前端Ui模块进行拆散,在微服务架构下应用更加灵便,提供专一于Swagger的加强解决方案,不同于只是改善加强前端Ui局部,咱们这里应用knife4j作为文档管理工具来代替swagger-ui。 1、在GitEgg-Platform工程下新建gitegg-platform-swagger子工程,在GigEgg-Platform中的子工程gitegg-platform-bom中,批改pom.xml,以maven bom的形式应用knife4j: <!-- Swagger2 knife4j bom形式引入 --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-dependencies</artifactId> <version>${knife4j.version}</version> <type>pom</type> <scope>import</scope> </dependency>2、在gitegg-platform-swagger子工程中的pom.xml增加knife4j援用: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>GitEgg-Platform</artifactId> <groupId>com.gitegg.platform</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gitegg-platform-swagger</artifactId> <name>${project.artifactId}</name> <version>${project.parent.version}</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> </dependency> </dependencies></project>3、在gitegg-platform-swagger子工程中新建SwaggerConfig.java文件: package com.gitegg.platform.swagger.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration@EnableSwagger2@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)public class SwaggerConfig { @Bean(value = "GitEggApi") public Docket GitEggApi() { Docket docket=new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) //分组名称 .groupName("2.X版本") .select() //这里指定Controller扫描包门路 .apis(RequestHandlerSelectors.basePackage("com.gitegg.*.*.controller")) .paths(PathSelectors.any()) .build(); return docket; } private ApiInfo apiInfo() { return new ApiInfoBuilder().version("1.0.0") .title("Spring Cloud Swagger2 文档") .description("Spring Cloud Swagger2 文档") .termsOfServiceUrl("www.gitegg.com") .build(); }}4、在gitegg-service工程中引入gitegg-platform-swagger ...

October 26, 2021 · 2 min · jiezi

关于vue.js:netCore30webapi到前端vue前端

前篇曾经实现后端配置并获取到api连贯 https://www.cnblogs.com/ouyan... 前端我的项目用的是VS code编译器 vue实现 前端引入 <script src="lib/vue.js"></script> <script src="lib/vue-resource.js"></script> <script src="lib/axios.min.js"></script> <link rel="stylesheet" href="lib/bootstrap.css">app.vue<body> <div id="app"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">Panel title</h3> </div> <div class="panel-body"> <div class="row"> <div class="col-lg-6"> <div class="input-group"> <input type="text" class="form-control" placeholder="Search for..."> <span class="input-group-btn"> <button class="btn btn-default" type="button">Go!</button> </span> </div><!-- /input-group --> </div><!-- /.col-lg-6 --> </div><!-- /.row --> </div> </div> <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>题目</th> <th>类别</th> </tr> </thead> <tbody> <tr v-for="item in list" :key="item.id" @click.prevent="quTest(item.id)"> <td>{{item.method}}</td> <td>{{item.type}}</td> </tr> </tbody> </table> </div> <script> var vm = new Vue({ el: '#app', data: { list: [], id: '' }, created() { this.getlist() }, methods: { getlist() { let _this = this; //留神,这里是在函数体外部,不是在methods中 axios.get('https://localhost:44323/api/values').then(res => { _this.list = res.data; //留神这里后面用**_this**来保证数据是绑定到Vue实例上的 }) }, quTest(id) { console.log(id) } } }) </script></body>留神以上是用 axios.get形式获取后端api链接获取数据,并利用vue渲染到前端页面显示 ...

October 26, 2021 · 1 min · jiezi

关于vue.js:elementUI中使用树组件eltree实现左侧勾选右侧列表展示并且列表删除某一项左侧树菜单取消相应勾选

需要1、勾选的时候右侧列表会展现勾选的最终的子节点。2、点击删除列表中某一项,就会对应的勾销树状菜单的勾选状态。3、反对搜寻过滤。 <div class="flex-between"> <div> <el-input placeholder="输出关键字进行过滤" v-model="filterText"> </el-input> <el-tree ref="tree" :load="loadNode" lazy :data="treeData" show-checkbox node-key="id" :default-expanded-keys="[1]" :filter-node-method="filterNode" :props="defaultProps" @check="fnClickNode"> </el-tree> </div> <div> <p>已选成员</p> <ul> <li v-for="(m, i) in selectedMumberList" :key="i"> <p>{{m.label}}</p> <i class="el-icon-close remove-icon" @click="removeMumber(m,i)"></i> </li> </ul> </div></div>data(){ return { treeData: [], filterText:'', // 树状菜单默认项 defaultProps: { children: 'children', label: 'label' }, appPid: 0, selectedMumberList: [] }},methods: { // 搜寻过滤 filterNode (value, data) { if (!value) return true; return data.label.indexOf(value) !== -1; }, // 节点点击 fnClickNode () { // 获取选中的子节点列表 // getCheckedNodes 的第一个参数为false,示意连同父节点一并获取,true只获取子节点 let selectedMumberList = this.$refs.tree.getCheckedNodes(false, false); selectedMumberList = selectedMumberList.filter(item => !item.children); this.selectedMumberList = selectedMumberList; }, // 移除勾选人员 removeMumber (nodeObj, index) { this.$confirm('确定删除此成员吗?', '提醒', { confirmButtonText: '确定', cancelButtonText: '勾销', type: 'warning' }).then(() => { // 删除列表中点击的那一项 this.selectedMumberList.splice(index, 1); // 勾销对应删除列表的节点的选中状态 this.$refs.tree.setChecked(nodeObj.id, false, true); this.$message({ type: 'success', message: '删除胜利!' }); }).catch(() => {}); }, // 获取初始数据 loadNode(node, resolve) { let that = this; setTimeout(() => { var data = []; let params = { "page":1, "size":10, "appPid": node.data.id || 0 } that.$axios.post('/app/list', params).then(res => { if(res.data.state == 200){ console.log(res); res.data.data.map(item => { item.id = item.appId; item.label = item.appName; item.parentId = node.data.id || 0; }) data = res.data.data; node.data.children = res.data.data; console.log(data) resolve(data); } }); }, 200); },},watch: { filterText (val) { <http://https://blog.csdn.net/CherryLee_1210/article/details/110184172>this.$refs.tree.filter(val); }},

October 26, 2021 · 1 min · jiezi

关于vue.js:Vue知识点总结

Vue对Vue的了解Vue 是一个构建数据驱动的渐进性框架,指标是通过API实现 响应数据绑定 和 视图更新 Vue的两大外围数据驱动组件零碎 Vue生命周期Vue实例从创立到销毁的过程graph LR开始创立 --> 初始化数据-->编译模板-->挂载DOM-->渲染-->更新-->渲染;更新-->卸载生命周期的作用生命周期中有多个事件钩子,能让开发者在管制整个vue实例的过程时更容易造成良好的逻辑判断 created和mounted createdmounted调用机会模板渲染成 HTML 前模板渲染成 HTML 后常见作用初始化属性值,再渲染成视图操作DOM节点定时器在 beforeDestroy()革除 clearInterval(this.timer);this.timer = null;v-model的应用用于表单数据的双向绑定,其实是语法糖,背地做了两个操作: v-bind绑定value属性v-on绑定input事件 Vue响应式(双向数据)原理通过 数据劫持 联合 公布订阅模式 的形式来实现 Vue2:通过Object.defineProperty() 来劫持各个属性的setter、getter,在数据变动时公布音讯给订阅者,触发相应的监听回调Vue3:仅仅是将数据劫持的形式由Object.defineProperty更改为ES6的Proxy代理 Vue3绝对Vue2的优化双向数据绑定方面:Vue2的object.defineProperty一次只能劫持对象的单个属性,从而须要通过递归+遍历对每个对象的每个属性进行数据监控;如果属性值是对象的话,还须要深度遍历而Vue3.0中的proxy能够一次性地劫持对象的所有属性的setter、getter,还能够代理数组,也能够代理动静增加的属性,有13种劫持操作性能方面快1.2~2倍:(1) diff办法优化 vue2中的虚构dom是全量的比照(每个节点不管写动态还是动静的都会比拟) vue3新增了动态标记(patchflag)与上次虚构节点比照时,只比照带有patch flag的节点(动态数据所在的节点);可通过flag信息得悉以后节点要比照的具体内容 (2) 动态晋升 vue2无论元素是否参加更新,每次都会从新创立而后再渲染vue3对于不参加更新的元素,会做动态晋升,只会被创立一次,在渲染时间接复用即可 (3) 工夫侦听器缓存 默认状况下onClick会被视为动静绑定,所以每次都会追踪它的变动 然而因为是同一个函数,所以不必追踪变动,间接缓存起来复用即可 (4) ssr渲染 按需编译,体积比vue2.x更小组合API(相似react hooks)更好的Ts反对裸露了自定义渲染API更先进的组件Fragment:模板能够有多个根元素 虚构DOM虚构DOM绝对于浏览器所渲染进去的实在 DOM,在 React,Vue 等技术呈现之前, 扭转页面展现内容只能遍历查问 DOM 树找到须要批改的 DOM,而后批改款式行为或者构造,来更新UI,然而这种形式相当耗费计算资源,每次查问DOM简直都须要遍历整棵DOM树,因而建设一个与实在DOM树对应的虚构DOM对象(JavaScript对象),以对象嵌套的形式来示意DOM树,那么每次DOM的更改就变成了对象属性的更改,这样一来就能通过diff算法查找变动要比查问实在的DOM树的性能开销小 <template>渲染过程graph TD将template标签外面的内容编译成render函数 --> 挂载实例:依据render函数的根节点递归生成虚构DOM树-->通过diff算法比照虚构DOM,渲染到实在DOM-->新的DOM操作使得DOM树产生扭转-->通过diff算法比照虚构DOM,渲染到实在DOMkey的作用为了高效的更新虚构DOM 给虚构DOM的每个节点 VNode 增加惟一 id,让其能够依附 key,更疾速精确地拿到 oldVnode 中对应的 VNode 【设置key不举荐应用index或者随机数,因为增删子项的时候损耗性能较大】 v-if和v-showv-if在DOM层面决定元素是否存在,会引起重排重绘v-show在CSS层面决定是否将元素渲染进去(实际上该元素始终存在) v-if和v-for优先级 v-ifv-forVue 2 优先Vue 3优先解决方案 : ...

October 25, 2021 · 2 min · jiezi

关于vue.js:vue-表单中嵌表格

在表单中嵌入表格源码:member-ui 拍照积分(作者记录) 关键点<el-form :model="dataForm" ref="dataForm" :rules="rules"> <el-form-item label="拍照积分填入项:" prop="list"> <el-table :data="dataForm.list" border> <el-table-column label="显示程序" prop="sortNum"> <template slot-scope="{row,$index}"> <el-form-item :prop="`list[${$index}].sortNum`" :rules="rules.sortNum1"> <el-input v-model="row.sortNum"></el-input> </el-form-item> </template> </el-table-column> </el-table> </el-form-item></el-form>el-form-item 外面什么放入插槽默认插槽 放 el-table label具名插槽 没用到 el-table-column 外面什么时候放入插槽作用域插槽 放 template {row,column,$index}header具名插槽 没用到

October 24, 2021 · 1 min · jiezi

关于vue.js:vue-表单中嵌表格

在表单中嵌入表格源码:member-ui 拍照积分(作者记录) 关键点<el-form :model="dataForm" ref="dataForm" :rules="rules"> <el-form-item label="拍照积分填入项:" prop="list"> <el-table :data="dataForm.list" border> <el-table-column label="显示程序" prop="sortNum"> <template slot-scope="{row,$index}"> <el-form-item :prop="`list[${$index}].sortNum`" :rules="rules.sortNum1"> <el-input v-model="row.sortNum"></el-input> </el-form-item> </template> </el-table-column> </el-table> </el-form-item></el-form>el-form-item 外面什么放入插槽默认插槽 放 el-table label具名插槽 没用到 el-table-column 外面什么时候放入插槽作用域插槽 放 template {row,column,$index}header具名插槽 没用到

October 24, 2021 · 1 min · jiezi

关于vue.js:vue-插槽

单个插槽| 默认插槽| 匿名插槽特点:一个组件中只能有一个这样的插槽没有槽属性的HTML模板默认关联匿名插槽。 具名插槽子组件: <div> <div>这是子组件</div> <slot name="content"><slot></div>父组件: <div> <div>这是父组件</div> <child> <template slot="content">插槽内容</template> </child></div>显示后果: 这是父组件这是子组件插槽内容 ---------------是名字为content的插槽外面的内容,如果没有slot,123不展现,留神:父组件应用子组件的插槽,应用什么样的标签不重要,能够用template,能够用div ,能够用span 作用域插槽| 带数据的插槽款式父组件说了算,但内容能够显示子组件插槽绑定的。可在父组件复用作用域插槽能够不起名,最好起名 传多个参数 子组件 <slot name="user" :data="data"></slot>父组件 <child> <template slot-scope="user"> <ul> <li v-for="item in user.data">{{item}}</li> </ul> </template></child>// user.data user是插槽明,data是绑定值三种插槽的对别匿名插槽<slot></slot>具名插槽<slot name="up"></slot>带数据的插槽<slot name="user" :data="data"></slot>slot和slot-scope的区别slot 前面跟组件的名字slot-scope 前面跟组件传过来的数据,是形参scope 在子组件中的插槽上有一句data="list",而在父组件中也有slot-scope="scope",slot-scope就是取data的值,slot-scope的值是自定义的,咱们能够取任何名称,然而data的值传过来时是以对象模式传输的,所以在这scope.data才是list的值。

October 22, 2021 · 1 min · jiezi