关于vue.js:如何诊断SQL数据

当一个SQL呈现性能问题时,能够应用SQL_TRACE 或者 10046事件来跟踪SQL,通过生成的trace来理解SQL的执行过程。咱们在查看一条SQL的执行打算的时候,只能看到CBO 最终通知咱们的执行打算后果,然而不晓得CBO 是依据什么来做的。如果遇到了执行打算异样,能够借助Oracle 10053事件进行跟踪。10053事件是oracle提供的用于跟踪sql语句成本计算的外部事件,它能记录CBO模式下oracle优化器如何计算sql老本,生成相应的执行打算。 通过session级别跟踪: ALTER SESSION SET EVENTS='10053 trace name context forever, level 1'; 或ALTER SESSION SET EVENTS='10053 trace name context forever, level 2'; 执行相干sql explain plan for select count(*) from obj$; ALTER SESSION SET EVENTS '10053 trace name context off'; 对特定session启用跟踪: 通过调用 DBMS_SYSTEM. SET_EV包实现 PROCEDURE SET_EV Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SI BINARY_INTEGER IN SE BINARY_INTEGER IN EV BINARY_INTEGER IN LE BINARY_INTEGER IN ...

June 18, 2021 · 1 min · jiezi

关于vue.js:分类信息网站模板ICP许可证已通过审核两套样式模板

蕴含性能:注册、登录、公布音讯、查看学习技术:前端vue;后端nodejs,数据用的json文件贮存,无需搭建数据库,有须要的可私聊增加微信:yanzixiaoyixiao,备注:icp网站模板 操作方法: 全局搜寻XXX,批改为本人信息即可;服务器装置node;启动node服务(可用pm2治理):pm2 start app.js;批改icp-web/src/api/api.js 下的URl地址为服务器地址;打包前端我的项目 npm run build;把打包后的dist目录放在node服务根目录下;

June 18, 2021 · 1 min · jiezi

关于vue.js:Java中数据库会遇到哪些问题

 对数据库而言,其显著的特色是资源能够被多个用户共享。当雷同的数据库资源被多个用户(多个事务)同时拜访时,如果没有采取必要的隔离措施,就会导致各种并发问题,毁坏数据的完整性。 如果不思考隔离性,数据库将会存在三种并发问题。 1. 脏读 一个事务读到了另一个事务尚未提交的更改数据。例如,事务T1批改某一数据后,事务T2读取同一数据,而后事务T1因为某种原因被吊销,这时T1已批改过的数据恢复原值,T2读到的数据就与数据库中的数据不统一,其读到的数据就为"脏"数据,对该数据的操作也无奈抵赖。 2. 不可反复读 不可反复读是指一个事务读取页游数据后,另一个事务执行更新操作,使第一个事务无奈再现前一次的读取后果。例如,事务T1读取B=100进行运算,事务T2读取同一数据B,对其进行批改后将B=200写回数据库。这时,T1为了对读取值校对重读B,B已为200,与第一次读取值不统一。 3. 幻读 幻读是指一个事务读取数据后,另一个事务执行插入操作,使第一个事务无奈再现前一次的读取后果。例如,事务T1两次统计所有账户的总金额,在这期间,事务www.sangpi.comT2插入了一条新记录,使得两次统计的总金额不统一。 为了解决并发造成的问题,数据库标准定义了四种隔离级别,用于限定事务之间的可见性,不同事务隔离级别可能解决的数据并发问题的能力是不同的,具体如表2.1所示。 表2.1 数据库的隔离级别 1 read uncommitted (读未提交),一个事务读到另一个事务没有提交的数据。 read committed (读已提交),一个事务读到另一个事务曾经提交的数据。 repeatable read (可反复读),在一个事务中读到的数据始终统一,无论别的事务是否提交。 serializable(串行化),同时只能执行一个事务,相当于是事务中的单线程。 以上四种隔离级别安全性最高的是serializable (串行化),最低的是read uncommitted(读未提交),当然平安性能越高,执行效率就越低。像serializable(串行化)这样的级别,就是以锁表的形式,使得其余的事务只能在锁外期待,所以平时选用何种隔离级别应该依据理论状况。MySQL数据库默认的隔离级别为repeatable read (可反复读)。

June 18, 2021 · 1 min · jiezi

关于vue.js:Vue-POST-正确请求姿势

首先:减少vue配置// qs是axios带有的,无需装置import Qs from 'qs' // 配置axios post申请时发送formDataaxios.defaults.transformRequest = [function (data) { data = Qs.stringify(data);return data;}];GET应用形式数据放于params中 this.axios({ method: "GET", url: "/abc", params: { a: 1, b: 2 } }).then()POST应用形式数据放于data中 this.axios({ method: "POST", url: "/abc", data: { a: 1, b: 2 } }).then()

June 18, 2021 · 1 min · jiezi

关于vue.js:Vue中slot的使用

集体了解:是对组件的扩大,通过slot插槽向组件外部指定地位传递内容,通过slot能够父子传参; 开发背景(slot呈现时为了解决什么问题):失常状况下,<Child><span style=”color:red;”>hello world</span></Child>在组件标签Child中的span标签会被组件模板template内容替换掉,当想让组件标签Child中内容传递给组件时须要应用slot插槽; Slot的艰深了解 是“占坑”,在组件模板中占好了地位,当应用该组件标签时候,组件标签外面的内容就会主动填坑(替换组件模板中<slot>地位),当插槽也就是坑<slot name=”mySlot”>有命名时,组件标签中应用属性slot=”mySlot”的元素就会替换该对应地位内容; Slot应用1、组件中有单个或多个未命名slot标签时,如下:<Child><span style=”color:red;”>hello world</span></Child> <template> <div> <slot></slot> <slot style=”color:blue;” >这是在slot上增加了款式</slot> <slot name=”mySlot”>这是领有命名的slot的默认内容</slot> </div> </template> 会输入:两个红色的hello world,以及一个应用slot的默认内容 留神:在slot标签增加款式有效。领有命名的插槽不能被不含slot属性的标签内容替换,会显示slot的默认值(具名slot具备对应性); 2、组件中有多个命名的slot插槽时,能够实现父组件对子组件的指定地位显示内容或传参,如下: <Child> <span slot="header">hello world</span> <span slot="main">hello world</span> <span slot="footer">hello world</span> <span slot="other">{{otherData}}</span> </Child> <template> <div> <slot name=”header”>这是领有命名的slot的默认内容</slot> <slot name=”main”>这是领有命名的slot的默认内容</slot> <slot name=”footer”>这是领有命名的slot的默认内容</slot> <slot name=”other”>这是领有命名的slot的默认内容</slot> </div> </template> 3、作用域插槽!!:应用时候子组件标签<Child>中要有<template scope=”scopeName”>标签,再通过scopeName.childProp就能够调用子组件模板中的childProp绑定的数据,所以作用域插槽是一种子传父传参的形式,解决了一般slot在parent中无法访问child数据的去问题; 作用域插槽代表性的用例是列表组件,容许在parent父组件上对列表项进行自定义显示,如下该items的所有列表项都能够通过slot定义后传递给父组件应用,也就是说数据是雷同的,不同的场景页面能够有不同的展现形式: <ul> <slot name="item" v-for="item in items" :text="item.text" :myname="item.myname" > slot的默认内容 </slot></ul> <Child> <template slot="item" scope="props"> <li>{{props.myname}}</li> </template></Child>

June 18, 2021 · 1 min · jiezi

关于vue.js:vue2生命周期笔记

June 18, 2021 · 0 min · jiezi

关于vue.js:Vue-Conf关于Vite的分享给我带来的启发

Vite在去年就曾经进去了,但我真正的去理解它却是在最近Vue Conf上李奎对于Vite: 下一代web工具的分享。其中他提到的几点吸引到了我。分享的开始,他简要阐明了本次分享的关键点: 其中的ESM和esbuild会在下文具体阐明接下来他提到了Bundle-Based Dev Server。也就是咱们始终在用的webpack的解决形式: 这里援用官网的一段话: 当咱们开始构建越来越大型的利用时,须要解决的 JavaScript 代码量也呈指数级增长。大型项目蕴含数千个模块的状况并不少见。咱们开始遇到性能瓶颈 —— 应用 JavaScript 开发的工具通常须要很长时间(甚至是几分钟!)能力启动开发服务器,即便应用 HMR,文件批改后的成果也须要几秒钟能力在浏览器中反映进去。如此周而复始,机灵的反馈会极大地影响开发者的开发效率和幸福感。简略总结下就是,如果利用比较复杂,应用Webpack的开发过程绝对没有那么丝滑: Webpack Dev Server冷启动工夫会比拟长Webpack HMR热更新的反应速度比较慢这就是Vite呈现的起因,你能够把它简略了解为:No-Bundler构建计划。其实正是利用了浏览器原生ESM的能力。 但首次提出利用浏览器原生ESM能力的工具并非是Vite,而是一个叫做Snowpack的工具。当然本文不会开展去比照Vite与它的区别,想理解的可戳Vite 与 X 的区别是? 到这里,我不禁开始去想一个问题:为什么Vite这个工具能够呈现,他又是基于哪些前提条件呢? 带着这个问题,联合分享和Vite的源码以及社区的一些文章,我发现了如下几个与Vite能够呈现密不可分的模块: ES ModulesHTTP2ESBuild这几块其实本人都听过,然而具体的细节也都没有深刻去理解。明天正好去深刻分析一下。 ES Modules在古代前端工程体系中,咱们其实始终在应用ES Modules: import a from 'xxx'import b from 'xxx'import c from 'xxx'可能是过于平时化,大家早已司空见惯。但如果没有很深刻的理解ES Modules,那么可能对于咱们了解现有的一些轮子(比方本文的Vite),会有一些妨碍。 ES Modules是浏览器原生反对的模块零碎。而在之前,罕用的是CommonJS和基于 AMD 的其余模块零碎 如 RequireJS。 来看下目前浏览器对其的反对: 支流的浏览器(IE11 除外)均曾经反对,其最大的特点是在浏览器端应用 export、 import的形式导入和导出模块,在 script 标签里设置 type="module",而后应用模块内容。 下面说了这么多,毕竟也只是ES Modules的自我介绍。始终以来,他就像黑盒一样,咱们并不分明外部的执行机制。上面就让咱们来一窥到底。 咱们先来看一下模块零碎的作用:传统script标签的代码加载容易导致全局作用域净化,而且要维系一系列script的书写程序,我的项目一大,保护起来越来越艰难。模块零碎通过申明式的裸露和援用模块使得各个模块之间的依赖变得显著。 当你在应用模块进行开发时,其实是在构建一张依赖关系图。不同模块之间的连线就代表了代码中的导入语句。 正是这些导入语句通知浏览器或者Node该去加载哪些代码。 咱们要做的是为依赖关系图指定一个入口文件。从这个入口文件开始,浏览器或者Node就会顺着导入语句找出所依赖的其余代码文件。 对于 ES 模块来说,这次要有三个步骤: 结构。查找、下载并解析所有文件到模块记录中。实例化。在内存中寻找一块区域来存储所有导出的变量(但还没有填充值)。而后让 export 和 import 都指向这些内存块。这个过程叫做链接(linking)。求值。运行代码,在内存块中填入变量的理论值。 ...

June 17, 2021 · 2 min · jiezi

关于vue.js:vue面试总结

vue面试总结那首先谈谈你对Vue的了解吧?vue.js是什么?Vue (读音 /vju/,相似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为能够自底向上逐层利用。Vue 的外围库只关注视图层,不仅易于上手,还便于与第三方库或既有我的项目整合。另一方面,当与现代化的工具链以及各种反对类库联合应用时,Vue 也齐全可能为简单的单页利用提供驱动。vue是一个渐进式框架,相当于view层, 双向数据绑定, 他更轻量, 性能上更高效, 比其余框架更容易上手, 学习成本低, vue须要一个el对象进行实例化, Vue与Angular以及React的区别?angular是mvvm框架, 而vue是一个渐进式的框架, 相当于view层, 都有双向数据绑定, 然而angular中的双向数据绑定是基于脏查看机制, vue的双向数据绑定是基于ES5的getter和setter来实现, 而angular是有本人实现一套模板编译规定,vue比angular更轻量, 性能上更高效, 比angular更容易上手, 学习成本低, vue须要一个el对象进行实例化, 而angular是整个html页面下的,单页面利用, 而vue能够有个vue实例1.与AngularJS的区别相同点:都反对指令:内置指令和自定义指令;都反对过滤器:内置过滤器和自定义过滤器;都反对双向数据绑定;都不反对低端浏览器。不同点:AngularJS的学习老本高,比方减少了Dependency Injection个性,而Vue.js自身提供的API都比较简单、直观;在性能上,AngularJS依赖对数据做脏查看,所以Watcher越多越慢;Vue.js应用基于依赖追踪的察看并且应用异步队列更新,所有的数据都是独立触发的。2.与React的区别相同点:React采纳非凡的JSX语法,Vue.js在组件开发中也推崇编写.vue非凡文件格式,对文件内容都有一些约定,两者都须要编译后应用;中心思想雷同:一切都是组件,组件实例之间能够嵌套;都提供正当的钩子函数,能够让开发者定制化地去解决需要;都不内置列数AJAX,Route等性能到外围包,而是以插件的形式加载;在组件开发中都反对mixins的个性。不同点:React采纳的Virtual DOM会对渲染进去的后果做脏查看;Vue.js在模板中提供了指令,过滤器等,能够十分不便,快捷地操作Virtual DOM。 vue 的生命周期?实例从创立到销毁的过程,就是生命周期。也就是从开始创立、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,咱们称这是 Vue 的生命周期。利用场景beforeCreate:在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其余的货色都还没创立。在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段应用data中的数据和methods中的办法create:data 和 methods都曾经被初始化好了,如果要调用 methods 中的办法,或者操作 data 中的数据,最早能够在这个阶段中操作beforeMount:执行到这个钩子的时候,在内存中曾经编译好了模板了,然而还没有挂载到页面中,此时,页面还是旧的mounted:执行到这个钩子的时候,就示意Vue实例曾经初始化实现了。此时组件脱离了创立阶段,进入到了运行阶段。 如果咱们想要通过插件操作页面上的DOM节点,最早能够在和这个阶段中进行beforeUpdate: 当执行这个钩子时,页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据放弃同步updated:页面显示的数据和data中的数据曾经放弃同步了,都是最新的beforeDestory:Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁destroyed: 这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件曾经被销毁了。 vue生命周期的作用是什么?它的生命周期中有多个事件钩子,让咱们在管制整个Vue实例的过程时更容易造成好的逻辑。 vue生命周期总共有几个阶段?它能够总共分为8个阶段:创立前/后, 载入前/后,更新前/后,销毁前/销毁后 第一次页面加载会触发哪几个钩子?beforeCreate, created, beforeMount, mounted vue获取数据在哪个周期函数?个别 created/beforeMount/mounted 皆可.比方如果你要操作 DOM , 那必定 mounted 时候能力操作. ...

June 17, 2021 · 2 min · jiezi

关于vue.js:MATH10282-Introduction-to-Statistics

MATH10282 Introduction to StatisticsSemester 2, 2018/19Coursework assignment using RThe deadline for submitting this coursework is 3.00pm on Monday 29 April 2019.You must submit your work in hard copy form in person in ATB2.223. No email orlate submission will be accepted.This coursework comprises 10% of the overall marks for the module.Instructions(a) You can include code and numerical results from R by copying and pasting intoyour document. Comments and discussion of the results should be added asrequired. You can save any plots created in R, for example as a PDF, and importthese into your final report. If you wish to include handwritten section (e.g.with mathematical notation), you may do so by including a scan or photo of thehandwritten part in your report.Include in your report all R commands used to generate results.(b) Please include your name and ID in your report. If you have any queries or problems,please contact me as soon as possible.(c) Your report should not be longer than 5 printed pages. Longer reports will bepenalised.The data for this question are contained in https://minerva.it.manchester...uk/~saralees/data.txt. The data consist of daily closing stock prices of the companyCoca Cola.(a) Read the data into R. [1](b) Compute the log returns of the data. That is, if xt denotes the stock price of dayt compute log xt log xt1. [1](c) Draw a histogram of the log returns. Comment about its shape. [1](d) Fit a distribution to the log returns data that provides an adequate fit (see part(f) below). You may use the R package fitdistrplus to fit distributions. [5](e) Superimpose the fitted PDF on top of the histogram. Comment on how the twomatch. [1](f) Does the distribution provide an adequate fit according to the Kolmogorov Smirnovtest (a goodness of fit test). You can perform the Kolmogorov Smirnov test byusing the R command ks.test. If the p-value returned by the command is above0.05 you may consider the distribution you chose in part (d) as providing anadequate fit. [1][Total 10 marks] WX:codehelp ...

June 17, 2021 · 2 min · jiezi

关于vue.js:如何用python查询mysql乱码问题

 置信很多在工作中的Python小伙伴,常常会遇到一些工作上的问题,例如查问mysql中文乱码问题,Python连贯mysql数据库时,读取数据库中的中文呈现乱码,所有中文都显示为问号了,那么该如何解决这个问题呢?解决问题的步骤如下: 一、为什么呈现乱码,呈现乱码的可能状况状况: 1.mysql数据库各项没有设置编码,默认为'latin' 2.应用MySQL.connect的时候没有设置默认编码 3.没有设置python的编码,python2.7默认为'ascii' 4.没有解码 二、为大家分享几种解决办法,如下: 1.设置mysql的编码 ubuntu执行下列语句: sudo vim /etc/mysql/my.cnf 而后在外面插入语句: [client] defaultwww.sangpi.com-character-set=utf8 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 退出 vim 重新启动mysql: sudo service mysql restart 2.在code中设置MySQLdb的连贯编码游戏参数 db=MySQLdb.connect(user='...',db='...',passwd='...',host='...',charset='utf8') 3.在code中设置python默认编码 # --coding:utf-8 -- import sys reload(sys) sys.setdefaultencoding('utf-8') 4.记得要解码 t = cursor.fetchall() s = t0.decode('utf-8') ...

June 17, 2021 · 1 min · jiezi

关于vue.js:electron是什么

Renderer Process API remote Browser Window Proxy desktop Capture 1、remote (服务端对象) 1.1 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'"> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> <button type="button" name="button" id="test-button">Fullscreen</button> <!-- All of the Node.js APIs are available in this renderer process. --> We are using Node.js <script>document.write( process.versions.node)</script>, and Electron <script>document.write( process.versions.electron )</script>. <script> // You can also require other files to run in this process require('./renderer.js') </script> </body> ...

June 17, 2021 · 2 min · jiezi

关于vue.js:过滤器链的执行顺序由什么决定

过滤器可能对网站中的各种内容进行过滤(页面、Servlet、图片、文件),能够在网站内容申请和响应时进行一些操作,实现一些通用的性能。 过滤器链 在我的项目中能够创立多个过滤器,网站内容可能会通过多个过滤器,多个过滤器就造成了过滤器链。 图片1 实现办法: 1、实现Filter接口 init 初始化 doFilter 进行过滤 参数: ServletRequest 申请 ServletResponse 响应 FilterChain 过滤器链 //让申请通过,执行下一个过滤器,如果不执行这个办法,申请就被拦挡 chain.doFilter(request, response); destroy 销毁 2、配置 web.xml <!-- 配置过滤器 --> <filter> <filter-name>Filter1</filter-name> <filter-class>com.qianfeng.filters.Filter1</filter-class> </filterwww.sangpi.com> </filter> <filter-mapping> <filter-name>Filter1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 解释:*代表所有的网站内容都过这个过滤器,能够指定被过滤的内容,如: <url-pattern>/test1.jsp</url-pattern> <url-pattern>/test2.jsp</url-pattern> 注解: 过滤器执行的程序: ...

June 17, 2021 · 1 min · jiezi

关于vue.js:Vue报错-Errortext-XXX-outside-root-element-will-be-ignored

对于Vue报错:Error:text XXX outside root element will be ignored.的起因及解决办法起因:<template> <h1>集体展现页</h1> <h2>目录</h2></template>Vue中一个<template>标签下只能有一个跟标签,不能同时有多高标签 解决办法:<template> <div> <h1>集体展现页</h1> <h2>目录</h2> </div></template>用一个<div>标签把多个标签封装成一个标签

June 17, 2021 · 1 min · jiezi

关于vue.js:微前端框架qiankun配置

微前端框架(qiankun)应用记录参考: https://qiankun.umijs.org/zh/...https://blog.csdn.net/hjb2722...其余纳闷主框架和子框架是否都要装置乾坤框架答:不是,只须要装置在主框架即可,子框架不须要引入应用办法主利用路由倡议应用history模式装置 qiankun yarn add qiankun 或者 npm i qiankun -S 配置微利用 // /src/micro/apps.jsconst apps = [ { name: 'planResource', entry: '//localhost:8083', container: '#iframe', activeRule: '/plan' }, { name: 'configration', entry: '//localhost:8081', container: '#iframe', activeRule: '/configure' }];export default apps;在主利用中注册微利用 // src/micro/index.jsimport { registerMicroApps, addGlobalUncaughtErrorHandler, start } from 'qiankun';import apps from './apps';// registerMicroApps 第二个参数能够不要,如果要做点啥,就写到对应的中央registerMicroApps(apps,{ beforeLoad: [ app => { console.log('[LifeCycle] before load %c%s', 'color: green;', app.name); }, ], beforeMount: [ app => { console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name); }, ], afterUnmount: [ app => { console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name); }, ],},);// 出错时显示的内容addGlobalUncaughtErrorHandler((event) => { // console.log(event); const { message } = event; if (message && message.includes('died in status LOADING_SOURCE_CODE')) { console.log('微利用加载失败,请查看利用是否可运行'); }});export default start;应用 start ...

June 16, 2021 · 4 min · jiezi

关于vue.js:vue项目使用env文件配置全局环境变量

对于文件名:必须以如下形式命名,不要乱起名,也无需专门手动管制加载哪个文件 .env //全局默认配置文件,不论什么环境都会加载合并.env.development //开发环境下的配置文件.env.production //生产环境下的配置文件对于文件内容: 留神:属性名必须以VUE_APP_结尾,比方VUE_APP_XXX.env:.env.development:对于文件的加载: 依据启动命令vue会主动加载对应的环境,vue是依据文件名进行加载的,所以下面说“不要乱起名,也无需专门管制加载哪个文件”比方执行npm run serve命令,会主动加载.env.development文件启动我的项目: 打印process.env属性(全局属性,任何中央均可应用): 可见NODE_ENV被改为了development,笼罩掉了.env中的全局属性.env中的全局属性NODE_ENV、VUE_APP_URL被笼罩,.env中的全局属性VUE_APP_PREVIEW、VUE_APP_DEFAULT_PARAM被保留 

June 16, 2021 · 1 min · jiezi

关于vue.js:vue中使用vfor-循环标签动态改变标签ID

1.例子应用elment-ui中el-card卡片循环标签和Canva画布工具 <el-col v-for="item in tabledata" :key="item.id" class="card" :span="5"> <el-card class="box-card"> <a href="#" @click="up">上</a> <a href="#" @click="down">下</a> <a href="#" @click="onLeft">左</a> <a href="#" @click="onRight">右</a> <span class="shot">射手:</span> <p>击发次数: <span>0</span></p> <canvas :id="forId(item.id)" ref="canvas" width="300px" height="300px" /> </el-card> </el-col>2.在methods中增加办法 forId(id) { return 'MyCanvas' + id },// 扭转tabledata个数花多少个卡片surfaceIndex(selVal) { // 先清空已有数组 this.tabledata = [] for (let j = 1; j <= selVal; j++) { this.tabledata.push({ id: j }) } },

June 16, 2021 · 1 min · jiezi

关于vue.js:vue-鼠标事件

1、vue我的项目中阻止鼠标滚轮事件 @mousewheel.prevent<div class=“main” @mousewheel.prevent>2、

June 15, 2021 · 1 min · jiezi

关于vue.js:变量与常量有什么区别

在程序执行过程中,其值不能被扭转的量称为常量,其值能被扭转的量称为变量。变量与常量在编写程序中须要常常应用,本节将具体介绍变量与常量的应用办法。 标识符 标识符(identifier)用于命名变量、常量、办法、类、包等实体。 标识符命名规定: 标识符是由字母、数字、下划线“_”、美元符号“$”组成的字符序列。 标识符必须以字母、下划线“_”、美元符号“$”结尾,不能以数字结尾。 标识符不能是关键字和保留字。 标识符不能蕴含空格。 例如,$6,name,Class,java,_pwd都是非法的标识符,而2a,class,c++,hello world,a@都是非法的标识符,不合乎标识符命名规定。Java编译器会检测出非法标识符并报错。 变量的定义 变量的应用是程序设计中一个非常重要的环节,定义变量就是通知编译器这个变量的数据类型,这样编译器才晓得须要配置多少内存空间给它,以及它能寄存什么样的数据。在程序运行过程中,空间内的值是变动的,这个内存空间就称为变量。为了便于操作,给这个空间取个名字,称为变量名。变量的命名必须是非法的标识符。内存空间内的值就是变量值,在申明变量时能够是没有赋值,也能够是间接赋给初值。 申明变量的语法格局如下: 数据类型 变量名; 如需申明多个雷同类型变量时,可应用上面的语法格局: 数据类型 变量名1,变量名2,…,变量名n; 接下来,通过具体的代码学习变量的定义,具体示例如下: int n,q=1; // 定义了二个int类型的变量,为q赋初值为1 double x, y, z; // 定义了三个double类型的变量 对于变量的命名并不是任意的,应遵循以下4条规定: (1)变量名必须是一个无效的标识符。 (2)变量名不能够应用Java关键字。 (3)变量名不能反复。 (4)应抉择较有意义的单词作为变量名。 变量的类型转换 Java的数据类型在定义时就曾经明确了,但程序中有时须要进行数据类型的转换,Java容许用户有限度地进行数据类型转换。数据类型转换形式分为主动类型转换和强制类型转换两种。 1.主动类型转换 主动类型转换也称隐式类型转换,指两种数据类型转换过程中不须要显式地进行申明。Java会在下列的条件成立时,主动做数据类型的转换: (1)转换的两种数据类型彼此兼容。 (2)指标数据类型的取值范畴比原类型大。 类型转换只限该行语句,并不会影响原先定义的变量类型,而且主动类型转换能够放弃游戏数据的精确度,不会因为转换而失落数据内容。 ...

June 15, 2021 · 2 min · jiezi

关于vue.js:详解Vue八大生命周期钩子函数

摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) 。每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。本文分享自华为云社区《一文带你弄懂Vue八大生命周期钩子函数》,原文作者:北极光之夜。。 一.速识概念:咱们把一个对象从生成(new)到被销毁(destory)的过程,称为生命周期。而生命周期函数,就是在某个时刻会主动执行的函数。 依照官网的原话,就是每个 Vue 实例在被创立时都要通过一系列的初始化过程——例如,须要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变动时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段增加本人的代码的机会。 简略来说就是每个Vue实例在被创立时都要通过一系列的初始化过程:创立实例,装载模板,渲染模板等。Vue为生命周期中的每个状态都设置了钩子函数(监听函数) 。每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。 二.八大生命周期钩子函数: 上面是官网文档里的生命周期图,英语好的同学能够看看: 在这里插入图片形容 三.联合代码理解:先看案例根本代码如下,前面通过如下代码步骤演示一个对象从生成到被销毁的过程各阶段执行的生命周期函数。留神show函数的作用。 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://unpkg.com/vue/dist/vue.js"></script></head><body> <div id="app"> {{information}} </div> <script type="text/javascript"> //创立vue实例 var vm = new Vue({ el: '#app', data: { information: '北极光之夜。' } }) // 各个生命周期函数通过调用上面这个函数理解其所处的生命阶段 function show(inf,obj){ console.log(inf); console.log("------------------------------------------"); console.log('获取vue实例data里的数据:'); console.log(obj.information); console.log("------------------------------------------"); console.log('挂载的对象,就是DOM:'); console.log(obj.$el); console.log("------------------------------------------"); console.log('页面上曾经挂载的DOM:'); console.log(document.getElementById('app').innerHTML); } </script>1. beforeCreate:这个阶段vue实例刚刚在内存中创立,此时data和methods这些都没初始化好。在案例中增加beforeCreate钩子函数: var vm = new Vue({ el: '#app', data: { information: '北极光之夜。' }, beforeCreate: function(){ // 传入该阶段简介与this,this就是该阶段的vue实例 show('vue实例初始化之前',this); } })看运行后果: ...

June 15, 2021 · 2 min · jiezi

关于vue.js:vue项目中增加Jest测试功能

装置应用如下命令,vue会主动创立好配置和依赖 vue add @vue/unit-jest手动配置1.装置 Jest 和 Vue Test Utilsnpm install --save-dev jest @vue/test-utils2.装置 babel-jest 、 vue-jest 和 7.0.0-bridge.0 版本的 babel-corenpm install --save-dev babel-jest vue-jest babel-core@7.0.0-bridge.03.装置 jest-serializer-vuenpm install --save-dev jest-serializer-vue配置 JestJest 的配置能够在 package.json 里配置;也能够新建一个文件 jest.config.js, 放在我的项目根目录即可。这里我抉择的是配置在 jest.config.js 中:配置阐明 module.exports = { // 通知jest须要解析的文件 moduleFileExtensions: [ 'js', 'jsx', 'json', 'vue' ], // 通知jest去哪里找模块资源,同webpack中的modules moduleDirectories: [ 'src', 'node_modules' ], // 通知jest针对不同类型的文件如何本义 transform: { '^.+\\.(vue)$': '<rootDir>/node_modules/vue-jest', '^.+\\.js$': '<rootDir>/node_modules/babel-jest', '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', '^.+\\.jsx?$': 'babel-jest', '^.+\\.ts?$': 'ts-jest' }, // 通知jest在编辑的过程中能够疏忽哪些文件,默认为node_modules下的所有文件 transformIgnorePatterns: [ '<rootDir>/node_modules/' + '(?!(vue-awesome|veui|resize-detector|froala-editor|echarts|html2canvas|jspdf))' ], // 别名,同webpack中的alias moduleNameMapper: { '^src(.*)$': '<rootDir>/src/$1', '^@/(.*)$': '<rootDir>/src/$1', '^block(.*)$': '<rootDir>/src/components/block/$1', '^toolkit(.*)$': '<rootDir>/src/components/toolkit/$1' }, snapshotSerializers: [ 'jest-serializer-vue' ], // 通知jest去哪里找咱们编写的测试文件 testMatch: [ // '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' '**/tests/unit/**/Test.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' ], // 在执行测试用例之前须要先执行的文件 setupFiles: ['jest-canvas-mock']};各配置项阐明: ...

June 15, 2021 · 1 min · jiezi

关于vue.js:Vue-世界未见之谜合集不定时更新

v-for循环绑定ref属性的时候,ref返回的是一个数组,作为一般绑定,比方ref="test",返回的是以后组件自身!解决办法:先判断是否是数组 const key = "something"; let ref = this.$refs[key]; if (ref[0]) ref = ref[0];element-ui cascader change事件在搜寻状态下获取不到以后抉择的lable标签,getCheckedNodes()起因:在this.$emit('change', val); 事件收回的时候,cascader 的 checkedValue曾经更新了,然而cascader-panel的值还没被更新 element/packages/cascader-panel/src/cascader-panel.vue 解决办法:把获取值的逻辑放到Vue.$nextTick()办法外面。如果获取label倡议间接使 this.$refs['以后cascader'].presentText这个属性 更倡议看看element-ui源码 对于 vue nextTick的解释

June 15, 2021 · 1 min · jiezi

关于vue.js:uniapp踩坑记录按官网教程配置eslint找不到配置插件的地方找不到eslintrcjs文件

环境HBuilder X 3.1.18 问题形容筹备给本人的uniapp我的项目加上eslint校验,依照官网的教程操作时,在我的HBuilderX中【工具】上面并没有【插件配置】,只有【外部命令插件配置】,然而该项上面并没有eslintrc.js文件 解决我的HBuilder X版本里,插件的配置地位是在【工具】【设置】

June 14, 2021 · 1 min · jiezi

关于vue.js:和面试官聊聊Diffvue2

这是 聊diff 的第二篇文章,聊聊vue2的diff思路.思路次要来自 vue-design 我的项目【第一篇】和面试官聊聊Diff___React【第二篇】和面试官聊聊Diff___vue2(本文)【第三篇】和面试官聊聊Diff___Vue3 为了更好的浏览体验,倡议从第一篇看起 我是一名前端的小学生。行文中对某些设计原理了解有误非常欢送大家探讨斧正,谢谢啦!当然有好的倡议也谢谢提出来(玩笑) Let's start vue2_diff比对流程本文重视的是patch过程,具体的细节和边界就没有思考。 ==另 外 注 意== 三篇文章 diff 的解说,为了不便展现 节点复用, 用了 children 保留内容,实际上这是不合理的,因为children不同还会递归补丁(patch)diff也不是vue optimize的全副,只是其中一部分,例如compile时确定节点类型,不同类型 不同的 mount/patch 解决形式等等。Vue2.x的 diff 绝对于 react 更好一些,防止了一些不必要的比对。基本思路 当初比如说由若干个新老节点(preNodes / nextNodes )。 应用 nextStartIdx、 nextEndIdx、 nextStartNode、 nextEndNode 保留 ==新节点== 首尾索引和首尾节点。应用 preStartIdx 、preEndIdx、 preStartNode、 preEndNode 保留 ==老节点== 首尾索引和首尾节点。先将新旧节点首尾一一比对,遇到 undefined 跳过 如果雷同则 前移 / 后移 比对节点(首首雷同,均后移;尾尾雷同,均前移;首尾雷同,新首后移,旧尾前移;尾首雷同)。如果存在 首尾遍历了全副节点, 那么 删除多余节点(状况①)或新增节点(状况②)即可雷同的都比对结束后,将新节点(nextNodes)中未比对的每个节点与老节点(preNodes)中未比对节点(是一个key和 index 对应的 map)中所有节点比对 如果存在雷同,将老节点中相应节点重置为 undefined, 否者在 新生成节点中 增加/删除相应节点。状况①(也可能是首尾/尾首比对),再持续循环, 会有 preStartIdx > preEndIdx, 表明有新增节点,要增加 ...

June 13, 2021 · 5 min · jiezi

关于vue.js:VUE2的小段源码分析

对于前端视图更新前言接到分享工作后始终比拟头疼,不晓得分享什么内容,可能把此次分享做的比拟好。起初偶尔在网上看到一篇文章,十分有启发性,疏导我做出了本次的内容 代码地址:(https://codepen.io/collection... 代码写的很精妙,短短一百多行代码,还原进去VUE响应式的核心思想。而我花了很长的工夫去浏览这段代码,感叹我和尤雨溪之间的前端程度还是有不少差距的。 (雷军:诗一样的代码) 剖析vue2在mount(筹备阶段)时通过watchEffect(副作用)判断是否首次生成 是的话就生成DOM解构并通过JS更新到H5中(虚构DOM) 否的话就判断前后两次传入的代码,别离判断和更新tag类型,传入的props,判断children(子组件)。并把不同的局部从新渲染。 vue2应用Object.defineProperty,通过set劫持数据,应用dep.notify()告诉对应watcher(上文的watchEffect),watcher调用_update更新视图 Dep中负责生成虚构DOM刷新页面的的Effect(副作用函数)在什么时候监听进去的呢,答案是在首屏加载的时候。Dep和Watcher是一对多的关系,能够同时监听多组watchEffect数据 一个较为残缺的流程图 总结和瞻望官网文档中提到VUE3的object拦截器Object.defineProperty曾经替换成了Proxy。在几个小试验之后,我发现Proxy是Object.defineProperty的外层封装,相当于我拦挡了你的拦挡。网上找了一下材料,发现比照defineProperty长处可能是能拦挡数组,新增了delete办法,还有更高的自由度。 上文能够解释为什么VUE2咱们在子组件中批改传入的obj,会触发父组件的从新渲染,其实是触发了监听在父组件上的date的set劫持。 能够揣测出VUE3中传入子组件的object变成了一份深拷贝的复制品,就不会再触发这个问题了,react同理。(单向数据流思维) 写完这些,感觉对前端框架的了解又深刻了,感觉做出本人的前端框架也不是不可能。当然,主观的来说这次探讨的只是前端框架的一小部分原理,其外还有大量的优化和性能没有波及,实际上只是抛砖引玉,心愿能发散出更多对前端框架的思考。 参考文章https://mp.weixin.qq.com/s/Do...https://www.cnblogs.com/datia...https://www.cnblogs.com/weblf... 谢谢观看

June 13, 2021 · 1 min · jiezi

关于vue.js:Number-Conversions

Number Conversions (12 Points)Show all of the work necessary to make these conversions Convert 10.12510to binary.Convert (373.28125)10to hexadecimal.Convert (BEEF)16to binary.Convert (101110101110)2to hexadecimal.Convert (-173.28125)10to floating point. Use 127 as an exponent bias. Make sure to listthe sign bit, 8 biased exponent bits, and the 23 fractional bits. Use IEEE 754 FloatingPoint Format. Convert the 32 bits result into 8 hexadecimal symbols.Convert (17.125)16to floating point. Use 127 as an exponent bias. Make sure to list thesign bit, 8 biased exponent bits, and the 23 fractional bits. Use IEEE 754 Floating PointFormat. Convert the 32 bits result into 8 hexadecimal symbols.Arithmetic (8 Points)Convert the following two numbers into floating point format.a. 14,760,626b. 175,663Show how these two floating point numbers could be added together, by following theprocess listed on page 258 of the textbook. Show the intermediate step for each stage of theaddition. Check the final answer by converting the final floating point sum back into the decimalnumber system.CMOS (10 Points)Draw and label the CMOS construction of a NOT, 2-input NAND, 2-input AND, 3-input NOR,and a BUFFER.Canonical and Standard Forms (10 Points)Here is the canonical expression for a piece of combinational logic to create the output Y.Y (A,B,C) = ∑ 0, 3, 4, 5● Draw the logic diagram for the standard form for output Y, using only NOT, AND, andOR gates. Do not do any minimizations.● Draw the logic diagram for the minimized form for output Y, using only NOT and NANDGates.● Draw a custom gate for output Y, using only a custom implementation of CMOS. Do notdesign this block using gates and then replace the gates with CMOS. Go directly to anoptimized CMOS implementation discussed in chapter 1.How many transistors are used for each of the 3 diagrams?Sequential State Machine (20 points)Design and create a custom Moore State Machine counter that operates in the following manner.This is testing chapter 3 content, so System Verilog is not allowed for this problem.● It has a positive edge triggered clock, clk● It has an active low reset, reset_n. The count is asynchronously reset to 0 when reset_n istriggered.● It counts up by 2 when the ud input is 1.● It counts down by 1 when the ud input is 0.● The maximum count is 6 and the minimum count is 0. If the current count is 4 and thecounter counts up two , the next value is 6. If it counts up again, the value is capped to 6.● The output, P, is high whenever the count is a multiple of 3 (3 and 6).Provide the following artifacts demonstrating your design.State diagramState transition tableOutput tableLogic diagram, showing the gate level design for Next State Logic and OutputLogic. Specifically show how those two blocks are connected to individual flipflops.Extra Credit (10 points)Draft your custom Moore State Machine into Quartus, create a HDL module from your blockdiagram file, simulate it in ModelSim to validate your design. Attach a screenshot thatdemonstrates correct functionality.WX:codehelp ...

June 12, 2021 · 3 min · jiezi

关于vue.js:讲解-COMP9021-QUIZ-1

QUIZ 1COMP9021 PRINCIPLES OF PROGRAMMING$ python3 quiz_1.pyEnter two integers, the second one being strictly positive: 0 1Here are the generated widths:[7]Here are the generated symbols:['&']Here are the generated repetitions:[1]Here is the input as a pattern:7&1Here is the input as a dictionary:(7, 1): '&'Here is the input as an amazing picture:|&&&&&&&|$ python3 quiz_1.pyEnter two integers, the second one being strictly positive: 10 2Here are the generated widths:[1, 1]Here are the generated symbols:['&', '$']Here are the generated repetitions:[8, 8]Here is the input as a pattern:1&81$8Due to identical pairs of numbers, the input cannot be represented as a dictionary.Here is the input as an amazing picture:|&|&|&|&|&|&|&|&||$|$|$|$|$|$|$|$|Date: Trimester 2, 2021.2 COMP9021 PRINCIPLES OF PROGRAMMING$ python3 quiz_1.pyEnter two integers, the second one being strictly positive: 20 3Here are the generated widths:[3, 6, 1]Here are the generated symbols:['%', '+', '&']Here are the generated repetitions:[2, 3, 7]Here is the input as a pattern:3%26+31&7Here is the input as a dictionary:(3, 2): '%', (6, 3): '+', (1, 7): '&'Here is the input as an amazing picture:|%%%|%%%||++++++|++++++|++++++||&|&|&|&|&|&|&|$ python3 quiz_1.pyEnter two integers, the second one being strictly positive: 50 4Here are the generated widths:[8, 4, 2, 4]Here are the generated symbols:['%', '*', '-', '-']Here are the generated repetitions:[6, 6, 6, 2]Here is the input as a pattern:8%64*62-64-2Here is the input as a dictionary:(8, 6): '%', (4, 6): '*', (2, 6): '-', (4, 2): '-'Here is the input as an amazing picture:|%%%%%%%%|%%%%%%%%|%%%%%%%%|%%%%%%%%|%%%%%%%%|%%%%%%%%| ...

June 12, 2021 · 2 min · jiezi

关于vue.js:vue源码分析

理解 Flow官网:https://flow.org/JavaScript 的动态类型查看器,在编译阶段就进行查看而不是执行时,最终也会编译成JavaScript来运行为了保障代码的可维护性和可读性,所以vue2.x中应用flow,使得vue在代码最小改变的状况下应用动态类型查看Flow 的动态类型查看谬误是通过动态类型推断实现的文件结尾通过 // @flow 或者 /* @flow */ 申明/* @flow */function square(n: number): number {return n * n;}square("2"); // Error!调试设置咱们能够在浏览源码时通过打包调试代码来验证本人对于源码的了解是否正确打包工具 RollupVue.js 源码的打包工具应用的是 Rollup,比 Webpack 轻量Webpack 把所有文件当做模块,Rollup 只解决 js 文件更适宜在 Vue.js 这样的库中应用Rollup 打包不会生成冗余的代码 开发我的项目适宜应用webpack,开发库时适宜应用Rollup调试流程装置依赖npm i 设置 sourcemappackage.json 文件中的 dev 脚本中新增加参数 --sourcemap,开启代码映射"dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:web-full-dev"执行devnpm run dev 执行打包,用的是 rollup,-w 参数是监听文件的变动,文件变动主动从新打包此时生成的vue.js文件和vue.js.map文件,如果想要其余版本的js文件能够通过npm run build来执行 调试examples 的示例中引入的 vue.min.js 改为 vue.js关上 Chrome 的调试工具中的 source,咱们在开启sourcemap后就能够看到源码src目录了这样做的目标是如果不开启sourcemap咱们只能调试打包后的vue.js文件,该文件中有1w多行代码不不便调试而开启sourcemap后咱们能够间接通过模块的模式调试模块源码 Vue 的不同构建版本执行npm run build 从新打包所有文件官网文档 - 对不同构建版本的解释dist/README.md完整版:同时蕴含编译器和运行时的版本编译器:用来将模板字符串编译成为 JavaScript 渲染函数的代码(将template转换成render函数),体积大(3000行代码)、效率低运行时:用来创立 Vue 实例、渲染并解决虚构 DOM 等的代码,体积小、效率高。基本上就是除去编译器的代码UMD:UMD 版本通用的模块版本,反对多种模块形式。 vue.js 默认文件就是运行时 + 编译器的UMD 版本,还能够把vue挂载到window对象上CommonJS(cjs):CommonJS 版本用来配合老的打包工具比方 Browserify 或 webpack 1ES Module从 2.6 开始 Vue 会提供两个 ES Modules (ESM) 构建文件,为古代打包工具提供的版本,咱们脚手架就是这个版本ESM 格局被设计为能够被动态剖析,所以打包工具能够利用这一点来进行“tree-shaking”并将用不到的代码排除出最终的包ES6 模块与 CommonJS 模块的差别【参考阮一峰老师的文章】 ...

June 11, 2021 · 19 min · jiezi

关于vue.js:如何实现一个简单的MVVM-框架

MVVM是什么?MVVM是一种设计思维,它是Model-View-ViewModel的缩写。它也是MVC的增强版。 Model是代表数据模型,也能够在Model中定义数据批改和操作的业务逻辑。View是代表UI组件,它负责将数据模型转化成UI展示进去。ViewModel是一个同步View和Model的对象。 在MVVM框架下,View和Model之间并没有间接分割,而是通过ViewModel(桥梁)进行交互。Model和ViewModel之间的交互是双向的。ViewModel通过双向数据绑定将View和Model层连贯了起来,而View和Model之间的同步工作都是齐全主动的,无需人为操作。 MVVM解决什么问题?MVC和MVVM的区别其实并不大。都是一种设计思维。 次要就是MVC中Controller演变成MVVM中的viewModel。 MVVM次要解决了MVC中大量的DOM操作使页面渲染性能升高,加载速度变慢,影响用户体验。 当和Model频繁发生变化,开发者须要被动更新到View。 MVVM实现思路页面变动如何告诉对象分成两步,step1 页面变动如何监听 step2 给对象设值 //1addEventListern,// 2obj.value=e.target.value对象变动如何告诉页面也是分成两步step1 如何监听对象变动 两种形式:set 办法形式, proxy 形式step2 给页面元素赋值 //1let vm = new Proxy(obj,{ get function(obj, prop){} set function(obj, prop, value){ // 我变动了 }})//2el.value = obj.valueMVVM 联动起来prop => elel=>prop演示代码留神:演示代码是 (绑定一对一) <input type="text" v-model="value"/><input type="text" v-model="test1"/><script> //mvvm let _vm = { value: 'tst', test1:undefined } let vm = Vue(_vm) function Vue(vm) { const tagEventMap = { input: 'change' } const tagSetterMap = { input: 'value' } const attr2ElMap = { } // 获取 v-model let elements = document.body.querySelectorAll('[v-model]'); // 获取 field2El elements.forEach(el=>{ let fName = el.attributes['v-model'].value let tagName = el.localName attr2ElMap[fName] = { el, changeEvent: tagEventMap[tagName], setValue: tagSetterMap[tagName] } }) let _vm = new Proxy(vm, { get: function (obj, prop) { return obj[prop]; }, set: function (obj, prop, value) { let el = attr2ElMap[prop].el; obj[prop] = value; el[attr2ElMap[prop].setValue] = value console.log('update:', prop, value) } }) // 代理 设值 Object.getOwnPropertyNames(attr2ElMap).forEach((prop) => { let e = attr2ElMap[prop]; // init if(_vm[prop]){ _vm[prop] = _vm[prop] } e.el.addEventListener(e.changeEvent, ev => { _vm[prop] = ev.target[attr2ElMap[prop].setValue] }) }) return _vm }</script>援用什么是MVVM?MVVM和MVC的区别,以及MVVM的毛病 ...

June 11, 2021 · 1 min · jiezi

关于vue.js:Python如何进行内存管理

Python中次要通过援用计数和内存池机制进行内存治理。 一、援用计数机制 Python外部应用援用计数(记录对象有多少个援用)来放弃追踪内存中的对象,当对象被创立时,该对象的援用计数加1;当对象被销毁时,该对象的援用计数变为0,它会被当做垃圾进行回收。 援用计数减少的状况: (1)对象被创立,如x=4。 (2)赋值给其它游戏变量,如y=x。 (3)被作为参数传递给函数,如foo(x)。 (4)作为容器对象的一个元素,如a=[1,x,'33']。 援用计数缩小的状况 (1)对象的援用来到它的作用域,比方, foo(x)函数执行完结时,x援用的对象援用计数减1。 (2)对象的援用被显式地销毁,如del x或del y。 (3)对象的别名被赋值给其余对象,x=789。 (4)对象从窗口对象中被移除,www.sangpi.coma.remove(x)。 垃圾回收: (1)垃圾收集器会回收援用计数为0的对象,并革除这些对象占用的内存空间。 (2)当两个对象互相援用时,若它们没有被其它援用所持有,则会被垃圾收集器回收。 (3)垃圾回收机制还有一个循环垃圾回收器,它能够确保开释循环援用对象(a援用b, b援用a)。 二、内存池机制 在Python中,很多时候申请的内存都是小块内存,这些小块内存在申请不久后又会被开释,这就意味着程序在运行期间会大量地执行申请和开释操作,影响Python的执行效率。为了放慢Python的执行效率,Python引入了一个内存池机制,用于治理对小块内存的申请和开释。 Python中所有小于256个字节的对象都应用内存池的分配器。另外,一些Python对象,如整数、浮点数或列表,都领有独立的内存池,对象之间不会共享这些独立的内存池。也就是说,若调配又开释了大量的整数,用于缓存这些整数的内存池将不再调配给浮点数。 Python如何进行内存治理?下面曾经为大家做了具体的介绍, 心愿能帮到大家。

June 11, 2021 · 1 min · jiezi

关于vue.js:CS4022-High-Performance-原理解说

UNIVERSITY OF WARWICKLEVEL 7 Open Book Assessment [2 hours]Department of Computer ScienceCS4022: High Performance ComputingInstructions Read all instructions carefully – and read through the entire paper at leastonce before you start writing.There are four questions. You should attempt two questions from SectionA and the one question in Section B.You should not submit answers to more than the required number ofquestions.All questions will carry the same number of marks unless otherwise stated.You should handwrite your answers either with paper and pen or using anelectronic device with a stylus (unless you have special arrangements forexams which allow the use of a computer). Start each question on a newpage and clearly mark each page with the page number, your student id andthe question number.Handwritten notes must be scanned or photographed and all individualsolutions should (if you possibly can) be collated into a single PDF with pagesin the correct order.You must upload two files to the AEP: your PDF of solutions and a completedcover sheet.You must click FINISH ASSESSMENT to complete the submission process.After you have done so you will not be able to upload anything further.Please ensure that all your handwritten answers are written legibly, preferablyin dark blue or black ink. If you use a pencil ensure that it is not too faint to becaptured by a scan or photograph.Please check the legibility of your final submission before uploading. It is yourresponsibility to ensure that your work can be read.You are allowed to access module materials, notes, resources, referencesand the internet during the assessment. 2You should not try to communicate with any other candidate during theassessment period or seek assistance from anyone else in completing youranswers. The Computer Science Department expects the conduct of allstudents taking this assessment to conform to the stated requirements.Measures will be in operation to check for possible misconduct. These willinclude the use of similarity detection tools and the right to require liveinterviews with selected students following the assessment.By starting this assessment you are declaring yourself fit to undertake it. Youare expected to make a reasonable attempt at the assessment by answeringthe questions in the paper.Please note that:You must have completed and uploaded your assessment before the 24hour assessment window closes.You have an additional 45 minutes beyond the stated length of the paper toallow for downloading and uploading the assessment, your files andtechnical delays.For further details you should refer to the AEP documentation.Use the AEP to seek advice immediately if during the assessment period:• you cannot access the online assessment;• you believe you have been given access to the wrong online assessment.Please note that technical support is only available between 9AM and 5PM (BST).Invigilator support will be also be available (via the AEP) between 9AM and 5PM(BST).Notify Dcs.exams@warwick.ac.uk as soon as possible if you cannot completeyour assessment because:• you lose your internet connection;• your device fails;• you become unwell and are unable to continue;• you are affected by circumstances beyond your control (e.g. fire alarm).Please note that this is for notification purposes, it is not a help line.Your assessment starts below. 3Section AThis question is about fundamental knowledge.(a) What do we mean by the Granularity of Parallelism? Give four types of parallelism inorder of granularity and provide an application example for each. [7](b) Discuss how superthreading and hyperthreading reduce the waste of pipeline slots in thepipeline mechanism. [8](c) Discuss the differences between scientific applications such as matrix multiplication andgraph-based applications such as online-shopping recommendation. Focus yourdiscussions on data structure, performance metric and key factors that affect theperformance. [12](d) Analyse the following two “for” loops in Listing 1. Describe whether the iterations ofthese two loops can be parallelised automatically by compilers and explain how youreached your conclusions. [8]Loop 1:for(i=1; i<=n; i++){a[i]= b[i] + c[i];d[i]= a[i];} Loop 2:for(i=2; i<=n; i++)a[i]= b[i] + a[i-1];Listing 1: Two loops for Question 1(d)4This question is about parallel programming models.(a) The Synchronous mode is a communication mode in MPI. Explain why the Synchronousmode may incur higher communication overhead than the Standard mode. [7](b) Assume there are two MPI processes running on different machines: P0 and P1. In p0,MPI_Send is first called to send message A to p1 and then MPI_Recv is called to receivemessage B from p1. In p1, MPI_Send is first called to send message B to p0 and thenMPI_Recv is called to receive message A from p0. What will happen if the sizes of bothmessage A and B exceed the system buffers managed by MPI? Explain why. [8](c) A collective communication operation is performed by all relevant processes at the sametime with the same set of parameters. However the parameters may have differentmeanings to different processes. Describe, using illustrative examples if necessary, theoperations of the following two MPI collective communication calls. Further, discusswhat the parameters in these functions mean to different processes.i) MPI_Bcast(void *buf, int count, MPI_Datatype type, int root, MPI_Comm Comm) [6]ii) MPI_Gather(void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) [6](d) MPI_Type_create_indexed_block can be used to construct the users’ own data types. Theformat of the function is as follows: MPI_Type_create_indexed_block ( int count, int blocklengths, int *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype) Let oldtype ={(MPI_INT, 0), (MPI_CHAR, 2)} with the extent of 3 bytes. Let D=(2, 5, 10).Give the memory layout of newtype after calling MPI_Type_create_indexed_block (3, 2, D, oldtype, newtype) [8]5This question is about high performance computing systems.(a) Discuss the differences between multicore CPU and GPU in terms of architecture designand performance objective. [7](b) The topology of node interconnection plays an important role in the performance of aCluster system. Draw the topology of a 4-D hypercube. What are the values of nodedegree and bisection width of the topology? Discuss which aspect of networkperformance node degree and bisection width represent. [8](c) Discuss the difference between Cluster systems and Grid systems. [8](d) There are three potential methods to implement parallel I/O: 1) One process performs I/Ooperations for all other processes; 2) Each process reads or writes the data from or to aseparate file; 3) Different processes access different parts of a common file. Discuss theadvantages and disadvantages of each method. Which method of parallel I/O is mostwidely used nowadays? [12]Section BThis question is about performance modelling.(a) Consider a 3-D grid of equal-sized cells. Assume that the volume of the grid is V and thegrid is a cube (i.e., the length of the grid in each dimension is V1/3). Assume V=c×n,where c is the number of cells allocated to each processor and n is the number ofprocessors. Derive the surface-to-volume ratios under 1-D, 2-D and 3-D decomposition.Further, analyse under what circumstances 2-D decomposition is better than 1-Ddecomposition. [12](b) Discuss the drawbacks of using asymptotic analysis to evaluate the performance of analgorithm. Give an example for each drawback you list. [8](c) Modelling the execution time of an application is a good way of evaluating theperformance of the application. Discuss how to model the execution time of anapplication. The discussion should cover the modelling of both computation time andcommunication time, and the discussion should revolve around the various parametersused to model the execution time. [10] WX:codehelp

June 11, 2021 · 6 min · jiezi

关于vue.js:vuu2-中的函数式组件

函数式组件函数式组件(functional component)是一个不持有状态data、实例this和生命周期的组件。 函数式组件没有 data、生命周期和this,函数式组件又叫无状态组件(stateless component)。模板定义: <template functional> <div> <h1>{{ props.title }}</h1> </div></template><script> export default { name: 'FunOne', props: { title: [String], }, }</script><style></style>render 函数定义 export default { name: 'FunTwo', functional: true, props: { title: [String], }, render(h, { props }) { return h('div', {}, [h('h1', {}, props.title)]) },}不能这样定义:<template> <div> <h1>{{ title }}</h1> </div></template><script> export default { name: 'FunOne', functional: true, props: { title: [String], }, }</script><style></style>应用 render 函数定义输入框MyInput.jsx export default { name: 'MyInput', functional: true, props: { value: { type: [String, Number], default: '', }, }, // NOTE 函数式组件没有 this render(h, context) { const { props, listeners, data } = context return h('input', { // DOM 属性 domProps: { value: props.value, }, on: { input: ({ target }) => { data.on['my-change'](Math.random().toString(36)) // listeners 是 data.on 的别名 listeners['my-input'](target.value) listeners.input(target.value) }, }, }) },}在 render 函数中应用 MyInput ...

June 11, 2021 · 5 min · jiezi

关于vue.js:python-LAADSSelenium应该如何运用

from selenium import webdriver from time import sleep import tempfile import os,sys import pandas as游戏中的pd import geopandas as gpd import time 构建查问地址def GetURL(ProductID,StartTime,EndTime,search_file): # 查问边界 data = gpd.GeoDataFrame.from_file(search_file) bbox = (data.bounds.values)[0].tolist() # 钻研区范畴,左上角和右下角。依据须要结构字符串 Area = str(round(bbox[0],1))+','+str(round(bbox[3],1))+','+str(round(bbox[2],1))+','+str(round(bbox[1],1)) # 输出 MODIS 轨道矢量 modis_grid_file = 'E:\***\modis_WGS84_grid_world.shp' modis_grid = gpd.GeoDataFrame.from_file(modis_grid_file) # 查问边界笼罩的轨道核心坐标 modis_intersection = modis_grid[modis_grid.intersects(data.geometry[0])] path_row = 'Tile:' for mv in modis_intersection.values: path_row += "H"+str(mv[1])+"V"+str(mv[2])+"," # 依据以上信息构建 Search 页的网址 path_row = path_row[0:-1]url=' ...

June 11, 2021 · 3 min · jiezi

关于vue.js:网关-zuul-与-springcloud-gateway的区别

zuul1与spring-cloud-gateway的区别Zuul: 是netflix公司的我的项目,实质上是web servlet,基于JavaEE Servlet技术栈,应用阻塞API,解决的是http申请,没有提供异步反对,不反对任何长连贯,比方websocket。 依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>yml配置: server:port: 10000spring: application: name: user-service-zuuleureka: instance: prefer-ip-address: trueip-address: 127.0.0.1client:www.sangpi.com register-with-eureka: trueservice-url: defaultZone: zuul: routes: zuul-path: path: /zuul-path/**连贯:spring-cloud-gateway: Spring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlety游戏容器一起应用,也不能打包成一个WAR包,应用非阻塞API,反对websocket。 依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId></dependency>yml配置: 利用名称spring: application: name: ticket-gatewaycloud: nacos: discovery: server-addr: localhost:8848 gateway: routes: - id: user-route uri: lb://user # 负载平衡形式拜访user服务 predicates: # 匹配条件 - Path=/api/user/** filters: - StripPrefix=2 端口server: port: 10000 连贯:地址/申请门路?参数watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=zuul1与spring-cloud-gateway的区别: 1、gateway比照zuul多依赖了spring-webflux,外部实现了限流、负载平衡等,扩展性也更强,但同时也限度了仅适宜于Spring Cloud套件。zuul则能够扩大至其余微服务框架中,其外部没有实现限流、负载平衡等。 2、zuul仅反对同步, gateway反对异步。 3、gateway线程开销少,反对各种长连贯、websocket,spring官网反对,但运维简单,zuul编程模型简略,开发调试运维简略,有线程数限度,提早梗塞会耗尽线程连贯资源。

June 10, 2021 · 1 min · jiezi

关于vue.js:Vue路由传参三种方案

计划一 路由前面跟参数特点:1 参数在地址栏中显示。2 刷新页面,参数不会隐没。案例: 代码示例:------------------------------router.js------------------------------------------const routes = [ { path: '/news/:newsId', // 路由前面跟上自定义参数变量 name: 'News', component: () => import( '../views/news.vue') }]------------------------------跳转链接--------------------------------------------<router-link to="/news/a1b2c3d4e5">新闻</router-link> // 路由前面间接跟上参数或者// 特地留神:这种形式跳转将导致新闻组件生命钩子不会触发。可通过其余办法解决此问题。,此处只是阐明路由传参的用法<button @click="jumpToNews('1a2b3c4d')">跳转到新闻页</button>jumpToNews(param){ this.$router.push({ path:`/news/${param}`})}----------------------------新闻组件获取路由参数--------------------------------------mounted(){ this.newsId = this.$route.params.newsId // 通过$route.params获取指定参数(变量)},计划二 $router.push({ path:' ', query:{ id:''} })特点:1 参数在地址栏中显示。2 刷新页面,参数不会隐没。案例: 代码示例:--------路由--------------------------------------const routes = [ { path: '/news', name: 'News', component: () => import( '../views/news.vue') }]--------跳转办法----------------------------------- jumpToNews(param){ this.$router.push({ path:`/news`, query:{newsId:param}}) } --------新闻组件获取路由参数----------------------- mounted(){ this.newsId = this.$route.query.newsId },计划三 匹配路由中name属性,并通过params传参特点:1 参数不会在地址栏中显示。2 刷新页面,参数隐没。案例: ...

June 10, 2021 · 1 min · jiezi

关于vue.js:Java-设置Excel工作表为只读

Excel Excel工作表中可通过文档加密的形式来设置文档爱护,可设置文档关上明码、工作表限度编辑明码。当须要设置文档内容仅供查看而无奈编辑时,可针对sheet表格来设置内容为只读。上面,通过Java程序代码展现如何设置Excel工作表为只读模式。 Java 程序环境如下: 代码编译工具:IntelliJ IDEA Excel测试文档:.xlsx 2013 Excel类库工具:free spire.xls.jar 3.9.1 Jdk版本:1.8.0 Jar导入游戏后果如图:程序代码 import com.spire.xls.*; public class ReadOnly { public static void main(String[] args) { //加载Excel工作簿文档 Workbook wb = new Workbook(); wb.loadFromFile("sample.xlsx"); //遍历工作表 for(int i = 0; i<wb.getWorksheets().getCount();i++) { Worksheet sheet = wb.getWorksheets().get(i);//获取所有工作表 sheet.protect("123456");//设置容许编辑的明码 sheet.setProtectContents(true);//设置内容爱护(只读) } //保存文档 wb.saveToFile("ReadOnly.xlsx"); wb.dispose(); }}执行程序,生成文档,如图成果: 代码中的测试文件和后果文件门路为IDEA我的项目文件夹门路,www.sangpi.com的文件门路可另行自定义。

June 10, 2021 · 1 min · jiezi

关于vue.js:vue-render-函数使用

render 函数在 vue 的我的项目入口文件中,上面的代码新建一个 vue 的根组件,并默认命名为 Root,并将其挂载在 HTML 模板 #app div 上,它的模板在哪? new Vue({ render: h => h(App),}).$mount('#app')这是一个没有模板的组件。 &dollar;mount('#app'),选择器对应 dom 会被渲染后果替换,然而会智能地把 dom 上地属性增加到依据组件的根元素上。手动通过$mount(elector)挂载元素,替换 selector 后,dom 的属性失落。 两者体现不同,有点奇怪,然而不须要太关注这个区别。 明天再来温习 render 函数,重点关注这些容易踩坑的中央: 学习 render 函数的应用,重点:款式、事件、插槽、指令、props、v-model、函数组件的解决。学习应用 jsx 封装组件。在 render 函数中应用表单组件,因为表单组件波及到 v-model 容易踩坑。为何要理解 render ?在 render 函数中,可用 jsx 代替模板语法,可充分发挥 js 的能力,使得组件扩展性更好、封装更加优雅。 官网说得比拟明确了,然而例子过于简略,只能体现优雅,没有体现扩展性,稍后封装一个能体现扩展性的组件。 render 根底语法render 函数签名: render(createElement: CreateElement, hack: RenderContext<Props>): VNode;返回值 -- VNode (虚构节点) --- 一个用于形容 vue 组件构造的 JS 对象 返回值往往是一个单节点,划线的 context 是 vue 全局对象,有 $children 属性,是一个 VNode 数组,元素是一个 VNode,这样的层层嵌套,正好对应的组件的嵌套。 $el 是组件挂载点,\_uid 是组件 id。调试时可能会用到。也能够返回 VNode 数组。比方返回 this.$scopedSlots.default() 这是一个作用域插槽,可能是数组。参数第一个参数 createElement,是一个函数,DOM 中有 createElement 用于创立 DOM 节点。vue 中的 createElement 是用于创立 VNode 的。 ...

June 10, 2021 · 7 min · jiezi

关于vue.js:手把手创建vue-typescript版本

以前始终都是创立的vue js版本的我的项目,随着typescript的广泛,明天手把手带大家来创立一个typescript版本的我的项目。 首先介绍下我本地环境:间接应用脚手架来场景一个vue 我的项目,具体操作步骤参照https://cli.vuejs.org/zh/guid...明天才晓得能够应用图形化界面去创立vue我的项目,我应用两种形式都创立了下,如下我的配置Installed CLI Pluginsbabel router vuex eslint unit-mochae 2e-cypress typescript 脚本创立的间接npm install 插件,ui创立好的是须要本人手动npm install ,如果我没记错的话。 应用npm run serve ,咱们来看下界面 默认创立的我的项目没有vue.config.js文件的,咱们须要本人手动去创立,并做一些配置,如果咱们没有创立他默认启动端口是8080.我从vue-typescript-admin-template抄出一个vue.config.js 进去 // eslint-disable-next-line @typescript-eslint/no-var-requiresconst path = require('path')// If your port is set to 80,// use administrator privileges to execute the command line.// For example, on Mac: sudo npm run / sudo yarnconst devServerPort = 9527 // TODO: get this variable from setting.tsconst mockServerPort = 9528 // TODO: get this variable from setting.tsconst name = 'Vue Typescript Demo' // TODO: get this variable from setting.tsmodule.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/vue-ts-demo/' : '/', lintOnSave: process.env.NODE_ENV === 'development', productionSourceMap: false, devServer: { port: devServerPort, open: true, overlay: { warnings: false, errors: true }, progress: false, proxy: { // change xxx-api/login => /mock-api/v1/login // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { target: `http://127.0.0.1:${mockServerPort}/mock-api/v1`, changeOrigin: true, // needed for virtual hosted sites ws: true, // proxy websockets pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' } } } }, pluginOptions: { 'style-resources-loader': { //须要跟 vue-cli-plugin-style-resources-loader 配套应用,不然引入的款式不胜利 preProcessor: 'scss', patterns: [ path.resolve(__dirname, 'src/styles/_variables.scss'), //引入初始款式 ,不必本人在引入 path.resolve(__dirname, 'src/styles/_mixins.scss') ] } }, chainWebpack(config) { // provide the app's title in html-webpack-plugin's options list so that // it can be accessed in index.html to inject the correct title. // https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-plugin config.plugin('html').tap(args => { args[0].title = name return args }) // it can improve the speed of the first screen, it is recommended to turn on preload config.plugin('preload').tap(() => [ { rel: 'preload', // to ignore runtime.js // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171 fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/], include: 'initial' } ]) // when there are many pages, it will cause too many meaningless requests config.plugins.delete('prefetch') // https://webpack.js.org/configuration/devtool/#development // Change development env source map if you want. // The default in vue-cli is 'eval-cheap-module-source-map'. // config // .when(process.env.NODE_ENV === 'development', // config => config.devtool('eval-cheap-source-map') // ) config .when(process.env.NODE_ENV !== 'development', config => { config .optimization.splitChunks({ chunks: 'all', cacheGroups: { libs: { name: 'chunk-libs', test: /[\\/]node_modules[\\/]/, priority: 10, chunks: 'initial' // only package third parties that are initially dependent }, elementUI: { name: 'chunk-elementUI', // split elementUI into a single package priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm }, commons: { name: 'chunk-commons', test: path.resolve(__dirname, 'src/components'), minChunks: 3, // minimum common number priority: 5, reuseExistingChunk: true } } }) // https://webpack.js.org/configuration/optimization/#optimizationruntimechunk config.optimization.runtimeChunk('single') } ) }}而后在运行,浏览器关上端口就是9527了。 ...

June 10, 2021 · 2 min · jiezi

关于vue.js:vue中父组件异步数据通过props方式传递给子组件子组件接收不到的问题

问题形容组件化开发中常常用到父子组件的通信,父传子子传父等数据的操作,如果父组件的数据是发申请从后端获取的异步数据,那么父组件将这个数据传递给子组件的时候,因为是异步数据,就会呈现父组件传递过来了,然而子组件mounted钩子初始状况下是接管不到的问题。本篇文章记录了一下这个问题的解决方案。 在说这个问题之前,咱们先来回顾一下父子组件的生命周期父子组件生命周期执行程序加载渲染数据过程父组件 beforeCreate -->父组件 created -->父组件 beforeMount -->子组件 beforeCreate -->子组件 created -->子组件 beforeMount -->子组件 mounted -->父组件 mounted --> 更新渲染数据过程父组件 beforeUpdate -->子组件 beforeUpdate -->子组件 updated -->父组件 updated --> 销毁组件数据过程父组件 beforeDestroy -->子组件 beforeDestroy -->子组件 destroyed -->父组件 destroyed 能够这样了解,父组件生命周期中会先看看子组件的生命周期有没有走完,子组件生命周期走完了,才会走父组件的生命周期。 问题剖析咱们模仿一下父子组件通信的过程,写个小demo。看看在子组件中的mounted钩子中能不能接管到父组件传递过去的数据 父组件代码<template> <div id="app"> <child :msg="msg"></child> </div></template><script>import child from "./views/child";export default { name: "App", components: { child, }, data() { return { msg: "", // 咱们要把父组件从接口获取的数据存到data中的msg外面,而后再传递给子组件 }; }, created() { // 用定时器模仿发申请异步获取后端接口的数据 setTimeout(() => { this.msg = "666"; }, 200); },};</script>子组件代码<template> <div> <h2>{{msg}}</h2> </div></template><script>export default { props:{ msg:{ type:String, default:'' } }, mounted() { console.log('mounted钩子中接管',this.msg); },}</script>最终在mounted钩子中会实现,咱们会发现打印不进去,如下图 ...

June 9, 2021 · 1 min · jiezi

关于vue.js:Vuejs项目无法启动sh-1-vuecliservice-not-found

问题形容应用 npm run serve 命令启动 Vue.js 我的项目时无奈启动。具体报错如下: $ npm run serve > front-end@0.1.0 serve> vue-cli-service servesh: 1: vue-cli-service: not foundnpm ERR! code 127npm ERR! path /home/codists/projects/flask-vue-blog/front-endnpm ERR! command failednpm ERR! command sh -c vue-cli-service servenpm ERR! A complete log of this run can be found in:npm ERR! /home/codists/.npm/_logs/2021-06-09T13_29_30_797Z-debug.log问题定位1、曾经应用 npm install -g @vue/cli 装置了 Vue CLI。且 package.json 文件外面也蕴含了 "@vue/cli-service": "~4.5.0"。 然而有可能装的有问题,所以重新安装。 解决办法1、重新安装 $ rm -rf node_modules/$ npm install

June 9, 2021 · 1 min · jiezi

关于vue.js:JavaScript中循环遍历JSON响应

咱们在前端开发过程中,通过服务器获取数据的时候服务器返回的数据通常为JSON格局,明天小千就来教大家如何利用JavaScript解析服务器的响应获取咱们想要的游戏数据。 该过程通常包含两个步骤:将数据解码为本机构造(例如数组或对象),而后应用JavaScript的内置办法遍历该数据结构。 从近程API获取接口 1. 应用XMLHttpRequest API1 返回的数据为: // string // {"id":"helloworld","joke":"today is Friday!","status":200} 服务器返回了一个字符串。咱们须要先将其解析为JavaScript对象,而后能力遍历其属性。咱们能够应用JSON.parse()做到这一点,如下显示:2 2. 应用Fetch API 只管下面应用XMLHttpRequest对象的办法游戏成果很好,但在简单的场景下它就会变得十分蠢笨。上面咱们应用浏览器新提供的api,它是window对象上定义的办法fetch,你能够应用该办法执行申请。此办法返回一个Promise,可用于检索申请的响应。3 Fetch API返回响应流。这不是JSON,因而JSON.parse()须要尝试应用它的response.json()函数而不是对其进行调用。这将返回一个Promise,该Promise会将响应的注释文本解析为JSON的后果进行解析。 多种形式遍历数据 1. 应用for...in4 2. 应用Object.entries,Object.values或Owww.pizei.combject.entries5 3. 解决数组 值的有序列表(也称为数组)也是无效的JSON,让咱们钻研如何解决此类响应。 对于这个示例,咱们将应用GitHub的REST API来获取用户存储库的列表:6 如您所见,API返回了一个对象数组。要拜访每个独自的对象,咱们能够应用惯例forEach办法:7 另外,您当然能够应用下面探讨的任何办法来遍历对象的所有属性,并将它们记录到控制台:8 论断 在这篇文章中,咱们钻研了什么是JSON。我曾经演示了如何将服务器的JSON响应解析为本机数据结构(例如数组或对象),以及如何遍历这种构造以拜访其中蕴含的数据。咱们大部分web服务与服务器的交互都是围绕这个这个开展,心愿这篇文章对您有所帮忙

June 9, 2021 · 1 min · jiezi

关于vue.js:如何在-FastReport中创建波斯历

FastReport .Net是实用于Windows Forms,ASP.NET,MVC和.NET Core的全功能报表解决方案。它能够在Microsoft Visual Studio 2005-2019中应用。反对.Net Framework 2.0-4.x,.NET Core 3.0及以上版本。 在FastReport .NET 2021.3的新版本在演示应用程序中实现了HiDPI反对。增加了用于嵌入Blazor Server应用程序的Razor组件。XODT和XODS有新的进口。FastReport OpenSource版本当初能够导入DevExpress,List和Label以及SQL Server Reporting Services报表。(点击下方按钮下载) 你晓得不同的国家有不同的日期格局吗?当您制作多语言报告或针对他们说波斯语(波斯语)的国家/地区进行报告时,以正确的格局显示日期很重要。默认状况下,FastReport 应用欧洲日期格局,但 .NET 工具容许将其转换为不同的格局。 因而,咱们的工作是将日期转换为波斯格局。例如,咱们的报告有一个表达式 [Date],示意明天的日期: [æ¥æ] 表达式[Date]以DateTime格局获取以后零碎日期,但所有解决后的文本报告的值是String。让咱们在报告脚本中创立一个新函数: private void ConvertToPersianDate(object sender, EventArgs e)1.咱们将从文本对象中唤起这个性能。咱们创立一个长期变量,它将对象的文本转换为 www.sangpi.comDateTime: DateTime d = DateTime.Parse((sender as TextObject).Text);1.“sender as TextObject”是调用函数的对象的地址。如果咱们以这种形式解决它,咱们就能够应用它的性能和属性。 之后,咱们将须要 PersianCalendar 对象,它将日期转换为波斯语格局: PersianCalendar pc = new PersianCalendar ( ) ;1.请留神,此对象存储在 System.Globalization 库中,并且必须在“应用”局部中指明。 而后咱们必须更改对象的文本。更具体地思考游戏这一行: (sender as TextObject).Text = string.Format("{0}/{1}/{2}", pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));1.在这里咱们设置对象的文本。该值的格局为年/月/日,因为咱们应用 PersianCalendar 的函数来获取相应的值。能够依据须要编辑设置文本的代码局部。例如,day.month.year 格局的日期代码如下所示: "{0}.{1}.{2}", pc.GetDayOfMonth(d), pc.GetMonth(d), pc.GetYear(d)1.后果,咱们失去以下函数: ...

June 9, 2021 · 1 min · jiezi

关于vue.js:Vue实现原理图文讲解

本文章转自:乐字节 文章次要解说:Vue实现原理 获取更多VUE相干材料及我的项目能够关注公众号《乐字节》 发送:999 1、Vue简介当初的大前端时代,是一个动荡纷争的时代,江湖中曾经分成了很多门派,次要以Vue,React还有Angular为首,造成前端框架三足鼎立的局势。Vue在前端框架中的位置就像已经的jQuery,因为其简略易懂、开发效率高,曾经成为了前端工程师必不可少的技能之一。 Vue是一种渐进式JavaScript框架,完满交融了第三方插件和UI组件库,它和jQuery最大的区别在于,Vue无需开发人员间接操作DOM节点,就能够扭转页面渲染内容,在利用开发者具备肯定的HTML、CSS、JavaScript的根底上,可能疾速上手,开发出优雅、简洁的利用程序模块。 然而咱们提及Vue的时候,更多的是关注它的用法,而不是学习它是如何解决前端问题的,这多少有点亚健康。有前端开发教训的人,肯定在开发过程中遇到过奇奇怪怪的问题,而后稀里糊涂地解决,假使再次遇到类似的问题,便再次不知所措,作为一名前端工程师,在遇到问题的时候咱们是否能精确定位产生问题的起因并及时解决,次要取决于咱们对前端框架的了解是否足够深刻。 2、Vue实现原理2.1 虚构DOM(Virtual DOM)随着时代的倒退,Web利用的页面交互成果越来越简单,页面性能越来越丰盛,须要保护的状态越来越多,DOM操作也越来越频繁。DOM操作尽管简略易用,然而会产生不好保护的问题。 在程序执行的过程中,Watcher初始化时会将每一个节点和状态进行一一关联和映射,setter监听到Data的状态产生扭转后,就会告诉Watcher,Watcher会将这些变动告诉已经记录过的DOM以及跟这些状态相干的节点,从而触发页面的渲染过程。组件接管到状态变动后,会通过编译将模板转换成渲染函数Render,执行渲染函数就会失去一个虚构DOM树,通过比照旧的虚构DOM和新生成的虚构DOM树,来更新对应的理论DOM节点,执行页面渲染。 支流前端框架简直都在应用虚构DOM,然而在应用虚构DOM的时候,Angular和React都无奈确定具体是哪个状态产生了变动,因而须要在旧的虚构DOM和新的虚构DOM之间进行暴力比照,但Vue从1.0版本开始,就通过细粒度的绑定来更新视图,也就是说,当状态发生变化的时候Vue能够晓得具体是哪个状态哪些节点须要产生扭转,从而对这个节点执行更新,然而这种细粒度的变动侦测会有一些内存开销影响性能,一个我的项目越简单,开销就越大。 Vue从2.0版本后,为了优化性能,引入了虚构DOM,抉择了一个折中的计划,既不须要暴力比照整个新旧虚构DOM,也不须要通过细粒度的绑定来实现视图的更新,即以组件为单位进行Watcher监听,也就是说即使一个组件内有多个节点应用了某个状态,也只需一个Watcher来监听这个状态的变动,当这个状态发生变化时,Watcher告诉组件,组件外部通过虚构DOM的形式去进行节点的比照和从新渲染。 2.2 罕用指令实现原理指令是指Vue提供的以“v-”前缀的个性,当指令中表达式的内容发生变化时,会连带影响DOM内容发生变化。Vue.directive全局API能够创立自定义指令,并获取全局指令,除了自定义指令,Vue还内置了一些开发过程中罕用的指令,如v-if、v-for等。在Vue模板解析时,会将指令解析到AST,应用AST生成字符串的过程中实现指令的性能。 在解析模板时,会将节点上的指令解析进去并增加到AST的directives属性中,directives将数据发送到VNode中,在虚构DOM进行页面渲染时,会触发某些钩子函数,当钩子函数被触发后,就阐明指令已失效。 2.2.1 v-if指令原理在应用程序中应用v-if指令: 在编译阶段生成: 在代码执行时,会依据create的值来抉择创立哪个节点。 2.2.2 v-for指令原理在应用程序中应用v-for指令: 在编译阶段生成: _l是renderList的别名,执行代码时,_l函数会循环list变量,调用第二个参数中传递的函数,传递两个参数:item和index,当_c函数被调用时,会执行_v函数,创立一个节点。 2.2.3 自定义指令原理在应用程序中,指令的解决逻辑别离监听了create函数、update函数以及destory函数,具体实现如下: 钩子函数被触发后,会执行updateDirectives函数,代码如下: 在该函数中,不管是否存在旧虚构节点,只有其中存在directives,就会执行_update函数,_update函数代码如下: isCreate:判断该虚构节点是否是一个新建的节点。 isDistory:判断是否删除一个旧虚构节点。 oldDirs:旧的指令汇合,oldVnode中保留的指令。 newDirs:新的指令汇合,vnode中保留的指令。 dirsWithInsert:触发inserted指令钩子函数的指令列表。 dirsWithPostpatch:触发componentUpdated钩子函数的指令列表。 通过normalizeDirectives函数将模板中应用的指令从用户注册的自定义指令汇合中取出来的后果如下: 自定义指令的代码为: 虚构DOM在比照和渲染时,会依据不同情景触发不同的钩子函数,当应用虚构节点创立一个新的理论节点时,会触发create钩子函数,当一个DOM节点插入到父节点时,会触发insert钩子函数。 callHook函数执行钩子函数的形式如下: callHook函数的参数意义别离为: dir:指令对象。 hook:将要触发的钩子函数名。 vnode:新的虚构节点。 oldVnode:旧的虚构节点。 isDestory:判断是否删除一个旧虚构节点。 虚构DOM在渲染时会触发的所有钩子函数及其触发机制如下: 须要留神的是,remove函数是只有一个元素从其父元素中移除时才会触发,如果该元素是被移除元素的子元素,则不会触发remove函数。 感激大家的认同与反对,小编会继续转发《乐字节》优质文章

June 9, 2021 · 1 min · jiezi

关于vue.js:vue3安装以及环境搭建

装置node https://nodejs.org/$ node -v ----须要下载比拟新的版本来适配vue3v14.16.0装置vue-cli3.0脚手架npm install -g @vue/cli如果有旧版本,须要先卸载:npm uninstall vue-cli -gvue -V 查看装置后的版本呢新建vue工程 vue create project-name抉择须要的配置,能够手动配置,也能够应用默认的运行我的项目 npm run server

June 9, 2021 · 1 min · jiezi

关于vue.js:JMonkeyEngine中是如何使用AppState来管理和实现游戏场景切换的

什么是AppState一般来说JME中的AppState是为了解决简单游戏场景中各种游戏元素的治理问题,当游戏越来越大,越来越简单的时候,游戏中的各种元素(例如:模型、环境、事件、特效等), 将会变得越来越难以治理和管制。 AppState的存在就能够用来将游戏场景中的各种元素拆散、解耦到不同的AppState下进行运行, 再通过将不同的AppState组合到一起放到游戏中,就能够组成不同状态的游戏场景。 先看一下AppState在Application中的存在及生命周期是怎么的? 一个JME游戏利用中能够存在多个AppState, 通过应用以下两个办法来将AppState增加到游戏或从游戏中移除。 stateManager.attach(AppState appState);stateManager.detach(AppState appState);每个AppState的一个残缺生命周期会经验:initialize -> update -> cleanup这几个办法。 当AppState被增加(attach)到游戏中时, initialize办法会被调用一次,以初始化AppState而后AppState会在游戏中不停的循环执行update办法。直到有人调用了stateManager的detach办法将AppState从游戏中移除,此时AppState的cleanup办法会被调用一次,以清理及开释该AppState所产生的资源,而后该AppState就会被彻底移除 AppState的实现准则AppState的实现准则个别应该是这样的: 当你在AppState的initialize办法或update办法中向游戏中增加了任何资源后,在cleanup办法就要确保将这些资源从游戏中移除或清理,否则AppState在移除后可能会残留一些游戏元素在游戏中占用资源,这可能会导致内存问题及性能影响。每个AppState应该实现各自不同的性能,各个AppState之间应该尽量独立互不影响,从而将游戏中的复杂度拆分到不同的AppState中。比方当增加或从游戏中移除一个AppState时,不应该导致其它AppState出错或解体。 AppState的应用示例上面拿一个示例来阐明,例如,咱们能够实现这样一个游戏,这个游戏中蕴含以下AppState: SceneAppStateA 游戏场景A, 寄存游戏元素,如人物、房子、地形、动物、动物等。SceneAppStateB 游戏场景B, 寄存游戏元素,如人物、房子、地形、动物、动物等。RainEnvAppState 环境, 下雨环境,能够在AppState中增加雨水声效、用于渲染雨水的特效过滤器等等。SnowEnvAppState 环境, 下雪环境,能够在AppState中增加雪花飘飘的特效、声效等。UIAppState 游戏UI界面那么当初如果你想要初始化一个游戏场景,要实现一个让场景A下雨的游戏的话,就通过这样来操作: @Overridepublic void simpleInitApp() {stateManager.attach(sceneAppStateA);stateManager.attach(rainEnvAppState);stateManager.attach(uiAppState);} 那么失去的Application中AppState的状态就像是下面这样的: A场景正在下雨中。 如果要让场景A下雪,则能够调用像相似上面这样的办法来从落雨场景切换到下雪的场景。 public void changeToSnowEnv() {stateManawww.cungun.comger.detach(rainEnvAppState)stateManager.attach(snowEnvAppState);} 那么失去的Application中AppState的状态就像是下面这样的: A场景当初正在下雪。 同样的,如果你要从场景A转换场景B,例如:你在游戏中有一个传送门,能够让你从A地图传送到B地图,那么你就能够在传送的时候调用像上面这样的办法来切换到场景B: public void changeToSceneB() {stateManager.detach(sceneAppStateA)stateManager.attach(sceneAppStateB);} 那么失去的Application中AppState的状态就像是下面这样的:一个正在下雪的场景B。 代码示例那么上面应用残缺的代码来示例如何在游戏中进行场景切换,次要的重点是放在AppState的切换以及实现AppState时的原则上,所以代码写得很简略,在明确了这些简略原理之后,我想,谁都能够把它变得更加简单。 这个示例中演示了如何在游戏中切换场景A和场景B(通过按键A\B切换) package mygame; import com.jme3.app.SimpleApplication;import com.jme3.input.KeyInput;import com.jme3.input.controls.ActionListener;import com.jme3.input.controls.KeyTrigger; /** SimpleGame用于演示如何应用JME的AppState来实现切换场景A和场景B的性能。@author huliqing*/public class SimpleGame extends SimpleApplication {private final AppStateA sceneA = new AppStateA();private final AppStateB sceneB = new AppStateB(); ...

June 9, 2021 · 2 min · jiezi

关于vue.js:接入网易七鱼客服iframe打开聊天界面的问题

最近我的项目要求接入网易七鱼客服,七鱼技术举荐用open形式关上,然而领导要求用url形式而后iframe显示,然而url形式有时会呈现onready办法不触发,或者触发了然而进error的。前面打印返现办法掉了一次,然而success里打印了4次随后就进了error。故作了return解决。代码如下: (function (w, d, n, a, j) { w[n] = w[n] || function () { (w[n].a = w[n].a || []).push(arguments)} j = d.createElement('script') j.async = true j.src = 'https://qiyukf.com/script/qiy... d.body.appendChild(j)})(window, document, 'ysf')window.isSdkReady = falsewindow.fn = []ysf('onready', function () { window.isSdkReady = true if (window.fn[0]) { window.fn[0]()}})function openUrl (data, type,callBack) { let isOk = false ysf('config', { uid: data.playerId, data: JSON.stringify([ {'key': 'real_name', 'value': data.playerName}, {'key': 'player_id', 'label': "玩家ID", 'value': data.playerId},]),staffid: data.qiyuKefuId, // 客服idsuccess: function () { // 胜利回调 if(isOk) { return } let url = ysf('url') callBack(url) isOk = true},error: function (e) { // 谬误回调 if(isOk) { return } isOk = true callBack('网络连接失败')}})}另外:mumu模拟器(夜神是好的),ipad环境下会辨认成web模式,聊天界面显示没有撑满屏幕的状况,这是mumu模拟器的bug。(这是web模式下才会显示的) ...

June 9, 2021 · 1 min · jiezi

关于vue.js:一文教会你认识Vuex状态机

摘要:简略来说,Vuex就是实现组件全局状态(数据)治理的一种机制,能够不便的实现组件之间数据的共享。本文分享自华为云社区《Vuex状态机疾速理解与利用》,原文作者:北极光之夜。 一. 速识概念:1. 组件之间共享数据的形式:通常有以下几种形式: 父向子传值:v-bind 属性绑定;子向父传值:v-on 事件绑定;兄弟组件之间共享数据:EventBus;2. vuex是什么:依照官网的话来说,Vuex 是一个专为 Vue.js 利用程序开发的状态管理模式。它采纳集中式存储管理利用的所有组件的状态,并以相应的规定保障状态以一种可预测的形式发生变化。Vuex 也集成到 Vue 的官网调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试性能。简略来说,Vuex就是实现组件全局状态(数据)治理的一种机制,能够不便的实现组件之间数据的共享。3.应用vuex长处:可能在vuex中集中管理共享的数据,易于开发和前期保护。可能高效地实现组件之间的数据共享, 进步开发效率。存储在vuex中的数据都是响应式的,可能实时保持数据与页面的同步。解决了非父子组件的消息传递(将数据寄存在state中)。缩小了AJAX申请次数,有些情景能够间接从内存中的state获取。个别状况下,只有组件之间共享的数据,才有必要存储到vuex中。而对于组件中的公有数据,就没必要了,仍旧存储在组件本身的data中即可。当然,如果你想要都存在vuex中也是能够的。 二. 根本应用:1.装置依赖包:npm install vuex --save 2.导入依赖包:import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)3.创立store对象:import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({//state中寄存的就是全局共享的数据 state: { count: 0 }})4. 将store对象挂载到vue实例中:new Vue({ el: '#app', store})此时所有组件就能够从store中获取数据了。 三.创立我的项目:上面为创立一个vue我的项目流程,前面会有案例: (1)关上cmd窗口输出 vue ui 关上vue的可视化面板: (2)抉择新建我的项目门路: (3)命名: (4)手动抉择配置,留神用的是vue2版本: (5)创立: (6)下一步: (7)创立胜利,到对应目录关上vscode开始编程: (8)运行我的项目: 四. 解说前提:前提(留神): 写一个计数器小案例,从案例中配合概念能更快上手vuex。所以上面外围概念中的代码局部是基于这个小案例来演示的。指标:写两个子组件,有一个公共count值,在父组件中,其中一个组件实现点击后count值减1,一个组件实现点击后count值增1。 ...

June 9, 2021 · 4 min · jiezi

关于vue.js:如何与Vuejs集成实现最终用户编辑器

创立 Vue利用创立 Vue 利用的最简略的办法是应用Vue CLI vue create -p default arjs-vue-designer-app装置 ActiveReportsJS 相干文件Web 报表设计器性能是放在@grapecity/activereports-vue NPM 包中,@grapecity/activereports npm 包中寄存外围性能。在应用 ActiveReportsJS 时,能够执行以下命令来装置在利用根目录下: npm install @grapecity/activereports-vue @grapecity/activereports或者应用yarn命令 yarn add @grapecity/activereports-vue @grapecity/activereports如果您应用的是 Vue 2.0, 须要装置@vue/composition-api 包: npm install @vue/composition-api或 yarn add @vue/composition-api 将 ActiveReportsJS报表增加到应用程序ActiveReportsJS 应用 JSON格局和rdlx-json扩大用于报表模板文件。在应用程序的public文件夹下,创立名为report.rdlx-json的新文件,并在该文件中插入以下JSON内容。 { "Name": "Report", "Body": { "ReportItems": [ { "Type": "textbox", "Name": "TextBox1", "Value": "Hello, ActiveReportsJS Designer", "Style": { "FontSize": "18pt" }, "Width": "8.5in", "Height": "0.5in" } ] }}增加设计器宿主元素关上 src\App.vue 文件,增加代码如下,单文件组件 调用 Vue 报表设计器来加载上一步骤创立的报表模板 ...

June 9, 2021 · 1 min · jiezi

关于vue.js:如何基于现有框架的table进行二次封装

有时候大家必定在想,我能不能间接一个columns,间接进去一个表格,我以前分享过相似表单的封装,明天给大家带来表格的封装,心愿能帮忙到须要的人,如果有帮忙到你,能够点个赞 <template> <div> <v-table :data="tableData" :columns="columns"> </v-table> </div></template><script>export default { data() { return { tableData: [ { date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄', }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄', }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1519 弄', }, { date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1516 弄', }, ], columns: [ { prop: 'date', label: '日期', }, { prop: 'name', label: '题目', }, { prop: 'address', label: '地址', } ], }; }};</script>怎么实现呢?是不是能够在element-ui的根底上再封装一层呢?!!!上代码 ...

June 9, 2021 · 2 min · jiezi

关于vue.js:Sql-Server关于create-index-include带有包含列的索引的最全解释

By including nonkey columns, you can create nonclustered indexes that cover more queries. This is because the nonkey columns have the following benefits: They can be data types not allowed as index key columns.They are not considered by the Database Engine when calculating the number of index key columns or index key size. 在SqlServer 2016中,当咱们要给一个长度超过1700的列创立索引时,数据库会通知咱们为这个列建索引会超过限度,而include的列是不在这个限度外面的。 create table t1(hid int,hname varchar(4000),hname1 varchar(4000))create index ind_hname on t1(hname) --正告Warning! The maximum key length for a nonclustered index is 1700 bytes. The index 'ind_hname' has maximum length of 4000 bytes. For some combination of large values, the insert/update operation will fail.create index ind_hname on t1(hid) include(hname) --不报错,失常创立,索引键列是hid,蕴含列是hname ...

June 8, 2021 · 2 min · jiezi

关于vue.js:Django框架Flask框架和Tornado框架各有什么优缺点

Django:Python 界最全能的 web 开发框架,battery-include 各种性能齐备,可维护性和开发速度一级棒。常有人说 Django 慢,其实次要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,取决于我的项目对数据库交互的要求以及各种优化。而对于 Django 的同步个性导致吞吐量小的问题,其实能够通过 Celery 等解决,倒不是一个基本问题。Django 的我的项目代表:Instagram,Guardian。 Tornado:天生异步,性能强悍是 Tornado 的名片,然而 Tornado 相比 Django 是较为原始的框架,诸多内容须要本人去解决。当然,随着我的项目越来越大,框架可能提供的性能占比越来越小,更多的内容须要团队本人去实现,而大我的项目往往须要性能的保障,这时候 Tornado 就是比拟好的抉择。Tornado我的项目代表:知乎。 Flask:微框架的榜样,号称 Python 代码写得最好的我的项目之一。Flask 的灵活性,也是双刃剑:能用好 Flask 的,能够做成 Pinterest,用不好就是劫难(显然对任何框架都是这样)。Flask 尽管是微框架,然而也能够做成规模化的 Flask。加上 Flask 能够自由选择本人的数据库交互组件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等异步个性当前,Flask 的性能绝对 Tornado 也不逞多让,兴许Flask 的灵活性可能是某些团队更须要的。 一、Django 次要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不论你用失去用不到,反正它全都有,属于全能型框架 长处: 大和全(重量级框架) 自带orm,template,view 须要的性能也能够去找第三方的app 重视高效开发 全自动化的治理后盾(只须要应用起www.sangpi.comORM,做简略的定义,就能主动生成数据库构造,全功能的治理后盾) session性能 毛病: template不怎么好用(来自本身的毛病) 数据库用nosql不不便(来自本身的毛病) 如果性能不多,容易臃肿 二、Torando 次要特点是原生异步非阻塞,在IO密集型利用和多任务处理上占据绝对性的劣势,属于专一型框架 长处: 少而精(轻量级框架) 重视性能优越,速度快 解决高并发(申请解决是基于回调的非阻塞调用) 异步非阻塞 ...

June 8, 2021 · 1 min · jiezi

关于vue.js:游戏开发-XNAGame003-拖放控件vs会自动添加代码

拖放一个标签,三个按钮,属性栏中设定各自的属性,最终造成的代码,就和咱们本人手动写代码是一样的。 form1.cs using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms; namespace XNAGame_003{ public partial class Form1 : Form{ public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label1.ForeColor = Color.Blue; } private void button2_Click(object sender, EventArgs e) { label1.ForeColor = Color.Black; } private void button3_Click(object sender, EventArgs e) { this.Close(); }}} 控件是拖放的,属性是属性栏中设定的。 参考一下主动的游戏代码 form1.design.cs namespace XNAGame_003{ partial class Form1{ ////// 必须的设计器变量。 ///private System.ComponentModel.IContainer components = null; ////// 清理所有正在应用的资源。 //////如果应开释托管资源,为 true;否则为 www.cungun.comfalse。protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 ////// 设计器反对所需的办法 - 不要 /// 应用代码编辑器批改此办法的内容。 ///private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // label1 // this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label1.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; this.label1.Location = new System.Drawing.Point(39, 34); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(104, 16); this.label1.TabIndex = 0; this.label1.Text = "我是一个标签"; // // button1 // this.button1.Location = new System.Drawing.Point(42, 68); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 1; this.button1.Text = "蓝色"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(42, 110); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 2; this.button2.Text = "彩色"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // button3 // this.button3.Location = new System.Drawing.Point(42, 153); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(75, 23); this.button3.TabIndex = 3; this.button3.Text = "退出"; this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button3;}} ...

June 8, 2021 · 2 min · jiezi

关于vue.js:记录HBuilderX-自定义项目打包App流程

一、新建一个 5+App 我的项目,默认模板即可。 二、把打包的 dist 文件中的资源文件复制到 新建的 test_app 我的项目中替换掉。 三、依据本人的需要配置 manifest.json 文件。留神点:根底配置中,“利用版本号”,每次要更新时,必须要批改,否则软件不会被笼罩。 四、发行正式打包成 Apk,依据须要可自行配置。步骤:发行--> 原生App-云打包

June 8, 2021 · 1 min · jiezi

关于vue.js:如何在angular中使用vue

将Vue组件包装为本Web组件。因为Angular反对应用自定义Web组件,因而可能应用Vue组件(包装为Web组件)。 对于Angular,如果自定义Web组件是由Vue生成的,那么它就没有区别(对于所有Angular都晓得,它们能够是本机HTML元素) 咱们应用vue-custom-element来来进行包装 demo地址:这里应用element-ui作为组件导入angular应用代码地址 <script src="https://unpkg.com/vue"></script><script src="https://unpkg.com/vue-custom-element@3.0.0/dist/vue-custom-element.js"></script><link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"><script src="https://unpkg.com/element-ui/lib/index.js"></script><script> const MyVueWebComp = { props: ['msg'], template:` <div style="border: 3px dashed green; padding: 5px"> I am my-vue-web-comp.<br> Value received via "msg" prop: {{ msg }}<br> <input v-model="text"><button @click="addText">Type something and click me</button> <div v-for="t in texts"> Text: {{ t }} </div> <div> <el-button @click="show()" type="danger">Button</el-button> <el-dialog :visible.sync="visible" title="Hello world"> <p>我是vue Element 组件</p> </el-dialog> </div> </div> `, data() { return { text: '', texts: [], visible : false }; }, methods: { addText() { this.texts.push(this.text); this.text = ''; }, show() { this.visible = true; } } }; Vue.customElement('my-vue-web-comp', MyVueWebComp);</script><my-app>loading</my-app>如果是ts内应用(同样vue.js也是再index.html引入) ...

June 7, 2021 · 1 min · jiezi

关于vue.js:总结vue-预渲染

环境vue-cli@3创立的空白我的项目(vue,vue-router)prerender-spa-plugin@3.4.0根底const PrerenderSPAPlugin = require("prerender-spa-plugin");const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;const path = require("path");module.exports = { configureWebpack: (config) => { if (process.env.NODE_ENV !== "production") return; return { plugins: [ new PrerenderSPAPlugin({ // 必填 - app预渲染的webpack打包输入目录 staticDir: path.join(__dirname, "dist"), // 必填 - 预渲染的路由门路 routes: ["/", "/about"], }), ], }; },};进阶const path = require('path')const PrerenderSPAPlugin = require('prerender-spa-plugin')const Renderer = PrerenderSPAPlugin.PuppeteerRenderermodule.exports = { plugins: [ ... new PrerenderSPAPlugin({ // 必填 - app预渲染的webpack打包输入目录 staticDir: path.join(__dirname, 'dist'), // 可选 - app应该渲输入的门路 // (默认是staticDir.) outputDir: path.join(__dirname, 'prerendered'), // 可选 - index.html 地位 indexPath: path.join(__dirname, 'dist', 'index.html'), // 必填 - 预渲染的路由门路 routes: [ '/', '/about', '/some/deep/nested/route' ], // Optional - Allows you to customize the HTML and output path before // writing the rendered contents to a file. // renderedRoute can be modified and it or an equivelant should be returned. // renderedRoute format: // { // route: String, // Where the output file will end up (relative to outputDir) // originalRoute: String, // The route that was passed into the renderer, before redirects. // html: String, // The rendered HTML for this route. // outputPath: String // The path the rendered HTML will be written to. // } postProcess (renderedRoute) { // Ignore any redirects. renderedRoute.route = renderedRoute.originalRoute // Basic whitespace removal. (Don't use this in production.) renderedRoute.html = renderedRoute.html.split(/>[\s]+</gmi).join('><') // Remove /index.html from the output path if the dir name ends with a .html file extension. // For example: /dist/dir/special.html/index.html -> /dist/dir/special.html if (renderedRoute.route.endsWith('.html')) { renderedRoute.outputPath = path.join(__dirname, 'dist', renderedRoute.route) } return renderedRoute }, // 可选 - 应用 html-minifier (https://github.com/kangax/html-minifier) // 压缩生成的HTML文件. // Option reference: https://github.com/kangax/html-minifier#options-quick-reference minify: { collapseBooleanAttributes: true, // 从布尔属性中疏忽属性值 collapseWhitespace: true, // 折叠节点之间的空白 decodeEntities: true, // 尽可能应用Unicode字符 keepClosingSlash: true, // 在单例元素上保留开端斜杠 sortAttributes: true // 按频率排列属性 }, // Server configuration options. server: { // 通常会自动检测到闲暇端口,但如果须要能够自定义设置。 port: 8001 }, // 理论要应用的预渲染器. (你能够本人编写,预计很难) // Available renderers: https://github.com/Tribex/prerenderer/tree/master/renderers renderer: new Renderer({ // 可选 - 要增加到window对象的属性的名称,内容为`inject`. injectProperty: '__PRERENDER_INJECTED', // 可选 - 任何你想让你的应用程序通过'window.injectProperty'拜访的值。 inject: { foo: 'bar' }, // 可选 - 默认是0,没有限度 // 路由是异步渲染的。 // 应用它来限度并行渲染的路由数量。 maxConcurrentRoutes: 4, // 可选 - 期待渲染,直到在文档上分派指定的事件。 // eg, with `document.dispatchEvent(new Event('custom-render-trigger'))` renderAfterDocumentEvent: 'custom-render-trigger', // 可选 - Wait to render until the specified element is detected using `document.querySelector` renderAfterElementExists: 'my-app-element', // 可选-期待渲染,直到肯定的工夫曾经过来. // 不举荐 renderAfterTime: 5000, // 期待5s // Other puppeteer options. // (See here: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions) headless: false // Display the browser window when rendering. Useful for debugging. }) }) ]}参考文章预渲染 prerender-spa-plugin 避坑指南

June 7, 2021 · 2 min · jiezi

关于vue.js:结合webpackvuesasselementui快速搭建框架

一、申明sass:负责款式;vue:使用vuex、vue-router、axios(独立)、数据双向绑定;webpack:加载资源和打包;elementui:ui框架;这是疾速搭建我的项目一种模式,再联合第三插件和vue的格调指南,这样搭建的技术成本低且实用,如果有更好的模式或者倡议,欢送大家留言。 二、步骤1、装置node,官网下载安装即可,装置完后查看版本号; 2、装置vue-cli脚手架,输出指令 npm install --global vue-cli 3、利用脚手架创立vue我的项目myProject,创立指令 vue init webpack myProject全都输出n,顺次回车,装置实现后,会在本地生成以下文件:4、顺次执行以下命令进行装置依赖,也能够应用yarn进行装置; npm installnpm install vue-routernpm install vuex --savenpm install axiosnpm install node-sass --save-dev npm install sass-loader --save-devnpm install element-ui -Snpm install echarts --save举荐插件: npm i --save normalize.css //提供跨浏览器的高度一致性npm i --save nprogerss //加载进度条npm i --save lodash //一个高性能的js工具库npm i --save es6-promise //兼容es6npm i babel-plugin-dynamic-import-node --save-dev //解决编译过慢的问题注意事项:如果手动装置sass装置遇到报错,能够是存在版本兼容问题,解决就是"node-sass": "^4.11.1","sass-loader": "^7.3.0"搭配。 6、运行我的项目,执行命令 npm run dev7、打包我的项目,执行命令npm run build

June 7, 2021 · 1 min · jiezi

关于vue.js:Spring注解游戏开发

注解代替xml配置1、须要4+2包+aop包,.xml中导入www.cungun.com新的束缚(Context)即可. 2、将对象注册到容器中 3、将值注入属性中 4、将援用类型注入属性' 举荐应用第一种和第二种,第二种和第三种实用于多个游戏car;5、指定对象的域 6、指定对象的初始化|销毁办法 Spring整合Junit测试 AOP思维:纵向反复代码,横向抽取利用于:Filter解决乱码;intercepter登录校验;动静代理中的事务管理;Spring的AOP: 对传统动静代理&CGLib代理进行了封装; 动静代理: 必须提供接口;CGLIB代理:不须要接口.继承被代理对象产生代理;论断: spring 封装两种代理形式.目标能够对所有类生成代理.不论有没有接口;Spring实现aop开发(XML配置)步骤一、导包4+2包+spring-aop包+spring-aspect包+aop联盟包+aspect织入包 步骤二、筹备指标对象 步骤三、编写告诉类 步骤四、将告诉织入指标对象造成代理 Spring实现aop开发(注解)步骤一、导包;步骤二、筹备指标对象;步骤三、编写告诉类 步骤四、xml中配置

June 7, 2021 · 1 min · jiezi

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

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

June 7, 2021 · 1 min · jiezi

关于vue.js:npm-ERR-Cannot-read-property-match-of-undefined-错误处理

npm install 忽然报这个错 之前还是好好地 npm ERR! Cannot read property 'match' of undefinednpm ERR! A complete log of this run can be found in:npm ERR! C:\Users\user\AppData\Roaming\npm-cache\_logs\2018-08-06T01_49_46_486Z-debug.log回顾了一下 应该是我的项目多出了package-lock.json导致的 依照以下步骤顺次操作即可: npm cache clear --force (执行实现后npm install 没效再执行步骤2)删了我的项目文件夹上面的package-lock.json,而后再运行npm install(没效执行步骤3)rm -rf node_modulesrm package-lock.jsonnpm cache clear --forcenpm install

June 5, 2021 · 1 min · jiezi

关于vue.js:前端使用tensorflowjs模型实现浏览器摄像头视频流人像识别背景虚化背景替换

背景实习期间有个需要,须要前端调用算法模型,封装成npm包,供视频会议组去用,从而在视频会议中实现背景虚化,背景替换性能。后续可能会进一步退出一些好玩的性能,如面部特效(胡子,一字眉),头发色彩替换等。 实现成果应相似于上面这样 腾讯会议界面: 为了给需求方演示,先采纳google的TensorFlow.js的 BodyPix 模型做了一个小demo,先实现背景虚化和背景替换性能,模型的成果较为称心,显示画面晦涩。 TensorFlow.js 是一个 JavaScript 库。 咱们能够借助于它,来间接用 JavaScript 去创立新的机器学习模型和部署现有模型。对于前端人员入门机器学习非常敌对。 TensorFlow.js 提供了很多开箱即用的预训练模型(见下图): 这里选用了图像处理类别外面的BodyPix模型 这是BodyPix的官网演示demo https://storage.googleapis.co... demo里的性能对咱们的需要来说有些过于简单,也没有背景替换性能。因而,我本人写了一个针对于背景虚化,背景替换场景的demo。 介绍思路: 在浏览器中关上摄像头,获取视频流图片,调用tensorflow.js的 body-pix 模型的办法,来绘制后果。 其中背景虚化比拟容易实现,可间接用模型提供的drawBokehEffect办法;模型没有现成的背景替换的接口,用canvas的绘制办法对模型的toMask办法返回的遮罩对象 (由前景色&背景色的像素点数组,其中前景色代表人像区域,背景色代表其余区域) 进行了一些解决,从而实现背景替换(前面会具体介绍)。用到的技术:vue+element ui, tensorflow.js(无需特意学习,间接用其中的示例即可) 以及一些canvas的简略操作本我的项目的代码已放到github https://github.com/SprinaLF/f...实现成果先上一下最终的成果: 1.起始界面:视频在开启摄像头后会在下方展现,拍的照片会展现在视频的下方 背景虚化:可抉择中,高,低三种虚化水平 背景替换:模式切换为背景替换后,展现背景图列表,可切换背景 外围过程一. 引入模型有两种办法 引入script<!-- Load TensorFlow.js --><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2"></script><!-- Load BodyPix --><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/body-pix@2.0"></script>装置,用如下命令(我的我的项目中曾经装置了tensorflow.js和bodyPix,运行时间接yarn install装置依赖即可)$ npm install @tensorflow/tfjs 或 yarn add @tensorflow/tfjs$ npm install @tensorflow-models/body-pix二. 加载模型body-pix有两种算法模型架构,MobileNetV1 and ResNet50。 经本地尝试,MobileNetV1启动速度十分慢,对GPU的要求比拟高,不适宜个别电脑及挪动设施,这里只思考 MobileNetV1 初始时调用 loadAndPredict 办法事后加载模型,参数预设为: model: { architecture: 'MobileNetV1', outputStride: 16, //8,16 值越小,输入分辨率越大,模型越准确,速度越慢 multiplier: 0.75, // 0.5,0.75,1 值越大,层越大,模型越准确,速度越慢 quantBytes: 2 /* 1,2,4 此参数管制用于权重量化的字节 '4. 每个浮点数 4 个字节(无量化)。最高精度&原始模型尺寸', '2. 每个浮点数 2 个字节。精度略低,模型尺寸减小 2 倍', '1. 每个浮点数 1 个字节。精度升高, 模型尺寸缩小 4 倍' */ }, async loadAndPredict(model) { // 加载模型 this.net = await bodyPix.load(model); }三. 背景虚化官网中的示例: ...

June 4, 2021 · 2 min · jiezi

关于vue.js:记录Vue高德地图使用总结

全地区展现/点聚合独自区域展现行政区划分自定义图层样图展现一、全地区展现/点聚合 /* 加载地图 */async getMaps() { this.loading = true; await MapLoader().then( (AMap) => { const map = new AMap.Map("map_three", { showLabel: true, mapStyle: "amap://styles/ccab8afcf9c843aefac72ff71d705eb4", center: [114.085947, 22.547], viewMode: "3D", labelzIndex: 130, pitch: 30, zoom: 11.5, zooms: [11, 18], features: ["road", "point", "bg"], }); const district = new AMap.DistrictSearch({ subdistrict: 0, extensions: "all", level: "district", }); district.search("宝安区", (status, result) => { const [bounds,mask] = [result.districtList[0].boundaries,[]] if (bounds) { for (let i = 0, l = bounds.length; i < l; i++) { //生成行政区划polygon let polygon = new AMap.Polygon({ map: map, strokeWeight: 1, path: bounds[i], fillOpacity: 0.25, fillColor: "#09b8bf", strokeColor: "#09b8bf", }); mask.push(polygon); } } map.add(mask); map.setFitView(mask); //视口自适应 //插件:行政区图层、点聚合 AMap.plugin(["AMap.DistrictLayer","AMap.MarkerClusterer"], function () { const disProvince = new AMap.DistrictLayer.Province({ zIndex: 12, depth: 2, styles: { fill: function (properties) { let adcode = properties.adcode; return getColorByAdcode(adcode); }, "province-stroke": "#09b8bf", "city-stroke": "#09b8bf", "county-stroke": "#09b8bf", //线条色彩 }, }); disProvince.setMap(map); }); //随机色彩 const getColorByAdcode = (adcode) => { const colors = {}; if (!colors[adcode]) colors[adcode] = "rgba(7,111,142,0.7)"; return colors[adcode]; }; map.on("click", () => { this.maps.infowindow.close(); }); this.maps.map = map; this.maps.AMap = AMap; this.drawStaion(AMap, map); }); }, (e) => { console.error("地图加载失败", e); } );},/* 生成地图点位 */async drawStaion(AMap, map, pointList=this.maps.pointList) { const [data,markers] = [pointList,[]]; let infowindow = null; for (let i in data) { const curPoint = data[i]; //点位状态色彩 const status = this.getStatus(curPoint.status); //点位模板 const contents = this.setMapInfo(status, curPoint, curPoint.status); //弹窗模板 const windowPopup = this.openPopup(curPoint, this); //点位实例 const marker = new AMap.Marker({ content: contents, position: [curPoint.longitude, curPoint.latitude], }); //弹窗实例 infowindow = new AMap.InfoWindow({ isCustom: true, anchor: "bottom-center", offset: new AMap.Pixel(5, -12), }); marker.on("click", (e) => { //避免每项变成遍历的最初一个 infowindow.setContent(windowPopup.$el); infowindow.open(map, marker.getPosition()); }); markers.push(marker); this.maps.infowindow = infowindow; this.markers = markers; } /* 点聚合局部 */ new AMap.MarkerClusterer(map, markers, { gridSize: 80, renderClusterMarker: _renderClusterMarker, }); const count = markers.length; var _renderClusterMarker = function (context) { var factor = Math.pow(context.count / count, 1 / 18); var div = document.createElement("div"); var Hue = 180 - factor * 180; var bgColor = "hsla(" + Hue + ",100%,50%,0.7)"; var fontColor = "hsla(" + Hue + ",100%,20%,1)"; var borderColor = "hsla(" + Hue + ",100%,40%,1)"; var shadowColor = "hsla(" + Hue + ",100%,50%,1)"; div.style.backgroundColor = bgColor; var size = Math.round(30 + Math.pow(context.count / count, 1 / 5) * 20); div.style.width = div.style.height = size + "px"; div.style.border = "solid 1px " + borderColor; div.style.borderRadius = size / 2 + "px"; div.style.boxShadow = "0 0 1px " + shadowColor; div.innerHTML = context.count; div.style.lineHeight = size + "px"; div.style.color = fontColor; div.style.fontSize = "14px"; div.style.textAlign = "center"; context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2)); context.marker.setContent(div); }; map.add(markers); this.loading = false;},二、独自地区展现,区域外不显示 ...

June 4, 2021 · 4 min · jiezi

关于vue.js:JS函数应用与TDD游戏测试驱动开发

1.实现函数checkNumber: 该函数的目标是查看形式参数的字符串是否能够被转化为一个数字,所以返回值也非常简单,能则返回true,不是则返回false,代码如下: function checkNumber(value) { var m = 0; // 统计负号的个数var n = 0; // 统计小数点的个数for(var i=0; i<value.length; i++){ var c = value.charCodeAt(i); // 获取每个字符的ASCII码 // 通过ASCII码查看,如果字符不为0~9的数字或者负号或者小数点,则有效 if ((c >= 0 && c < 45) || c > 57 || c == 47) return false; if(c == 45) m++; if(c == 46) n++;}if(m > 1) return false;if(n > 1) return false;// 如果存在一个负号,而负号不在第一个地位,则有效if(m == 1 && value.charCodeAt(0) != 45) return false;// 如果存在一个小数点,而小数点在最初一个地位,则有效if(n == 1 && value.charCodeAt(value.length-1) == 46) return false;return true;} ...

June 4, 2021 · 1 min · jiezi

关于vue.js:vue过滤器可以解决哪些问题

对于vue的过滤器,其实在vue1.0的时候是内置了过滤器的,然而自从到了2.0之后就被去掉了,然而咱们可能还会应用到,所以就须要本人定义过滤器了,上面小千就带你理解一下如何定义过滤器和过滤器都有哪些品种。 vue 过滤器分类 过滤器分为两种,一种是部分过滤器,一种全局过滤器。所有的过滤器都是函数,并且参数为要过滤的数据。 部分过滤器:只容许在以后组件中应用 全局过滤器:所有组件都能够应用 1.部分过滤器vue部分过滤器 以上代码 filters 这个对象定义的就是www.cungun.com部分过滤器,上面代码展现在组建中如何应用过滤器:应用过滤器 当然你也应该在想,这样的过滤器应用起来可能会比拟轻便,不够灵便,过滤器既然是游戏函数,那是否能够传参呢?接下来咱们通过参数让过滤器的应用变得更加灵便。传参过滤器 2.全局过滤器全局过滤器 总结 全局的过滤器要比部分过滤器应用的更宽泛一些,说白了咱们为什么要应用过滤器,其实就跟应用函数是一样,咱们想把一些办法封装,供其它组件应用,这样调用起来不便,开发更快捷。 留神: 如果全局过滤器和部分过滤器名字反复,咱们会依照远近应用,优先级 : 部分>全局 过滤器并不是只能够应用一个,一个数据能够用多个过滤器,从左向右执行,留神的下一个过滤器接管的是上一个过滤器的处理结果,因而千万要留神应用程序

June 4, 2021 · 1 min · jiezi

关于vue.js:lua脚本在游戏中的应用

一,为什么要在游戏中应用脚本语言? 要解释这个问题首先咱们先来理解一下脚本语言的个性: 1,学习门槛低,疾速上手。 2,开发成本低,可维护性强。 3,动静语言,灵活性高。 绝对于C/C++这类高复杂性、高风险的编译型语言来说,Lua脚本做为一种轻量级的动静语言,简略的语言个性,精简的外围和根底库,使得语言的学习门槛大大的升高,即便是没有任何游戏教训的人都能疾速上手,开发游戏性能。实际上游戏设计是一种非常繁冗的工作,C/C++尽管给咱们带来极大的高效性,但同时也不能漠视其复杂性,极易产生BUG,而且对于开发人员的要求十分高。从语言的的形象层面来说C/C++的形象低更加适宜于底层逻辑的反对,而Lua脚本抽象层次高,更加适宜游戏逻辑的实现。脚本语言运行在虚拟机之上,而虚拟机运行在游戏逻辑之上,作为一种解释型语言,咱们能够随时批改并及时体现在游戏之中,疾速实现开发。C/C++却做不到,对一个微小的游戏工程,每次批改都须要从新编译,老本很高。构想一下,如果所有的性能都是应用C/C++实现的话,那么对开发人员来说几乎是一场劫难。 二,如何在游戏中应用Lua脚本? 这里就不实践一大堆了,间接手把手教。 1,进入Lua官方网站下载Source源代码 2,在Visual Studio在新建一个解决方案名为Lua2Game 3,在Lua2Game解决方案下新建一个空我的项目,命名为LuaDll,将从Lua官网下载的源代码src中除luac.c文件之外的源代码拷贝到LuaDll工程,配置我的项目属性,惯例->配置类型为动态库(lib)而后编译LuaDll我的项目。(luac.c是编译器,lua.c是解释器也就是lua虚拟机) 4,在Lua2Game解决方案下新建一个空我的项目,命名为Game,配置我的项目属性,惯例->配置类型为应用程序(.exe), 这就是游戏demo。在我的项目属性中,链接器-> 输出->附加依赖项中退出../Debug/LuaDll.lib 5,在我的项目Game中实现脚本引擎CLuaScript(实现C/C++与Lua脚本的相互拜访) LuaScript.h #ifndef LUA_SCRIPT_H #define LUA_SCRIPT_H #include "GameDef.h" class CLuaScript { public: CLuaScript(); ~CLuaScript(); public: //实现C/C++对Lua脚本的调用 bool LoadScript(const char* szFileName); //实现lua脚本加载和编译 //调用Lua函数 bool CallFunction(char cFuncName, int nResults, char cFormat, va_list vlist); ...

June 4, 2021 · 3 min · jiezi

关于vue.js:提交规范

提交标准笔记利用 inquirer 抉择配置好的提交类型,以及配合 commitlint 实现 commit 查看npm i inquirer shelljs @commitlint/{cli,config-conventional} -D增加 package.json 的 script "commitlint": "commitlint -e","commit": "node commit/git-commit.js" 创立 commit/git-commit.js 文件 const shell = require('shelljs')const inquirer = require('inquirer')const prompsConfig = { ciType: [ { type: 'list', name: 'type', message: '请抉择本次提交的类型:', choices: [ { name: '引入新个性', value: 'feat', }, { name: '改良代码的构造格局/款式', value: 'style', }, { name: '修复 bug', value: 'fix', }, { name: '晋升性能', value: 'perf', }, { name: '删除代码或文件', value: 'delete', }, { name: '其余批改, 比方扭转构建流程、或者减少依赖库、工具等', value: 'chore', }, { name: '重构', value: 'refactor', }, { name: '撰写文档', value: 'docs', }, { name: '减少测试', value: 'test', }, { name: '更新打包文件', value: 'build', }, { name: '首次提交', value: 'init', }, { name: '公布/版本标签', value: 'release', }, { name: '部署性能', value: 'deploy', }, { name: '代码回滚', value: 'revert', }, { name: 'CI继续集成批改', value: 'ci', }, ], }, ], ciMsg: { type: 'input', name: 'msg', message: '请输出提交文本:', validate: function (value) { if (value) { return true } return '文本必须输出!' }, },}async function gitCommit() { let { type } = await inquirer.prompt(prompsConfig.ciType) let { msg } = await inquirer.prompt(prompsConfig.ciMsg) shell.exec(`git commit -m "${type}: ${msg}"`, function () { console.log(`\n提交脚本: git commit -m "${type}: ${msg}"`) })}gitCommit()配置 commitlint 类型,创立 commitlint.config.js 文件 ...

June 3, 2021 · 2 min · jiezi

关于vue.js:有序数字的两数之和

给定一个已依照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于指标数 target 。 函数应该以长度为 2 的整数数组的模式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组该当满足 1 <= answer[0] < answer[1] <= numbers.length 。 你能够假如每个输出只对应惟一的答案,而且你不能够重复使用雷同的元素。 函数应该以长度为 2 的整数数组的模式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组该当满足 1 <= answer[0] < answer[1] <= numbers.length 。 你能够假如每个输出只对应惟一的答案,而且你不能够重复使用雷同的元素。 解法一:抉择排序思维其实这种想法不仅能够用于有序的排列,也能够用于无序的游戏汇合。 执行用时:312 ms, 在所有 JavaScript 提交中击败了11.29%的用户 内存耗费:38 MB, 在所有 JavaScript 提交中击败了92.21%的用户 很显著的得出应用抉择排序这种形式工夫复杂度并不高。 var twoSum = function (numbers, target) { let targetarray = [] for (let index = 0; index < numbers.length; index++) { let pretarget = numbers[index]//记录以后第一层循环的值 for (let indey = index+1; indey < numbers.length; indey++) { if (pretarget + numbers[indey] == target) { targetarray[0] = index + 1; targetarray[1] = indey + 1; return targetarray; } } } return targetarray }; 复制代码解法二:双指针执行用时:84 ms, 在所有 JavaScript 提交中击败了75.78%的用户 ...

June 3, 2021 · 1 min · jiezi

关于vue.js:My-vuex

state 应用办法Store仓库state应用形式一state应用形式二 state应用形式三一般调用形式,模块化须要增加模块 mutationsmutations 同步批改state数据调用mutations形式一 commit调用mutations形式二 mapMutation actions异步批改state数据,然而state数据只能通过mutations同步批改.须要通过嗲用mutations中的办法来批改调用actions形式一 dispatch调用actions形式二 modules模块应用形式导出模块引入模块注册页面应用state数据形式一 ,state后边增加模块名页面应用state数据形式二

June 3, 2021 · 1 min · jiezi

关于vue.js:vue常见面试题汇总

谈谈你对MVVM开发模式的了解 MVVM分为Model、View、ViewModel三者。 Model:代表数据模型,数据和业务逻辑都在Model层中定义;View:代表UI视图,负责数据的展现;ViewModel:负责监听Model中数据的扭转并且管制视图的更新,解决用户交互操作; Model和View并无间接关联,而是通过ViewModel来进行分割的,Model和ViewModel之间有着双向数据绑定的分割。因而当Model中的数据扭转时会触发View层的刷新,View中因为用户交互操作而扭转的数据也会在Model中同步。这种模式实现了Model和View的数据主动同步,因而开发者只须要专一对数据的保护操作即可,而不须要本人操作dom。 v-if 和 v-show 有什么区别? v-show 仅仅管制元素的显示方式,将 display 属性在 block 和 none 来回切换;而v-if会管制这个 DOM 节点的存在与否。当咱们须要常常切换某个元素的显示/暗藏时,应用v-show会更加节俭性能上的开销;当只须要一次显示或暗藏时,应用v-if更加正当。简述Vue的响应式原理 Vue. js采纳ES5提供的属性个性性能,联合发布者-订阅者模式,通过 Object.defineProperty()为各个属性定义get、set个性办法,在数据产生扭转时给订阅者公布音讯,触发相应的监听回调。具体步骤如下。 (1)对须要察看的数据对象进行递归遍历,包含子属性对象的属性,设置set和get个性办法。当给这个对象的某个值赋值时,会触发绑定的set个性办法,于是就能监听到数据变动。 (2)用 compile解析模板指令,将模板中的变量替换成数据。而后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,增加监听数据的订阅者。一旦数据有变动,就会收到告诉,并更新视图 (3) Watcher订阅者是 Observer和 Compile之间通信的桥梁,次要性能如下。 在本身实例化时向属性订阅器(dep)外面增加本人。本身必须有一个 update( )办法。在 dep.notice()公布告诉时,能调用本身的 updat()办法,并触发 Compile中绑定的回调函数。(4)MVVM是数据绑定的入口,整合了 Observer、 Compile和 Watcher三者,通过Observer来监听本人的 model数据变动,通过 Compile来解析编译模板指令,最终利用Watcher搭起 Observer和 Compile之间的通信桥梁,达到数据变动告诉视图更新的成果。利用视图交互,变动更新数据 model变更的双向绑定成果。   4、请具体阐明你对Vue.js生命周期的了解。 总共分为8个阶段,别离为 beforeCreate、created、beforeMount、 mounted、beforeUpdate、 updated、 beforeDestroyed、 destroyed。 beforeCreate:在实例初始化之后,数据观测者( data observer)和 event/ watcher事件配置之前调用。created:在实例创立实现后立刻调用。在这一步,实例已实现以下的配置:数据观测者,属性和办法的运算, watch/event事件回调。然而,挂载阶段还没开始,$el属性目前不可见。beforeMount:在挂载开始之前调用,相干的 render函数首次调用。mounted:    el被新创建的vm.$el替换,并且在挂载到实例上之后再调用该钩子如果root实例挂载了一个文档内元素,当调用 mounted时vm.sel也在文档内。beforeUpdate:在数据更新时调用,产生在虛拟DOM从新渲染和打补丁之前。updated:因为数据更改导致的虚构DOM从新渲染和打补丁,在这之后会调用该钩。beforeDestroy:在实例销毁之前调用。在这一步,实例依然齐全可用。destroyed:在 Vue. js实例销毀后调用。调用后,Vue. js实例批示的所有货色都会解除绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。当应用组件的kep- alive性能时,减少以下两个周期。 activated在keep- alive组件激活时调用;deactivated在keep-live组件停用时调用。Vue2.5.0版本新增了一个周期钩子:ErrorCaptured,当捕捉一个来自子孙组件的谬误时调用。5、请具体阐明你对Vue.js生命周期的了解。 总共分为8个阶段,别离为 beforeCreate、created、beforeMount、 mounted、beforeUpdate、 updated、 beforeDestroyed、 destroyed。 ...

June 2, 2021 · 2 min · jiezi

关于vue.js:vue-warn

vue warn Invalid default value for prop xx: Props with type Object/Array解决bug 翻译下就是说:属性xx的默认值有效:类型为Object/Array的属性简而言之:就是props的default格局有问题在vue官网的格调指南上已阐明:对象和数组接管格局均以函数的模式对象: props: { changeData:{ type: Object, // 对象或数组默认值必须从一个工厂函数获取 default: ()=>{ return {} } } },数组: props: { changeData: { type: Array, default: () => [], }, }

June 2, 2021 · 1 min · jiezi

关于vue.js:Vfor就地复用原理虚拟DOMDiff算法

V-for就地复用原理举个: <div v-for="(item,index) in items">  <input />  <button @click="del(index)">delthis</button>  {{item.message}}</div>JS局部 //data外面的itemsitems: [   {  message: "1" },  {  message: "2" },  {  message: "3" }, {  message: "4" },],//methods中的del办法del(index) {  this.items.splice(index, 1); //依据传入的index删掉items中对应数据},成果如下 能够发现: 当删掉items中的第二个对象时,输入框中的值还是2--这意味着没有删除对应的第二个节点。这是因为vue采纳虚构DOM+diff算法导致的数据凌乱。vue监听到items数组中少了个元素后,会更新虚构DOM,而后应用diff算法比拟新、旧DOM树,在这个过程中,因为要计算出实在DOM树的最小变更规模,因而会尽可能复用已有的节点(如果节点类型雷同) 此处,咱们的需要当然是不复用节点,那该如何实现呢?:key解决v-for导致的数据凌乱在渲染列表时,为每个元素绑定举世无双的key,这样,vue在更新经v-for渲染过的列表时,因为key值不同,会认为是不同的节点类型,不采取复用。这样就防止了数据凌乱为什么不能应用数组下标作为key: 不能应用各元素的index作为key,因为当新增或删除列表中元素时,各项索引都会变,也就是说索引对应元素变了,失去了标识的唯一性 申明式渲染Vue 提供一套基于 HTML 的模板语法,容许开发者申明式地将实在 DOM 与 Vue 实例的数据绑定在一起。 "申明式" 的意思就是: 只须要指出指标, 而不必关怀如何实现,将实现交由vue解决虚构DOMVdom(virtual dom),能够看作是一个应用javascript模仿了DOM构造的树形构造 其中Vnode节点对应实在DOM节点Vdom树用于缓存实在DOM树的所有信息 为什么要采纳虚构DOM?所有为了性能。 “间接操作 DOM 性能差”,这是因为 —— DOM 引擎、JS 引擎互相独立,但又工作在同一线程(主线程),因而JS 代码调用DOM API时必须挂起 JS 引擎、激活 DOM 引擎,实现后再转换到 JS 引擎引擎间切换的代价会迅速积攒强制重排的DOM API调用,哪怕只改变一个节点,也会引起整个DOM树重排,从新计算布局、从新绘制图像会引起更大的性能耗费所以,升高引擎切换频率(缩小DOM操作次数)、减小 DOM 变更规模才是DOM 性能优化的两个关键点。 虚构 DOM +diff算法是一种可选的解决方案 基本思路:“在 JS 中缓存必要数据,计算界面更新时的数据差别,只提交最终差集”。 虚构dom只用于缓存,而diff算法负责-- 计算出‘虚构dom和目前实在DOM之间的数据差别’提交最终差集留神:“单纯VDOM是进步不了性能的,VDOM次要作用在于它的二次形象提供了一个diff/patch和batch commit(批量提交)的机会”watcher的节流成果:借助watcher响应式原理,使数据异步更新(滞后更新),可能实现节流成果,在一段时间内,容许屡次更新虚构DOM,而后一次性patch到实在DOM树。像是应用精灵图以缩小申请次数那样,达到优化性能的目标。 vue在监听到数据变动后,会将依赖该数据的watcher退出微工作队列,因为微工作是异步的,因而所有同步更新数据的操作,都会及时地在微工作队列中的工作更新前触发watcher响应,换个说法:执行第一次变动后的每次变动都会更新watcher中的各项依赖。这样的话,在该微工作执行结束之前的这段时间,就相当于节流中的时延了 Vdom的Diff算法diff算法的两个外围:两个雷同的组件产生相似的DOM构造,不同的组件产生不同的DOM构造。同一层级的一组节点,他们能够通过惟一的key进行辨别。diff算法的复杂度比拟两棵虚构DOM树的差别是Virtual DOM算法最外围的局部,这也是所谓的 VirtualDOM的diff 算法。两个树的齐全的diff 算法是一个工夫复杂度为O(n^3)的问题。然而在前端当中,你很少会逾越层级地挪动DOM元素。所diff算法只会对同一个层级的元素进行比照。上面的div只会和同一层级的div比照,第二层级的只会跟第二层级比照。这样算法复杂度就能够达到O(n)。 比拟时是否复用的逻辑当页面的数据发生变化时,Diff算法只会比拟同一层级的节点:如果节点类型不同,间接干掉旧的节点,创立并插入新的那个节点,不会再比拟这个节点当前的子节点了。如果节点类型雷同,则会间接复用该节点,从新设置该节点的属性,从而实现节点的更新。 当某一层有很多雷同的节点时,也就是列表节点时,Diff算法的更新过程默认状况下也是遵循以上准则。比方--咱们心愿能够在B和C之间加一个F Diff算法默认执行起来是这样的: 老的Vdom树的该层上有6个节点,新的Vdom树上有7个类型雷同的节点,那么就顺次复用实在DOM树该层上的对应的前6个节点,在最初再新建一个节点,赋予之前节点E的属性。即把C更新成F,D更新成C,E更新成D,最初再插入E,是不是很没有效率?所以咱们须要应用key来给每个节点做一个惟一标识,这样vue会把他们当做是不同的节点,因而不会复用,diff算法会间接创立新的节点,并插入正确的地位 key的作用key的作用次要是为了高效的更新虚构DOM。也可防止间接复用v-for进去的节点,防止数据凌乱另外vue中在应用雷同标签名元素的过渡切换时,也会应用到key属性,其目标也是为了让vue能够辨别它们,否则vue只会替换其外部属性而不会触发过渡成果。patch到实在DOM模仿实现如何将vnode(右边)变成实在的DOM元素(左边) 实现如下: let nodes = {  tag: "ul",  attrs: {    id: "list",  },  children: [    {      tag: "li",      attrs: {        class: "item",      },      children: ["Item 1"],    },  ],};//实现办法:递归遍历function createElement(vnode) {  var tag = vnode.tag;  var attrs = vnode.attrs || {};  var children = vnode.children || [];  if (!tag) {    return null;  }  var elem = document.createElement(tag);  var attrName;  for (attrName in attrs) {    if (attrs.hasOwnProperty(attrName)) {      elem.setAttribute(attrName, attrs[attrName]);    }  }  for (let i = 0; i < children.length; i++) {    let childVnode = children[i];    if (typeof childVnode === "object" ||      childVnode.constructor === Object    ) {      elem.appendChild(createElement(childVnode));    } else {      let text = document.createTextNode(childVnode);      elem.appendChild(text);      break;    }  }  return elem;}let elem = createElement(nodes);console.log(elem);PS:vue 在patch时,在一个update 办法外面调用createElment()办法,通过虚构节点创立实在的 DOM 并插入到它的父节点中; ...

June 2, 2021 · 1 min · jiezi

关于vue.js:vue-lass-与-Style-绑定

Class 与 Style 绑定法一: <h1 :class="{color: isColor, size: true}">{{title}}</h1>法二: h1 :class="font">{{title}}</h1>法三: <h1 :class="[{color: isColor}, 'style']">{{title}}</h1>法四: <h1 :class="'style'" class="color">{{title}}</h1><h2 :style="style">{{title}}</h2>data: { title: 'hello', isColor: true, font: { color: true, size: false }, style: { fontSize: '100px', color: 'greenyellow' } },v-if补充v-if与v-else两头不能有其余标签。v-if与v-else-if与v-else等同。 <div id="root"> <h1 v-if="num < 0"> {{title}} </h1> <!-- 不能有第三者 --> <!-- <div>我是第三者</div> --> <h2 v-else-if=" num === 9"> {{title + ' !!!'}} </h2> <h3 v-else> {{title + ' !!!!!!'}} </h3></div>vue内置组件:template<!-- template: Vue内置组件 --> <template v-if="show"> <div>{{title}}</div> <p>{{title}}</p> </template>v-if与v-for同时润饰一个元素,优先级问题在vue2中v-for优先级高;在vue3中v-if优先级高.v-show与v-for区别v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。 ...

June 1, 2021 · 1 min · jiezi

关于vue.js:vueclivue脚手架项目搭建

装置vue-cli一、须要全局装置webpack npm install -g webpack //装置胜利后输出`webpack -v`呈现版本号npm install webpack webpack-cli -g //装置 webpack-cli 依赖运行我的项目时报错: 'webpack' 不是外部或外部命令,也不是可运行的程序。报这个错是因为没有全局装置webpack,解决办法:1.确保nodeJS已装置。2.找到nodejs目录,我的目录是图片上这个,你的可能不一样,看下有没有以下两个文件,没有就新建。3.批改全局门路,须要把默认的安装包门路改成nodejs外面这两个新建的文件 配置全局门路:npm config set prefix “D:\soft\nodejs\node_global” 配置缓存门路:npm config set cache “D:\soft\nodejs\node_cache” 留神: 这里的门路是你刚刚新建的文件的门路,你能够在文件处右击-->复制以后门路 4.批改零碎的环境变量 桌面--> 我的电脑 --> 右击 属性 --> 高级零碎设置 --> 环境变量(或者间接关上控制面板) 留神: 装置之后如果没敞开运行窗口,间接webpack-v,还是会报'webpack'不是外部或外部命令......,肯定要把运行窗口敞开后,从新关上运行,我的项目中也是,先把运行窗口敞开在应用webpack的命令.我装置的时候没敞开窗口,后果始终报错,我删了装置了好几遍,坑。 5.webpack -v 查看时,会提醒必须要装置webpack-cli,依据提醒执行y即可持续装置,也能够执行命令npm install webpack-cli -g,来装置。我是用持续y来装置的,如图:装置的时候可能有一些warn正告,不影响,只有装置好包就能够。二、全局装置vue-cli npm install --global vue-cli //装置实现之后输出 `vue -V`呈现相应的版本 三、应用vue-cli来创立一个基于 webpack 模板的新我的项目1.创立:cmd利用cd /d E:\2021-5-4指令进入到保留我的项目的文件夹下,而后输出命令:vue init webpack 输出命令后,选项阐明: 1. ? Project name todo_list: 项目名称,间接回车,依照括号中默认名字(留神这里的名字不能有大写字母,如果有会报错Sorry, name can no longer contain capital letters)2. ? Project description A Vue.js project: 我的项目形容,也可间接点击回车,应用默认名字3. ? Author galen galen@git.xgqq.com: 作者,输出你的小名4. ? Vue build standalone:5. ? Install vue-router? Yes: 是否装置vue-router,这是官网的路由,大多数状况下都应用,这里就输出“y”后回车即可。6. ? Use ESLint to lint your code? Yes: 是否应用ESLint治理代码,ESLint是个代码格调管理工具,是用来对立代码格调的,个别我的项目中都会应用。7. ? Pick an ESLint preset Standard: 接下来也是选择题Pick an ESLint preset (Use arrow keys) 抉择一个ESLint预设,编写vue我的项目时的代码格调,间接y回车8. ? Set up unit tests Yes: 是否装置单元测试,我抉择装置y回车9. ? Pick a test runner jest10. ? Setup e2e tests with Nightwatch? Yes: 是否装置e2e测试 ,我抉择装置y回车11. ? Should we run npm install for you after the project has been created? (recommended) npm: ...

June 1, 2021 · 1 min · jiezi

关于vue.js:vue项目打包部署前需要配置什么

1.config文件夹下的index.js 中的文件中的 assetsPublicPath :‘/’ 改为’./’ 不然的话会是空白页,在是build外面,如下图: 2.build/util.js文件下在 ‘vue-style-loader’ 之后加一行:publicPath: ‘…/…/’ 不然的话会有图片显示不进去,字体不能失常应用,批改如下图:

June 1, 2021 · 1 min · jiezi

关于vue.js:vue新打开页面并传递参数

vue新关上页面并传递参数 window.open( `/#/logExploration/logContext?timestamp=${encodeURI( row["@timestamp"] )}&warehouses=${encodeURI(row._index)}` );另一个页面 const temp2 = location.href.split("?")[1]; const params = new URLSearchParams(`?${temp2}`); this.formData.warehouses = decodeURI(params.get("warehouses")); this.formData.timestamp = decodeURI(params.get("timestamp"));

June 1, 2021 · 1 min · jiezi

关于vue.js:vue

一、browser-sync装置npm i browser-sync -g 启动法一:browser-sync start -s -f **/* 法二:package.json配置 "scripts": { "start": "browser-sync start -s -f **/* --directory --watch" }yarn start html组成部分:标签、属性、子元素html属性:自定义属性、固有属性 二、vuevue实例化<div id="root"> <div> <input type="text" v-model="task" v-on:keyup.enter="handleKeyUp" > </div> <ul> <li v-for="(task, index) of tasks"> {{task}} <button v-on:click="handleClick(index)">X</button> </li> </ul> </div><!-- 插值表达式 --><!-- {{ title }} -->// 实例化Vue new Vue({ el: "#root", // root节点 data: { // 数据源 title: 'hello world!!', task: '', tasks: [ '吃饭', '睡觉', '打豆豆' ] }, methods: { // 办法 handleKeyUp() { // 操作task this.tasks.push(this.task) this.task = '' }, handleClick(index) { this.tasks.splice(index, 1) } }, })指令指令 (Directives) 是带有 v- 前缀的非凡 attribute。 ...

May 31, 2021 · 3 min · jiezi

关于vue.js:vueesign签字板的使用步骤小demo

问题形容在咱们开发我的项目中,特地是流程审批类的我的项目,最初一步会提交审核,审核员看完相应信息当前,没问题就会签字通过审批。所以就要用到本篇文章中的vue-esign签字技术。vue-esign技术是基于html5代新个性,canvas技术进行的组件化封装,在那个页面须要用到签字技术,只须要引入vue-esign组件即可。这个组件其实也是能够了解为是一个插件。本篇文章记录一下这个插件的用法,忘了的时候回来看看。咱们先看一下最终的demo效果图 vue-esign效果图 左边控制台输出的就是生成的签名画布图片转成base64格局的图片信息 应用步骤第一步,下载并注册vue-esign插件下载:cnpm i vue-esign --savemain.js中引入并注册这个插件: import vueEsign from 'vue-esign'Vue.use(vueEsign);第二步,应用vue-esign插件<template> <div id="app"> <!-- 做应用el-dialog做签字的弹框 --> <el-dialog title="签字" :visible.sync="dialogVisible" width="800px" append-to-body> <!-- 应用这个签名组件 --> <vue-esign ref="esign" class="mySign" :width="800" :height="300" :isCrop="isCrop" :lineWidth="lineWidth" :lineColor="lineColor" :bgColor.sync="bgColor" /> <span slot="footer" class="dialog-footer"> <el-button @click="handleGenerate" type="primary">生成签字图片</el-button> <el-button @click="handleReset">清空画板</el-button> <el-button @click="dialogVisible = false">勾销</el-button> </span> </el-dialog> <!-- 审查人点击确认签字按钮触发签字 --> <div class="checkMan"> <h2>审查人</h2> <el-button plain @click="dialogVisible = true" type="primary">点击签字</el-button> <!-- 用户用来预览签字图片的中央 --> <img :src="resultImg" alt="" /> </div> </div></template><script>export default { name: "App", data() { return { dialogVisible: false, // 弹框是否开启 lineWidth: 6, // 画笔的线条粗细 lineColor: "#000000", // 画笔的色彩 bgColor: "", // 画布的背景色彩 resultImg: "", // 最终画布生成的base64图片 isCrop: false, // 是否裁剪,在画布设定尺寸根底上裁掉周围空白局部 }; }, methods: { // 清空画板 handleReset() { this.$refs.esign.reset(); }, // 生成签字图 handleGenerate() { this.$refs.esign .generate() // 应用生成器调用把签字的图片转换成为base64图片格式 .then((res) => { this.resultImg = res; }) .catch((err) => { // 画布没有签字时会执行这里提醒一下 this.$message({ type: "warning", message: "请签名后再生成签字图片", }); }); // 在这里向后端发申请把转换后的base64文件传给后端,后端接管当前再转换成图片做动态图片存储 // 当然也能够把base64转成流文件blob格局的,相似上传给后端这样,具体哪种形式看后端要求 setTimeout(() => { // 这里要应用定时器略微延后当前就能取到base64数据了,当然也能够再加一个确认按钮,如:确认应用这张base64签名图片 // 点击确认当前,在其回调函数中,再把base64的签名图片传给后端用于存储 console.log('我是签字后的base64图片',this.resultImg); }, 200); this.dialogVisible = false; }, },};</script><style lang="less" scoped>#app { width: 100%; height: 100%; padding: 60px; .checkMan { width: 400px; height: 360px; text-align: center; border: 1px solid #e9e9e9; padding-top: 40px; h2 { margin-bottom: 20px; } .el-button { margin-bottom: 20px; } img { width: 100%; height: 200px; } }}/deep/ .el-dialog__body { // 设置一下签字区域的虚线边框 .mySign { border: 1px dashed #000; }}</style>其实用法也很简略,细节的正文写在代码外面了。记录一下 ...

May 31, 2021 · 1 min · jiezi

关于vue.js:vue路由响应式和虚拟dom

1、动静路由 import Vue from 'vue'import VueRouter from 'vue-router'import Index from '../views/Index.vue'Vue.use(VueRouter)const routes = [ { path: '/', name: 'Index', component: Index }, { path: '/detail/:id', name: 'Detail', // 开启 props,会把 URL 中的参数传递给组件 // 在组件中通过 props 来接管 URL 参数 props: true, // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "detail" */ '../views/Detail.vue') }]const router = new VueRouter({ routes})export default router<template> <div> <!-- 形式1: 通过以后路由规定,获取数据 --> 通过以后路由规定获取:{{ $route.params.id }} <!-- 形式2:路由规定中开启 props 传参 --> 通过开启 props 获取:{{ id }} </div></template>2、嵌套路由 ...

May 31, 2021 · 6 min · jiezi

关于vue.js:Vite-使用TSXJSX

装置yarn add @vitejs/plugin-vue-jsxor npm install @vitejs/plugin-vue-jsx -D配置在 vite.config.ts 文件中挂载 import vueJsx from '@vitejs/plugin-vue-jsx'export default defineConfig({ plugins: [ vueJsx()]})tsconfig.json 文件中 { // include 须要蕴含tsx"include": ["src/*", "src/**/*.vue", "src/**/*.tsx", "src/**/*.jsx", "src/**/*.ts", "src/**/*.js"], "compilerOptions": { // 在.tsx文件里反对JSX "jsx": "preserve", }}应用新建**.tsx// index.tsxexport default definedComponents({ setup(props){ return ()=>( <div> Hello,World </div> ) }})新建**.vue不须要template。script上加lang='tsx' // index.vue<script lang='tsx'>import {definedComponents} from 'vue'export default definedComponents({ setup(props){ return ()=>( <div> Hello,World </div> ) }})</script>文档jsx语法Seehttps://github.com/vuejs/jsx-... 探坑jsx/tsx中循环进去的标签元素上有点击事件的话 会主动调用事件// 例如export default definedComponents({ import {definedComponents} from 'vue' setup(props){ // 会被调用3次 const click = (val)=>{ consloe.log(val) // 112 // 112 // 112 } return ()=>( <> {[1,2,3].map((item,index)=>{ return ( // 而且 这样写拿不到原生事件 event <div onClick={click('112')}><> ) })} </> ) }})正确应该是 onClick={(e)=>{click(e,'112')}} 这样也能够拿到原生事件 ...

May 30, 2021 · 1 min · jiezi

关于vue.js:vue项目优化上线

1 我的项目优化策略1.1 生成打包报告打包时,为了直观地发现我的项目中存在的问题,能够在打包时生成报告。生成报告的形式有两种: 通过命令行参数的模式生成报告通过 vue-cli 的命令选项能够生成打包报告--report 选项能够生成 report.html 以帮忙剖析包内容 vue-cli-service build --report通过可视化的UI面板间接查看报告(举荐)在可视化的UI面板中,通过控制台和剖析面板,能够不便地看到我的项目中所存在的问题。1.2 通过 vue.config.js 批改 webpack 的默认配置通过 vue-cli 3.0 工具生成的我的项目,默认暗藏了所有 webpack 的配置项 如果有批改 webpack 默认配置的需要,能够在我的项目根目录中,按需创立 vue.config.js 这个配置文件,从而对我的项目的打包公布过程做自定义的配置(具体配置参考:地址)。 1.3 为开发模式与公布模式指定不同的打包入口默认状况下,Vue我的项目的开发模式与公布模式,共用同一个打包的入口文件(即 src/main.js)。为了将我的项目的开发过程与公布过程拆散,咱们能够为两种模式,各自指定打包的入口文件,即: 开发模式的入口文件为 src/main-dev.js公布模式的入口文件为 src/main-prod.js1.4 configureWebpack 和 chainWebpack在 vue.config.js 导出的配置对象中,新增 configureWebpack 或 chainWebpack 节点,来自定义 webpack 的打包配置。 在这里, configureWebpack 和 chainWebpack 的作用雷同,惟一的区别就是它们批改 webpack 配置的形式不同: chainWebpack 通过链式编程的模式,来批改默认的 webpack 配置configureWebpack 通过操作对象的模式,来批改默认的 webpack 配置两者具体的应用差别,可参考如下网址:地址 1.5 通过 chainWebpack 自定义打包入口module.exports = { chainWebpack: config => { config.when(process.env.NODE_ENV === 'production', config => { // entry默认打包入口 config.entry('app').clear().add('./src/main-prod.js') }) config.when(process.env.NODE_ENV === 'development', config => { config.entry('app').clear().add('./src/main-dev.js') })}}1.6 通过 externals 加载内部 CDN 资源默认状况下,通过 import 语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包胜利后,单文件体积过大的问题。 ...

May 29, 2021 · 3 min · jiezi

关于vue.js:vuealiplayerv2-自定义播放器内置提示文字

需要形容实现播放谬误时,自定义提示信息,如下图所示:如上图所示,我须要改成自定义的内容:'这是测试文字...'。那么代码如下: <vue-aliplayer-v2 @ready="handleReady" ref="VueAliplayerV2" :options="videoOptions" /> data(){ return{ videoOptions: { source: "", // 播放地址 isLive:true, // 是否开启直播 language:'zh-custom', // 自定义语言包 languageTexts:{ // 播放器自定义提醒文字 'zh-custom':{ 'Video_Error':TipMessage, // 视频播放异样 'Error_Load_M3U8_Timeout_Text' :TipMessage, // 获取m3u8文件超时 'Error_Load_M3U8_Failed_Text':TipMessage, // 获取m3u8文件失败 'Live_Abrot':TipMessage, // 直播信号中断 'Error_Not_Found':TipMessage, // 播放地址不存在 'Refresh_Text':'刷新', 'Retry':'重试', 'Detection_Text':'诊断', } } }, } }因为下面自定义了语言包:language:'zh-custom', 故属性languageTexts中所有属性必须从新本人定义(即 'zh-custom' 对象中所有属性均须要本人一一对应)。 文档地址:https://help.aliyun.com/docum... 如下图: 一旦本人从新定义当前那么以下属性(局部截图)均需本人一一批改为自定义内容: 批改的代码如下: videoOptions: { source: "", // 播放地址 isLive:true, // 开启直播 language:'zh-custom', // 自定义语言包 languageTexts:{ // 播放器自定义提醒文字 'zh-custom':{ 'Video_Error':'这是测试文字...', // 视频播放异样 'Error_Load_M3U8_Timeout_Text' :'这是测试文字...', // 获取m3u8文件超时 'Error_Load_M3U8_Failed_Text':'这是测试文字...', // 获取m3u8文件失败 'Live_Abrot':'这是测试文字...', // 直播信号中断 'Error_Not_Found':'这是测试文字...', // 播放地址不存在 'Refresh_Text':'刷新A', 'Retry':'重试B', 'Detection_Text':'诊断CA', } } },成果如下: ...

May 28, 2021 · 1 min · jiezi

关于vue.js:博客指路

【译】打地鼠:纯CSS版本 实现一个具备拖拽性能的跑马灯 数值滚动成果实现计划,反对可视范畴判断

May 28, 2021 · 1 min · jiezi

关于vue.js:npm-install-报错-errno-10054-gitCmd-下设置-httppostBuffer

起因:下载安装的依赖包太大,导致git申请超时了,能够通过批改git http.postBuffer的大小来管制超时工夫。 npm ERR! Error while executing:npm ERR! C:\Program Files\Git\mingw64\bin\git.EXE ls-remote -h -t https://github.com/nhn/raphael.gitnpm ERR!npm ERR! fatal: unable to access 'https://github.com/nhn/raphael.git/': OpenSSL SSL_read: Connection was reset, errno 10054npm ERR!npm ERR! exited with error code: 128npm ERR! A complete log of this run can be found in:npm ERR! D:\jskExtensions\nodejs\node_cache\_logs\2021-05-28T07_14_41_807Z-debug.loggitCmd 执行配置批改:【C:\Program Files\Git\mingw64\bin\git.EXE】 D:\2021\oa-admin\vue-element-admin>"C:\Program Files\Git\mingw64\bin\git.exe" config http.postBuffer 52428800000查看配置是否失效: git config http.postBuffer52428800000

May 28, 2021 · 1 min · jiezi

关于vue.js:npm-install-报错-ignorescripts

如果npm install报错,独自装置这个包,加上参数:--ignore-scripts npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! deasync@0.1.21 install: `node ./build.js`npm ERR! Exit status 1npm ERR!npm ERR! Failed at the deasync@0.1.21 install script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! D:\jskExtensions\nodejs\node_cache\_logs\2021-05-28T07_12_18_267Z-debug.log间接装置 npm install deasync@0.1.21 --ignore-scripts

May 28, 2021 · 1 min · jiezi

关于vue.js:基于vuelic工具搭建vuewebpack项目打包之后页面为空

呈现页面html里没有内控,空白页,是因为打包之后的门路产生了变动,须要配置一下. utils.js: webpack.prod.conf: index.js:

May 28, 2021 · 1 min · jiezi

关于vue.js:vue-wangeditor富文本编辑器

wangeditor 是一款轻量级的富文本编辑器,在我的集体博客我的项目中用到了它,这里做一个记录。 官网地址:地址 装置:npm install wangeditor --save 在component 目录中创立 wangEditor文件夹 在 wangEditor 文件夹中创立 index.js 文件 index.js中的内容 <template> <div ref="editor"></div></template><script>import E from 'wangeditor'export default { props: { value: { type: String, default: '' }, meanArray: { // 自定义菜单 type: Array, default: null } }, model: { prop: 'value', event: 'change' }, watch: { value: function (value) { if (value !== this.editor.txt.html()) { this.editor.txt.html(this.value) } } // value为编辑框输出的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值 }, data () { return { // 默认有这么多菜单,meanArray有值以meanArray为准 defaultMeanus: [ 'head', 'bold', 'fontSize', 'fontName', 'italic', 'underline', 'strikeThrough', 'indent', 'lineHeight', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'video', 'table', 'code', 'splitLine', 'undo', 'redo' ], editor: '' } }, methods: { init () { const _this = this this.editor = new E(this.$refs.editor) this.editor.config.uploadImgShowBase64 = true // 应用 base64 保留图片 this.setMenus() // 设置菜单 this.editor.config.onchange = (html) => { _this.$emit('change', html) // 将内容同步到父组件中 } this.editor.create() // 创立编辑器 }, setMenus () { // 设置菜单 if (this.meanArray) { this.editor.config.menus = this.meanArray } else { this.editor.config.menus = this.defaultMeanus } }, getHtml () { // 失去文本内容 return this.editor.txt.html() }, setHtml (txt) { // 设置富文本外面的值 this.editor.txt.html(txt) } }, mounted () { const that = this that.$nextTick(function () { that.init() }) }}</script>在父组件中调用 ...

May 28, 2021 · 2 min · jiezi

关于vue.js:Vue虚拟DOM之snabbdom

什么是虚构DOM?为什么要应用虚构DOM?虚构DOM(virtual DOM)就是应用JavaScript对象来形容DOM。原生JS或JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。在一次操作中,我须要更新10个DOM节点,浏览器收到第一个更新申请后并不知道还有9次更新操作,因而会马上执行流程,最终执行10次。应用虚构DOM能够先反映在JS对象(虚构DOM)上,操作内存中的JS对象效率更高,等更新实现后,再将最终的JS对象映射成实在的DOM,交由浏览器去绘制。 snabbdom的外围首先init()函数用来加载模块,并且返回patch函数应用h()函数创立虚构DOM形容的实在DOM应用patch函数比拟新旧两个vnode把变动的DOM节点更新到实在DOM树import { init } from 'snabbdom/build/package/init'import { h } from "snabbdom/build/package/h"const patch = init([])// 第一个参数:标签+选择器// 第二个参数:如果是字符串就是标签中的文本内容let vnode = h('div#container.cls', 'hello world xuquantong')let app = document.querySelector('#app')// patch函数第// 第一个参数:旧的vnode,能够是DOM元素,dom元素会转换成vnode// 第二个参数:新的vnode// 返回新的vnode,也就是第二个参数let oldVnode = patch(app, vnode)vnode = h('div#container.xxx', 'hello zhangyanzhen')patch(oldVnode, vnode)

May 27, 2021 · 1 min · jiezi

关于vue.js:vue-bus-传值

vue2.0应用1.创立一个文件名叫eventBus.js该js文件的内容很简略,就是裸露一个vue实例而已。 import Vue from 'vue'export default new Vue有人喜爱在main.js全局引入该js文件,我个别在须要应用到组件中引入。按需引入,哪里须要哪里引入 父组件中注册并应用子组件: <template> <div> <Tow /> <One /> </div></template><script>import One from "../component/one";import Tow from "../component/noe2";export default { data() { return {}; }, components: { One, Tow },};</script>别离在子组件one和two中引入eventBus.js <template> <div> <button @click="sendClick">发送</button> </div></template><script>import bus from "../utils/eventBus";export default { data() { return {}; }, methods: { sendClick: function () { $emit第一个参数,要和$on第一个参数统一 bus.$emit("send", "我来了"); // console.log(1); }, },};</script><template> <div> <button @click="res">接管</button> </div></template><script>import bus from "../utils/eventBus";export default { data() { return {}; }, methods: { res: function () { 接管one组件传过来的值,send标识须要和one组件保持一致 bus.$on("send", (data) => { data:one组件传过来的值 console.log(data); // 我来了 }); }, }, mounted() { this.res(); },};</script>vue3.0应用Vue到3.0之后的Bus的形式变成了应用mitt。2.0是通过创立一个空的Vue来作为总线Vue3.0中应用emit来注册 bus.emit(‘事件’,参数)Vue3.0中应用on来监听,bus.on(‘taskLrowClick’, (e)=>{ console.log(e);其余的逻辑操作 })emit和on是成对呈现的,一个发动,一个接管,并且接管方能够是多个组件,只有第一个参数匹配,都能够接管到应用倡议 ...

May 27, 2021 · 1 min · jiezi

关于vue.js:eslint格式化vue文件配置可格式化html和css部分

.eslintrc.js module.exports = { root: true, env: { node: true }, extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'], parserOptions: { parser: 'babel-eslint' }, plugins: ['prettier'], rules: { ..... }}须要的依赖 "@vue/eslint-config-prettier": "^6.0.0","eslint-config-prettier": "^6.15.0","eslint-plugin-prettier": "^3.1.4","prettier": "^1.19.1","prettier-eslint": "^11.0.0",

May 26, 2021 · 1 min · jiezi

关于vue.js:vue3使用vuemeta

装置 vue-metanpm i -S vue-meta@next目前 vue-meta3 还是处于 alpha 阶段,不要低于 3.0.0-alpha.7我的项目构造.src├── App.vue├── global│ └── vue-meta│ ├── component.tsx│ └── index.ts├── main.ts├── router│ └── index.ts├── store│ └── index.ts├── types│ └── vue-router.d.ts└── views ├── About.vue └── Home.vue开发// global/vue-meta/index.tsimport { createMetaManager } from 'vue-meta'export default createMetaManager(false, {})// main.tsimport { createApp } from 'vue'import App from './App.vue'import router from '@/router'import vueMetaManager from '@/global/vue-meta'const app = createApp(App)app .use(router) .use(vueMetaManager)app.mount('#app')// global/vue-meta/components.tsximport router from '@/router'import { watch } from '@vue/runtime-core'import { Options, setup, Vue } from 'vue-class-component'import { SlotScopeProperties, useMeta } from 'vue-meta'@Options<VueMeta>({ render () { const slots = { title: ({ content }: SlotScopeProperties) => { return content ? `${content} | SITE_NAME` : 'SITE_NAME' }, } // metainfo是全局组件,由vue-meta注入 // 这里不能够应用 h('metainfo'),无奈正确渲染 metainfo 组件。起因未知 return <metainfo v-slots={slots} /> },})export default class VueMeta extends Vue { protected meta = setup(() => { const { meta } = useMeta({ title: '', }) // 监听以后路由对象 批改 meta 信息 watch(router.currentRoute, () => { const route = router.currentRoute.value const metaInfo = route.meta?.metaInfo ?? true // true:应用 route.meta.title // false:由页面组件通过 useMeta 批改 // object:更新 if (metaInfo === true) { meta.title = route.meta?.title || '' } else if (metaInfo && metaInfo !== false) { Object.assign(meta, metaInfo) } }) return meta })}<!-- App.vue --><template> <VueMeta /> <div id="nav"> <router-link to="/"> Home </router-link> | <router-link to="/about"> About </router-link> </div> <router-view /></template><script lang="ts">import { Options, Vue } from 'vue-class-component'import VueMeta from '@/global/vue-meta/component'@Options({ components: { VueMeta, },})export default class Home extends Vue {}</script>尚未实现,先放出代码,后续补上解释 ...

May 26, 2021 · 2 min · jiezi

关于vue.js:奇淫巧技vue缓存接口数据

vue缓存接口场景:雷同接口不再调用1.比方搜名字的性能,一样的参数不会再反复发送接口2.比方二级筛选,二级选项依据一级抉择申请接口,缓存后可缩小申请次数 解决利用vue的cached函数 将参数做为key缓存起来value为对应的函数function cached(fn) { var cache = Object.create(null); return (function cachedFn(str) { var hit = cache[str]; return hit || (cache[str] = fn(str)) })}* 然而该函数反对参数是一个的状况* 如果有多个参数,应该做一些批改function cached(fn) { const cache = Object.create(null); return function cachedFn(params) { let key = typeof(params) === 'string' ? params : JSON.stringify(params); // 如果参数是一个对象的话转成字符串做为存储的key const hit = cache[key]; return hit || (cache[key] = fn.call(fn, params)); };} 调用import axios from 'axios';const init = cached( function(params) { return axios({ method: "post", url: 'xxx', data: params }).then(res=>{ return res })}init();总结雷同参数不会再掉接口不论接口后果返回没只有参数雷同不会再掉接口好使 !!! ...

May 25, 2021 · 1 min · jiezi

关于vue.js:没错我又在vite中尝试了暗黑主题

在上次在nextjs开发的博客中增加了暗黑主题后(一些网友想要的nextjs博客源码曾经上传到github,blog-template-nextjs),这几个月在学习应用vue3及vite开发环境时,想着把暗黑主题也带到我的demo我的项目中,并构想实现了。 形容:在nextjs中对antd的亮白和暗黑主题切换实际。在线预览:传送门 在页面的下拉菜单切换主题,目前只筹备了黑白,全白和暗黑三种。 代码仓库:vue3-admin预览图登录 暗黑主题 红色主题 工作台 暗黑主题 红色模式 实现原理:通过antd-theme-generator库,将ant-design-vue中的款式及我的项目中应用到的款式(less编写)抽出放到color.less中,再通过getLessVars办法挨个将多个主题变量配置打包成json文件并在我的项目中援用,最初在生产环境中通过调用less.modifyVars办法批改全局款式(less会依据提供的变量值,删除以后的style标签,从新生成新的款式标签) 外围代码因为是在vite环境中antd-theme-generator作者提供的antd-theme-webpack-plugin没法应用,所以这里写了一个简略版的vite插件替换:vite-plugin-antd-theme。次要是封装了一下生成json的行为和主动调用generateTheme办法。 装置vite-plugin-antd-theme yarn add vite-plugin-antd-theme -Dvite-plugin-antd-theme中已被动依赖了antd-theme-generator,所以主我的项目不须要再次装置,也不须要从中导入办法,并且vite-plugin-antd-theme导出了antd-theme-generator所需的入参类型。 vite.config.ts import path from 'path';import { UserConfigExport, ConfigEnv } from 'vite';import viteAntdTheme, { ThemeEntry, AntdThemeOptions } from 'vite-plugin-antd-theme';const themesEntry: Array<ThemeEntry> = [ // 暗黑主题 { entryPath: './node_modules/ant-design-vue/lib/style/themes/dark.less', outputName: 'dark', outputPath: './src/config' }, // 默认主题 { entryPath: './src/styles/vars.less', outputName: 'light', outputPath: './src/config' }, // 紧凑主题 { entryPath: './node_modules/ant-design-vue/lib/style/themes/compact.less', outputName: 'compact', outputPath: './src/config' }];const options: AntdThemeOptions = { themesEntry, // 是否提取全副变量,默认false,优先级低于设置themeVariables allVariables: true, // 以下是antd-theme-generator配置项 antDir: path.join(__dirname, './node_modules/ant-design-vue'), stylesDir: path.join(__dirname, './src'), // all files with .less extension will be processed varFile: path.join(__dirname, './src/styles/vars.less'), // default path is Ant Design default.less file themeVariables: [], outputFilePath: path.join(__dirname, './public/static/color.less'), // if provided, file will be created with generated less/styles customColorRegexArray: [/^fade\(.*\)$/] // An array of regex codes to match your custom color variable values so that code can identify that it's a valid color. Make sure your regex does not adds false positives.};export default ({ command }: ConfigEnv): UserConfigExport => { return { plugins: [ viteAntdTheme(options) ] };};能够看出默认的配置项依然很多,打算在1.0.2之后的版本会将默认项封装。 ...

May 25, 2021 · 2 min · jiezi

关于vue.js:探索将-Vue-SFC-编译为-ESM-之路

最近想解决个场景,在给 ve-charts 编写文档的时候,想做一个代码示例演示性能,在改变代码后能够直观的看到组件的变动。之前版本中文档是用的 docsify ,docsify 中自带了一个 vuep。vuep 就是解决我须要的场景的。不过 vuep 版本比拟老了。目前还不反对 vue3 组件。所以想独立开发一个运行代码示例的组件。 ES Modules 标准ES modules(ESM) 是 JavaScript 官网的标准化模块零碎演进在 ES6 之前,社区内曾经有咱们相熟的模块加载计划 CommonJS 和 AMD,前者用于服务器 即 Node.js,而后者借助第三方库实现浏览器加载模块。 在前端工程里,利用范畴比拟广的还是 CommonJS,从三个方面咱们能够看出: 咱们依赖的公布在 NPM 上的第三方模块,大部分都打包默认反对 CommonJS通过 Webpack 构建的前端资源是兼容 Node.js 环境的 CommonJS咱们编写的 ESM 代码 须要通过 Babel 转换为 CommonJS趋势好消息是,浏览器曾经开始原生反对模块性能了,并且 Node.js 也在继续推动反对 ES Modules 模块性能 ESM 标准化还在路线上 客户端与服务端的实现区别在 Node.js 中应用 ES Modules自 Node.js v13.2.0 开始,有两种形式能够正确解析 ESM 规范的模块,在此之间还须要加上 --experimental-modules 才能够应用 ESM 模块。 以后缀名为 .mjs 结尾的文件以后缀名为 .js 结尾的文件,且在 package.json 中申明字段 type 为 module// esmA/index.mjsexport default esmA// or// esmB/index.jsexport default esmB// esmB/package.json{ "type": "module"}以后缀名为 .cjs 结尾的文件,将持续解析为 CommonJS 模块在浏览器中应用 ES Modules古代浏览器曾经原生反对加载 ES Modules 须要将 type="module" 放到 <script> 标签中,申明这个脚本是一个模块。 ...

May 25, 2021 · 5 min · jiezi

关于vue.js:奇淫巧技vue动态渲染htmlscript模板

vue动静渲染html/script模板场景:页面html,script从接口动静获取,渲染出页面 解决: 1.定义方法 newVue(script, html) { let main = eval(`(${script})`); main.template = `<div>${html}</div>`; new Vue({ components: { test: main }, data() { return { } }, template: `<div><test/></div>` }).$mount('#app')}} 2.调用 newVue('{components:{},data(){return{text:'111'}},created(){},mounted(){},methods:{}}','<div><span>{{text}}</span></div>') 展现后果

May 24, 2021 · 1 min · jiezi

关于vue.js:Vue任意地方调用父级方法

少数古代的 web UI 框架或库,比方 Vue、 React 和 Angular,它们利用组件来组织代码,通过传递必要的属性从父类调用组件的办法/函数是相当容易的。这意味着您可能须要调用布局中定义的办法,或者调用来自嵌套级别的组件的父组件调用该办法在 Vue中,能够应用像 Vuex这样的状态管理器来实现这一点,然而如果您不想要这样简单的解决方案,也能够应用相当简略的内置 Vue 办法 设有一个名为 MyButton.vue 的组件如下所示: <template> <div> <button @click="$emit('my-event')">Click Me!</button> </div></template><script>export default {}</script>您能够看到,有一个调用 $emit 的简略单击事件,$emit 是 Vue 中的一个内置办法 当然,如果您想要一个更具结构化的组件,您能够调用一个自定义办法,并在其中调用 $emit 办法,如下所示 <template> <div> <button @click="buttonClickHandler">Click Me!</button> </div></template><script>export default { methods: { buttonClickHandler() { this.$emit('my-event') } }}</script>无论如何编写这个局部,它都会收回一个事件。当您应用这个组件时,您能够通过 v-on: 或@(这两者完全相同)来捕捉这个事件,并执行任何您想要的操作。例如,如果你想在你的 index.vue 中应用这个按钮 template> <div> <MyButton @my-event="myButtonEventHandler" /> </div></template><script>import MyButton from "~/components/MyButton";export default { components: { MyButton }, methods: { myButtonEventHandler() { alert('I am here!') } }}</script>当应用 $emit 办法时,如上所示,第一个参数是事件的名称,其余参数是传递给办法的参数。所以你也能够这样做: ...

May 23, 2021 · 1 min · jiezi

关于vue.js:vue-conf-2021-points

vue conf 2021里我关怀的points Vue 3生态停顿vue router稳固vuex稳固开发体验改良构建工具viteSFC语法IDE/TS反对vite相似vue-cli的体验基于原生ESM的热更新基于esbuild的依赖预打包兼容rollup的插件机制内置SSR反对...VitePressVuePress的所有长处Vite的速度防止动态内容的double payload和hydration开销编译阶段的优化script setup<template> <h1>{{ msg }}</h1></template><script setup>const msg = 'Hello World'</script>style动静变量注入<template> <h1>{{ msg }}</h1></template><script setup>import { ref } from 'vue' const msg = 'Hello World'const color = ref('red')</script><style> h1 { color: v-bind(color) }</style>Vue ToolsVue 2/3Timeline面板性能调试IDE反对打算Vetur -> Volar官网的vue-tsc命令行类型查看提供其余编辑器的LSP整合2.7IE11反对3.1和3.2Migration BuildSuspenseelement 3headlessElement coreElement style (Web GL)

May 23, 2021 · 1 min · jiezi

关于vue.js:vue2611版本的nextTick

if (typeof Promise !== 'undefined' && isNative(Promise)) { const p = Promise.resolve() timerFunc = () => { p.then(flushCallbacks) // In problematic UIWebViews, Promise.then doesn't completely break, but // it can get stuck in a weird state where callbacks are pushed into the // microtask queue but the queue isn't being flushed, until the browser // needs to do some other work, e.g. handle a timer. Therefore we can // "force" the microtask queue to be flushed by adding an empty timer. if (isIOS) setTimeout(noop) } isUsingMicroTask = true} else if (!isIE && typeof MutationObserver !== 'undefined' && ( isNative(MutationObserver) || // PhantomJS and iOS 7.x MutationObserver.toString() === '[object MutationObserverConstructor]')) { // Use MutationObserver where native Promise is not available, // e.g. PhantomJS, iOS7, Android 4.4 // (#6466 MutationObserver is unreliable in IE11) let counter = 1 const observer = new MutationObserver(flushCallbacks) const textNode = document.createTextNode(String(counter)) observer.observe(textNode, { characterData: true }) timerFunc = () => { counter = (counter + 1) % 2 textNode.data = String(counter) } isUsingMicroTask = true} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // Fallback to setImmediate. // Technically it leverages the (macro) task queue, // but it is still a better choice than setTimeout. timerFunc = () => { setImmediate(flushCallbacks) }} else { // Fallback to setTimeout. timerFunc = () => { setTimeout(flushCallbacks, 0) }}Promise > MutationObserver > setImmediate > setTimeout ...

May 23, 2021 · 2 min · jiezi

关于vue.js:搞懂Vue响应式原理2实现对象响应式搞懂windowtargetDeptarget到底是个什么东西

代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <h2 id="test"></h2> <button id="but">+1</button> <script> class Watcher { // constructor(vm, exp, cb) { this.vm = vm this.exp = exp this.cb = cb this.value = this.get() //在watcher被实例化的时候调用下文的get办法 } get() { Dep.target = this //缓存以后的this,this是一个watcher对象 const value = this.vm.data[this.exp] //这段是精华,通过获取对应属性的值,调用了被监听数据的get办法,由此调用了dep.depend()办法。因为Dep.target是存在的,于是往Dep实例中的subs数组增加了一个依赖,也就是watcher对象。 Dep.target = null return value } update() { //在data产生扭转的时候,监听数据的set办法被调用,dep实例调用notify办法,告诉subs数组中的每一个依赖调用update办法,update办法会调用回调函数,更新元素的内容。 const value = this.vm.data[this.exp] this.cb.call(this.vm,value) } } class Dep { //dep实例的作用是收集依赖 constructor() { this.subs = [] } addSub(sub) { this.subs.push(sub) } depend() { if (Dep.target) { this.addSub(Dep.target) console.log(this.subs) } } notify() { const subs = this.subs.slice() for (let i = 0; i < subs.length; i++) { subs[i].update() } } } class Observer { defineReactive(data) { if (!data || typeof data != 'object') return let dep = new Dep() Object.keys(data).forEach(key => { let value = data[key] this.defineReactive(value) //如果value还是对象,则对该对象递归持续应用defineReactive办法,实现深度绑定 Object.defineProperty(data, key, { //应用该办法监听对象属性的变动 enumerable: true, configurable: true, get: function () { console.log(value, 'get method') dep.depend() return value }, set: function (newValue) { console.log(value, 'set method') if (value === newValue) return value = newValue dep.notify() } }) }) } } class Vue { constructor(options = {}) { this.el = options.el this.exp = options.exp this.data = options.data el.innerHTML = this.data[this.exp] let observer = new Observer() observer.defineReactive(this.data) new Watcher(this, this.exp, function(val) { el.innerHTML = val }) return this } } let el = document.getElementById("test") let vue = new Vue({ el: el, exp: 'count', data: { count: 123 } }) let but = document.getElementById("but") but.addEventListener('click', () => { vue.data.count += 1 }) </script></body></html>1、代码思路:1)首先创立一个Observer类,用于监听对象中的数据。 ...

May 23, 2021 · 3 min · jiezi

关于vue.js:uniapp踩坑记录uview的collapse组件中使用具名插槽在app端不生效

环境HBuilder X 3.1.12uview-ui 1.8.4 问题形容应用uview-ui的collapse组件 <u-collapse> <u-collapse-item> <template #title> <view class="title-box"> test </view> </template> </u-collapse-item></u-collapse>以上代码在h5端运行没问题,但在app端,title的内容不显示以下写法令没有问题 <u-collapse> <u-collapse-item> <template slot="title"> // 留神这行不一样 <view class="title-box"> test </view> </template> </u-collapse-item></u-collapse>通过查看uview的源码调试发现第一种写法$slots['title']的值是undefined故如果组件外部应用了$slots,须要留神具名插槽的应用

May 22, 2021 · 1 min · jiezi

关于vue.js:vue双向绑定原理

什么是双向绑定双向绑定是指,数据和视图的同步变动 为什么试用双向绑定单向数据绑定,数据的流动方向繁多,不便追踪,然而当data数据变动时,就须要将之前的html代码去掉,把新的数据和模板插入到文档中。 双向数据绑定刚好解决了这个问题,当数据变动时,页面同时也会变动,只是不太容易跟踪数据源 如何实现双向绑定vue是通过Object.defineProperty和联合公布订阅者模式实现的 接下来咱们用代码来实现 vue的模板文件 <div id="app"> <input type="text" v-model="text" /> {{text}} </div><script> new Vue({ data: { text: "hello world", }, el: "app", }); </script>vue模板文件浏览器是不能辨认的,咱们须要将v-model 、{{}}等这样的语法转换成浏览器能够辨认的语法, 让text值能够回显的页面上 文档碎片的作用:能够须要插入的节点,放到文档碎片上,最初一次性插入到文档中// 创立Vue函数 初始化参数 function Vue(options) { this.data = options.data; this.el = options.el; // nodeToFragment函数 返回浏览器能够辨认的dom元素 let dom = nodeToFragment(document.getElementById(this.el), this); document.getElementById(this.el).appendChild(dom); } /** 获取生成的dom元素 node: app dom元素 vm vue对象 **/ function nodeToFragment(node, vm){ // 创立文档碎片 let fragment = document.createDocumentFragment(); while (node.firstChild) { // 如果子元素,则编译其内容 compile(node.firstChild, vm); // 将编译完的内容插入到模板碎片中,每插入一个元素,node对应的删除相应的元素(appendChild的作用) fragment.appendChild(node.firstChild); } return fragment; } // 编译内容 function compile(node, vm) { switch (node.nodeType) { // 元素节点 case 1: let atrr = node.attributes; for (let i = 0; i < atrr.length; i++) { if (atrr[i].nodeName === "v-model") { let name = atrr[i].nodeValue; // 监听键盘,每次扭转html中的值时,对应的data值也会变动 node.addEventListener("input", function (e) { vm.data[name] = e.target.value; }); // 将data的值,赋值给input node.value = vm.data[name]; } } break; // 文本节点 case 3: // 正则匹配{{}} let reg = /\{\{(.*)\}\}/; if (reg.test(node.nodeValue)) { let name = RegExp.$1; // 将data的值,赋值给文本节点 node.nodeValue = vm.data[name]; } break; default: break; } }这个时候就要引入观察者订阅者模式,订阅者是指用到数据的中央,观察者是值察看数据的变动,而后告诉订阅者 订阅者: ...

May 22, 2021 · 2 min · jiezi

关于vue.js:vue后台管理系统搭建

前提装置node.js控制台装置yarn:npm install -g yarn查看yarn版本:yarn --version注:-g示意的是全局装置 淘宝镜像装置:npm install -g cnpm --registry=https://registry.npm.taobao.org作用:装置胜利后 应用 cnpm i xxx 代替 npm install xxx解决VScode禁用脚本报错以管理员身份运行vscode执行:get-ExecutionPolicy,显示Restricted,示意状态是禁止的执行:set-ExecutionPolicy RemoteSigned ---无任何反馈这时再执行get-ExecutionPolicy,就显示RemoteSigned ---曾经好了--若没好,去百度再找解决办法我的项目局部装置脚手架: 在有node.js的状况下间接用,就是有点慢:npm install -g @vue/cli若装置yarn后可用:yarn global add @vue/cli装置淘宝镜像后可用:cnpm install -g @vue/cli查看vue版本:vue --version 或 vue -V ( 简写-是大写的"V" ) 降级( 可省略 ): npm update -g @vue/cliyarn global upgrade --latest @vue/clicnpm update -g @vue/cli创立我的项目 vue create 我的项目名 vue ui以vue create 我的项目名形式创立 创立我的项目模式( Please pick a preset ):Manually select features( 手动抉择个性 ) Babel:把es6转es5--争对低版本浏览器Router:路由CSS Pre-processors:用来less和sass的css编译工具Linter / Formatter:代码标准校验是否应用history做路由模式( Use history mode for router? ):N --兼容不太好应用什么预处理器( Pick a CSS pre-processor ... ):Less --会哪个,选哪个。代码格局校验标准( Pick a linter / formatter config ): ESLint + Standard config什么时候触发代码校验( Pick additional lint features ): ...

May 21, 2021 · 3 min · jiezi

关于vue.js:Vue错误总结

总结谬误1Elements in iteration expect to have 'v-bind:key' directives v-for渲染列表时候须要绑定一个key值,这个值会作为其中每一个节点的身份辨认。此外这个节点不倡议绑定对象,尽管不影响渲染成果,然而控制台会呈现一系列谬误提醒。如下

May 21, 2021 · 1 min · jiezi