首页 文章 精选 留言 我的

精选列表

搜索[前端性能],共10000篇文章
优秀的个人博客,低调大师

OAuthApp v1.12.7 更新 | 前端发布工具

更新内容: 1,应用绑定默认https域名 2,ssl证书管理 3,可根据服务器筛选发布记录 4,应用配置UI优化 BUG修复: 1,新建项目/应用后,导航栏未立即显示,需刷新页面 2,应用首次选择设定发布目录后,没有立即显示,需刷新页面 3,用户编辑资料页无法打开 4,应用在线编辑器,高度未自适应 网址:https://www.oauthapp.com/ 文档:https://web.oauthapp.com/4/docs

优秀的个人博客,低调大师

开源前端地图库 Leaflet 发布 1.9 版本

v1.9的发布为Leaflet自2016年以来的首次重大版本升级奠定了基础!从那时起,很多事情都发生了变化,是时候让Leaflet与网络平台一起成长了。 在这个版本之后,我们将把1.x的代码分支化,并将其置于维护模式中——只保留潜在的1.x版本用于关键的错误修复。尽管2.0版本还很遥远,需要一些时间才能成形,但我们计划做以下改变。 放弃对Internet Explorer的支持。这已经是一个漫长的过程,但现在Internet Explorer已经正式报废,是时候说再见了。今后,Leaflet将转向一个常青的策略,针对Firefox、Chrome、Edge和Safari等浏览器。 拥抱现代JavaScript。为了保持向后兼容,Leaflet完全是用ES5编写的,这是传统浏览器所支持的JavaScript版本。因此,我们无法利用许多伟大的JavaScript功能(例如,标准化的类,而不得不依赖我们自己的实现)。通过采用更现代的ECMAScript标准,我们可以开始努力使Leaflet与现代JavaScript库所期望的相一致。 标准化的模块。当我们发布Leaflet v1时,JavaScript世界的格局非常不同,充满了竞争性的模块标准,如CommonJS、AMD和UMD。今天,ECMAScript模块已经成为将JavaScript生态系统统一在一个旗帜下的明确的发展方向。今后,Leaflet将只在一个标准化的模块系统中发布,大大降低了我们分布式代码的复杂性。 移除Leaflet全局变量。作为一个使用Leaflet的开发者,你可能对大写字母L非常熟悉。这是Leaflet全局变量,Leaflet的所有功能都在这里。为了让编译器工具能够通过一个叫做tree-shaking的过程更好地消除死代码,我们正在删除这个全局变量。为了保持与旧插件的向后兼容性,我们将提供一个可以手动导入的垫片,以恢复这一功能。 点击这里查看完整的更新日志。 补充说明:v1.9.1补丁已经发布,以解决与Leaflet.markercluster插件的兼容性。

优秀的个人博客,低调大师

Vue中 前端实现生成 PDF 并下载

思路: 通过 html2canvas 将 HTML 页面转换成图片,然后再通过 jspdf 将图片的 base64 生成为 pdf 文件。 1. 安装及引入 // 将页面 html 转换成图片 npm install html2canvas --save // 将图片生成 pdf npm install jspdf --save 复制代码 在项目主文件 main.js 中引入定义好的实现方法并注册 import htmlToPdf from '@/utils/htmlToPdf'; // 使用 Vue.use() 方法就会调用工具方法中的install方法 Vue.use(htmlToPdf); 复制代码 2. 封装导出 pdf 文件方法 配置详解 let pdf = new jsPDF('p', 'pt', [pdfX, pdfY]); 第一个参数: l:横向 p:纵向 第二个参数:测量单位("pt","mm", "cm", "m", "in" or "px"); 第三个参数:可以是下面格式,默认为“a4”。如需自定义格式,只需将大小作为数字数组传递,如:[592.28, 841.89]; a0 - a10 b0 - b10 c0 - c10 dl letter government-letter legal junior-legal ledger tabloid credit-card 复制代码 pdf.addPage() 在PDF文档中添加新页面,默认a4。参数如下: pdf.addImage() 将图像添加到PDF。参数如下: 删除某页 pdf let targetPage = pdf.internal.getNumberOfPages(); //获取总页 pdf.deletePage(targetPage); // 删除目标页 复制代码 保存 pdf 文档 pdf.save(`测试.pdf`); 复制代码 封装导出 pdf 文件方法(utils/htmlToPdf.js) // 导出页面为PDF格式 import html2Canvas from 'html2canvas' import JsPDF from 'jspdf' export default{ install (Vue, options) { Vue.prototype.getPdf = function () { // 当下载pdf时,若不在页面顶部会造成PDF样式不对,所以先回到页面顶部再下载 let top = document.getElementById('pdfDom'); if (top != null) { top.scrollIntoView(); top = null; } let title = this.exportPDFtitle; html2Canvas(document.querySelector('#pdfDom'), { allowTaint: true }).then(function (canvas) { // 获取canvas画布的宽高 let contentWidth = canvas.width; let contentHeight = canvas.height; // 一页pdf显示html页面生成的canvas高度; let pageHeight = contentWidth / 841.89 * 592.28; // 未生成pdf的html页面高度 let leftHeight = contentHeight; // 页面偏移 let position = 0; // html页面生成的canvas在pdf中图片的宽高(本例为:横向a4纸[841.89,592.28],纵向需调换尺寸) let imgWidth = 841.89; let imgHeight = 841.89 / contentWidth * contentHeight; let pageData = canvas.toDataURL('image/jpeg', 1.0); let PDF = new JsPDF('l', 'pt', 'a4'); // 两个高度需要区分: 一个是html页面的实际高度,和生成pdf的页面高度 // 当内容未超过pdf一页显示的范围,无需分页 if (leftHeight < pageHeight) { PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight) } else { while (leftHeight > 0) { PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight) leftHeight -= pageHeight; position -= 592.28; // 避免添加空白页 if (leftHeight > 0) { PDF.addPage(); } } } PDF.save(title + '.pdf') }) } } } 复制代码 相关组件中应用 <template> <div class="wrap" > <div id="pdfDom" style="padding: 10px;"> <el-table :data="tableData" border> <el-table-column prop="date" label="日期" width="250"></el-table-column> <el-table-column prop="name" label="姓名" width="250"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> <button type="button" style="margin-top: 20px;" @click="btnClick">导出PDF</button> </div> </template> <script> export default { data() { return { exportPDFtitle: "页面导出PDF文件名", tableData: [ { date: '2016-05-06', name: '王小虎', address: '重庆市九龙坡区火炬大道' }, { date: '2016-05-07', name: '王小虎', address: '重庆市九龙坡区火炬大道' },{ date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-07', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-07', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '南京市江宁区将军大道' }, { date: '2016-05-07', name: '王小虎', address: '南京市江宁区将军大道' },, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-07', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' },{ date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '武汉市洪山区文化大道' }, { date: '2016-05-06', name: '王小虎', address: '武汉市洪山区文化大道' }, { date: '2016-05-07', name: '王小虎', address: '武汉市洪山区文化大道' }, { date: '2016-05-06', name: '王小虎', address: '南京市江宁区将军大道' }, { date: '2016-05-07', name: '王小虎', address: '武汉市洪山区文化大道' }, ] } }, methods: { btnClick(){ this.$nextTick(() => {this.getPdf();}) }, }, } </script> 复制代码 效果 待优化部分 分页时,页面内容被截断(欢迎留言讨论交流); 不同内容,另起一页开始;思路:计算超出内容,占最后一页的高度(设定间距 = 页面高度 - 超出部分高度)。 如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激!

优秀的个人博客,低调大师

前端Vue框架在PostCSS怎样使用sass

为什么要使用PostCss 众所周知转换 px 单位的插件有很多,知名的有 postcss-px-to-viewport 和 postcss-pxtorem,前者是将 px 转成 vw,后者是将 px 转成 rem,精简了不常用的配置。将成为vw优先单位使用,以rem作为回退模式。考虑到vw在移动设备的支持度不如rem,这款插件很好的解决了该问题。然后简单的介绍下。 安装指令 $ npm install @ moohng / postcss-px2vw --save-dev 复制代码 使用方法 首先创建一个.postcssrc.js文件,然后配置 module.exports = { plugins: { '@moohng/postcss-px2vw': {} } } 复制代码 例子: 使用前: .box { border: 1px solid black; margin-bottom: 1px; font-size: 20px; line-height: 30px; } 复制代码 使用后: .box{ border: 1px solid black; margin-bottom: 1px; font-size: 0.625rem; font-size: 6.25vw; line-height: 0.9375rem; line-height: 9.375vw; } 复制代码 配置方面 viewportWidth:对应设计图的宽度,用于计算 vw。默认 750,指定 0 或 false 时禁用 rootValue:根字体大小,用于计算 rem。默认 75,指定 0 或 false 时禁用 unitPrecision:计算结果的精度,默认 5 minPixelValue:小于等于该值的 px 单位不作处理,默认 1 注意:该插件只会转换 px 单位。rootValue 一般建议设置成 viewportWidth / 10 的大小,将设计图分成10等分。由于浏览器有最小字体限制,如果设置得过小,页面可能跟预期不一致 如果要使用 rem 单位,需要自己通过 js 来动态计算根字体的大小。如果将设计图分成 10 等分计算,那么根字体的大小应该是 window.innerWidth / 10。 这样一个postCss的插件就配置完成了,希望我的总结能给予你的帮助 sass:常用备忘 常用的sass笔记,快速的开发 一、变量 所有变量以$开头 $font_size: 12px; .container{ font-size: $font_size; } 复制代码 如果变量嵌套在字符串中,需要写在#{}中 $side : left; .rounded { border-#{$side}: 1px solid #000; } 复制代码 二、嵌套 层级嵌套 .container{ display: none; .header{ width: 100%; } } 复制代码 属性嵌套,注意,border后需要加上冒号: .container { border: { width: 1px; } } 复制代码 可以通过&引用父元素,常用在各种伪类 .link{ &:hover{ color: green; } } 复制代码 三、mixin 简单理解,是可以重用的代码块,通过@include 命令 // mixin @mixin focus_style { outline: none; } div { @include focus_style; } 复制代码 编译后生成 div { outline: none; } 还可指定参数、缺省值 // 参数、缺省值 @mixin the_height($h: 200px) { height: $h; } .box_default { @include the_height; } .box_not_default{ @include the_height(100px); } 复制代码 编译后生成 .box_default { height: 200px; } .box_not_default { height: 100px; } 复制代码 四、继承 通过@extend,一个选择器可以继承另一个选择器的样式。例子如下 // 继承 .class1{ float: left; } .class2{ @extend .class1; width: 200px; } 复制代码 编译后生成 .class1, .class2 { float: left; } .class2 { width: 200px; } 复制代码 五、运算 直接上例子 .container{ position: relative; height: (200px/2); width: 100px + 200px; left: 50px * 2; top: 50px - 10px; } 复制代码 编译后生成 .container { position: relative; height: 100px; width: 300px; left: 100px; top: 40px; } 复制代码 插入文件 用@import 来插入外部文件 @import "outer.scss"; 复制代码 也可插入普通css文件 @import "outer.css"; 复制代码 自定义函数 通过@function 来自定义函数 @function higher($h){ @return $h * 2; } .container{ height: higher(100px); } 复制代码 编译后输出 .container { height: 200px; } 复制代码 结语 创作不易,如果对大家有所帮助,希望大家点赞支持,有什么问题也可以在评论区里讨论😄~ 如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激 ! 来自 “开源独尊 ” ,链接: https://ym.baisou.ltd/post/822.html

优秀的个人博客,低调大师

珠峰前端架构师培养计划2021

2 --> 爱分享 爱生活 加油 2021 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习Vue.js? 学习曲线平缓、易上手、功能强大、轻便 目前最流行的三大框架之一,适用范围广 升职加薪 ------ 哈哈哈哈哈哈哈哈 1.1.3 Vue.js的模式 MVVM模式,视图层和数据层的双向绑定,让我们无需再去关系DOM操作的事情,更过的精力放在数据和业务逻辑上去 1.1.4 Vue.js环境搭建 script vue脚手架工具vue-cli搭建。 二、数据绑定,指令,事件 2.1.1 vue实例和数据绑定 一、 <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 通过构造函数Vue就可以创建一个Vue的根实例,并启动Vue应用---入口 var app = new Vue({ el: '', data: { } }) 二、其中必不可少的一个选项就是el,el用于指定一个页面中已存在的DOM元素来挂载Vue实例 三、通过Vue实例的data选项,可以声明应用内需要双向绑定的数据。建议所有会用到的数据都预先在data内声明,这样不至于将数据散落在业务逻辑中,难以维护。也可以指向一个已经有的变量 四、挂载成功后,我们可以通过app.$el来访问该元素。Vue提供了很多常用的实例属性与方法,都已 $开头,比如 $el,Vue实例本身也代理了data对象里所有属性,所以可以这样访问 五、如果是访问data里的属性,用app.属性名 2.1.2 created: 实例穿件完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用。需要初始化处理一些数据时会比较有用。------还未挂载 mounted: el挂载到实例上后调用,一般我们的第一个业务逻辑会从这里开始。------刚刚挂载 beforeDestroy: 实例销毁之前调用。主要解绑一些使用addEventListener监听的事件等。 2.1.3 文本插值和表达式 语法: 使用双大括号(Mustache语法)"{{ }}"是最基本的文本插值方法,他会自动将我们双向绑定的数据实时显示出来 用法: 在{{ }}中,处了简单的绑定属性值外,还可以使用JavaScript表达式进行简单的运算、三元运算等 Vue.js只支持单个表达式,不支持语句和流控制 2.2.1 过滤器 Vue支持在{{ }}插值的尾部添加一小管道符"|"对数据进行过滤,经常用于格式化文本,比如字母全部大写、货币千位使用逗号分隔等。过滤的规则是自定义的,通过给Vue实例添加选项filters来设置过滤器:{{data | filter1 | filter2}}{{data | formatData(1,2)}}中的第一个和第二个参数,分别对应过滤器的第二个和第三个参数 2.2.2 指令和事件 指令( Directives )是 Vue 模板中最常用的一项功能,它带有前缀 v-,能帮我们快速完成DOM操作。循环渲染。显示和隐藏 v-­text:—————­解析文本 和{{ }} 作用一样 v­-html:————— 解析html v­-bind—————–v­bind 的基本用途是动态更新 HTML 元素上的属性,比如 id 、class 等,本节只介绍基本章节,后面章节会更加深入详细讲述 v­-on——————它用来绑定事件监听器v­-on具体介绍在普通元素上, v­on 可以监听原生的 DOM 事件,除了 click 外,还有dblclick、 keyup, mousemove 等。表达式可以是一个方法名,这些方法都写在 Vue 实例的 methods属性内,并且是函数的形式,函数内的 this 指向的是当前 Vue 实例本身,因此可以直接使用 this.xxx 的形式来访问或修改数据vue中用 到的所有方法都定义在methods中 2.2.3 语法糖 语法糖是指在不影响功能的情况下 , 添加某种简洁方法实现同样的效果 , 从而更加方便程序开发。 v-bind ——> : (冒号) v-on ——> @ 运用以上知识点,总和一个小demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>demo</title> <style> .data { background: red; height: 18px; } </style> </head> <body> <div id="app"> {{name}} <br> {{name | formatDate}} <br> <div v-html="html"></div> <span v-text="weather"></span> <br> <div v-bind:class="className"></div> <button v-on:click="click">{{countnum}}</button> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var plusDate = function(value){ return value < 10 ? '0' + value : value } var app = new Vue({ el : '#app', data : { name: new Date(), html: '<div>你好</div>', weather: '今天天气不错', className: 'data', countnum: 0 }, filters:{ formatDate: function(value) { var date = new Date(value) var year = date.getFullYear() var month = plusDate(date.getMonth()+1) var day = plusDate(date.getDate()) var hours = plusDate(date.getHours()) var min = plusDate(date.getMinutes()) var sec = plusDate(date.getSeconds()) return year + '--' + month + '--' + day + ' ' + hours + ':' + min + ':' + sec } }, mounted: function(){ var _this = this this.timer = setInterval(function(){ _this.name = new Date() },1000) }, methods: { click: function(){ this.countnum = this.countnum + 1 } }, beforeDestroy: function(){ clearInterval(this.timer) } }) </script> </body> </html> 三、 计算属性 3.1 什么是计算属性 我们己经可以搭建出一个简单的 Vue 应用,在模板中双向绑定一些数据或表达式了。但是表达式如果过长,或逻辑更为复杂时,就会变得雕肿甚至难以阅读和维护 <div> {{ text.split ( ’,’ ) •reverse () . join (’,’)}} </div> 这里的表达式包含 3 个操作,并不是很清晰,所以在遇到复杂的逻辑时应该使用 计算属性 所有的计算属性都以函数的形式写在 Vue 实例内的computed 选项内,最终返回计算后的结果。 3.2 计算属性用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以。除了上例简单的用法 计算属性还可以依赖多个 Vue 实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新 getter和setter 每一个计算属性都包含一个 getter 和一个 setter,我们上面的两个示例都是计算属性的默认用法 , 只是利用了 getter来读取。在你需要时,也可以提供一个 setter 函数 , 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发 setter函数,执行一些自定义的操作 计算属性除了上述简单的文本插值外,还经常用于动态地设置元素的样式名称 class 和内联样式 style 小技巧: 计算属性还有两个很实用的小技巧容易被忽略: 一、是计算属性可以依赖其他计算属性: 二、是计算属性不仅可以依赖当前 Vue 实例的数据,还可以依赖其他实例的数据 3.3计算属性缓存 调用 methods 里的方法也可以与计算属性起到同样的作用 页面中的方法: 如果是调用方法,只要页面重新渲染。方法就会重新执行,不需要渲染,则不需要重新执行 计算属性:不管渲染不渲染,只要计算属性依赖的数据未发生变化,就永远不变 结论: 没有使用计算属性,在 methods 里定义了一个方法实现了相同的效果,甚至该方法还可以接受参数,使用起来更灵活。既然使用 methods 就可以实现,那么为什么还需要计算属性呢?原因就是计算属性是基于它的依赖缓存的。 一个计算属性所依赖的数据发生变化时,它才会重新取值,所以text 只要不改变,计算属性也就不更新 何时使用: -----------使用计算属性还是 methods 取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性,除非你不希望得到缓存。 计算属性demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>计算属性</title> </head> <body> <div id="data"> {{fullName}} <br> {{watch()}} </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var app = new Vue({ el: '#data', data: { firstName:'Cai', lastName: 'hua' }, computed: { fullName: function(){ return this.firstName + ' ' + this.lastName } }, methods: { watch: function(){ return this.firstName + ' ' + this.lastName } } }) </script> </body> </html> 四、 v-­bind以及class与style的绑定 应用场景: DOM 元素经常会动态地绑定一些 class 类名或 style 样式 4.1 了解bind指令 v-­bind的复习: 链接的 href 属性和图片的 src 属性都被动态设置了,当数据变化时,就会重新渲染。 在数据绑定中,最常见的两个需求就是元素的样式名称 class 和内联样式 style 的动态绑定,它们也是 HTML的属性,因此可以使用 v­-bind 指令。 我们只需要用 v­-bind计算出表达式最终的字符串就可以,不过有时候表达式的逻辑较复杂,使用字符串拼接方法较难阅读和维护,所以 Vue.js 增强了对 class 和 style 的绑定。 4.2 绑定 class 的几种方式 4.2.1 对象语法 给 v-­bind:class 设置一个对象,可以动态地切换 class,值对应true ,false 当 class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时, 都可以使用 data 或 computed 4.2.2 数组语法 当需要应用多个 class 时, 可以使用数组语法 , 给:class 绑定一个数组,应用一个 class列表: 数组成员直接对应className--类名 可以用三目运算实现,对象和数组混用 4.2.3 在组件上使用 : 暂时不考虑—­挖坑 4.3 绑定内联样式 使用 v­-bind:style (即:style ) 可以给元素绑定内联样式,方法与 :class 类似,也有对象语法和数组语法,看起来很像直接在元素上写 CSS 注意 : css 属性名称使用驼峰命名( came!Case )或短横分隔命名( kebab­case),应用多个样式对象时 , 可以使用数组语法,在实际业务 中,style 的数组语法并不常用 , 因为往往可以写在一个对象里面, 而较为常用 的应当是计算属性 使用 :style 时, Vue .js 会自动给特殊的 css 属性名称增加前缀, 比如 transform 。 无需再加前缀属性!!!! v-bind绑定demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>v-bind绑定</title> <style> .divStyle{ width: 88px; height: 88px; background: red; } .borderStyle{ border: 8px solid black; } .color{ color: red; } .size{ font-size: 28px; } .blueClass{ color: blue; } .font{ font-size: 36px; } </style> </head> <body> <div id="demo"> //对象语法 <br> <div v-bind:class="{divStyle : isActive, borderStyle : isBorder}"></div> <hr> //数组语法<br> <div v-bind:class="[colorClass,sizeClass]">Hello word</div> <hr> //对象和数组混用 <div v-bind:class="[{blueClass : isBlue},fontClass]">你好!</div> <hr> //绑定内联样式 <div v-bind:style="{'background':background,'fontSize':fontSize + 'px'}">真好!</div> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var app = new Vue({ el:'#demo', data:{ isActive: true, isBorder: true, colorClass:"color", sizeClass: "size", isBlue:true, fontClass:"font", background: 'red', fontSize:'56' } }) </script> </body> </html> 五、vueJS中的内置指令 5.1 基本指令 5.1.1 v-­cloak一般与display:none进行结合使用 作用:解决初始化慢导致页面闪动的最佳实践 5.1.2 v-­once 定义:它的元素和组件只渲染一次 5.2 条件渲染指令 5.2.1 v-­if, v-­eles-­if ,v-­else 用法: 必须跟着屁股走 v-if的弊端 :Vue 在渲染元素时 ,出于效率考虑,会尽可能地复用已有的元素而非重新渲染, 因此会出现乌龙,只会渲染变化的元素,也就是说,input元素被复用了 解决方法: 加key,唯一,提供key值可以来决定是否复用该元素 5.2.2 v-­show 只改变了css属性display v­-if和v­-show的比较 v-­if: 实时渲染:页面显示就渲染,不显示。我就给你移除 v-­show: v-­show的元素永远存在也页面中,只是改变了css的display的属性 5.3 列表渲染指令v­-for 用法: 当需要将一个数组遍历或枚举一个对象属性的时候循环显示时,就会用到列表渲染指令 v­-for。 两种使用场景: 遍历多个对象 遍历一个对象的多个属性 v-for demo <body> <div id="demo"> //遍历多个对象一定是遍历的数组 //带索引的写法:括号的第一个变量,代表item,第二个代表index <ul> <li v-for="vuestu in vueStudy">{{vuestu.name}}</li> </ul> <br> //遍历一个对象的多个属性 //拿到value,key,index的写法 v-k-i--外开 <div v-for="(value,key,index) in women">{{index}}-----{{key}}------{{value}}</div> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var app = new Vue({ el:'#demo', data:{ vueStudy:[ //每个对象对应一个li {name:'敲代码'}, {name:'看资料'}, {name:'看蔡华鹏博客'} ], women:{ grid1: '张柏芝', grid2: '迪丽热巴', grid3: '高圆圆' } } }) </script> </body> 5.4 数组更新,过滤与排序 改变数组的一系列方法: push() 在末尾添加元素 pop() 将数组的最后一个元素移除 shift() 删除数组的第一个元素 unshift():在数组的第一个元素位置添加一个元素 splice() :可以添加或者删除函数—返回删除的元素三个参数: 第一个参数 表示开始操作的位置 第二个参数表示:要操作的长度 第三个为可选参数: sort():排序 reverse() 两个数组变动vue检测不到: 改变数组的指定项 改变数组长度 改变指定项: Vue.set(app.arr,1,”car”);app.arr.splice(1): 改变数组长度过滤:filter 解决方法: 1. set2. splice 5.5 方法和事件 [object MouseEvent] 5.5.1 基本用法 v-­on绑定的事件类似于原生 的onclick等写法: methods:{ handle:function (count) { count = count || 1; this.count += count; } } 如果方法中带有参数,但是你没有加括号,默认传原生事件对象event 5.5.2 修饰符 在vue中传入event对象用 $event 向上冒泡stop:阻止单击事件向上冒泡prevent:提交事件并且不重载页面self:只是作用在元素本身而非子元素的时候调用once: 只执行一次的方法 可以监听键盘事件: <input @keyup.13 ="submitMe"> ——­指定的keyCode vueJS为我们提供了: .enter .tab .delete 等等、、、、、、 六、 表单与v-­model 6.1 基本用法 v­-model: VUE提供了v­model指令, 用于在表单类元素上双向绑定事件 input和textarea 可以用于input框,以及textarea等 注意: 所显示的值只依赖于所绑定的数据,不再关心初始化时的插入的value 单选按钮: 单个单选按钮,直接用v­-bind绑定一个布尔值,用v-­model是不可以的 如果是组合使用,就需要v­-model来配合value使用,绑定选中的单选框的value值,此处所绑定的初始值可以随意给 复选框: 单个复选框,直接用定一个布尔值,可以用v­-model可以用v-­bind 多个复选框– 如果是组合使用,就需要v­-model来配合value使用,v-model绑定一个数组—如果绑定的是字符串,则会转化为true。false,与所有绑定的复选框的checked属性相对应 下拉框: 如果是单选,所绑定的value值初始化可以为数组,也可以为字符串,有value直接优先匹配一个value值,没有value就匹配一个text值 如果是多选,就需要v­-model来配合value使用,v­-model绑定一个数组,与复选框类似 v-­model一定是绑定在select标签上 总结一下:如果是单选,初始化最好给定字符串,因为v­model此时绑定的是静态字符串或者布尔值如果是多选,初始化最好给定一个数组 6.2 绑定值 单选按钮只需要用v­-bind给单个单选框绑定一个value值,此时,v­-model绑定的就是他的value值 复选框 下拉框在select标签上绑定value值对option并没有影响 6.3 修饰符 lazyv-model默认是在input输入时实时同步输入框的数据,而lazy修饰符,可以使其在失去焦点或者敲回车键之后在更新 number将输入 的字符串转化为number类型 trimtrim自动过滤输入过程中收尾输入的空格 七、 可复用性的组件详解 7.1 使用组件的原因 作用:提高代码的复用性 7.2 组件的使用方法 1. 全局注册 Vue.component('my-component',{ template:'<div>我是组件的内容</div>' }) 优点:所有的vue实例都可以用 缺点:权限太大,容错率降低 2. 局部注册 var app = new Vue({ el:'#app', components:{ 'my-component':{ template: '<div>我是组件的内容</div>' } } }) 3. vue组件的模板在某些情况下会受到html标签的限制,比如 <table> 中只能还有 <tr> , <td> 这些元素,所以直接在table中使用组件是无效的,此时可以使用is属性来挂载组件 <table> <tbody is="my-component"></tbody> </table> 7.3 组件使用的奇淫技巧 推荐使用小写字母加­-进行命名(必须) child, my-­componnet命名组件 template中的内容必须被一个DOM元素包括 ,也可以嵌套 在组件的定义中,除了template之外的其他选项---data,computed,methods data必须是一个方法 7.4 使用props传递数据 父亲向儿子传递数据 在组件中使用props来从父亲组件接收参数,注意,在props中定义的属性,都可以在组件中直接使用 props来自父级,而组件中data return的数据就是组件自己的数据,两种情况作用域就是组件本身,可以在template,computed,methods中直接使用 props的值有两种,一种是字符串数组,一种是对象 可以使用v-­bind动态绑定父组件来的内容 7.5 单向数据流 解释 : 通过 props 传递数据 是单向的了, 也就是父组件数据变化时会传递给子组件,但是反过来不行。 目的 :是尽可能将父子组件解稿,避免子组件无意中修改了父组件的状态。 应用场景: 业务中会经常遇到两种需要改变 props 的情况 一种是父组件传递初始值进来,子组件将它作为初始值保存起来,在自己的作用域下可以随意使用和修改。这种情况可以在组件 data 内再声明一个数据,引用父组件的 props步骤一:注册组件步骤二:将父组件的数据传递进来,并在子组件中用props接收步骤三:将传递进来的数据通过初始值保存起来 <div id="app"> <my-comp init-count="666"></my-comp> </div> <script> var app = new Vue({ el:'#app', components:{ 'my-comp':{ props:['init-count'], template:'<div>{{count}}</div>', data:function () { return{ count:this.initCount } } } } }) </script> 另一种情况就是 prop 作为需要被转变的原始值传入。这种情况用计算属性就可以了步骤一:注册组件步骤二:将父组件的数据传递进来,并在子组件中用props接收步骤三:将传递进来的数据通过计算属性进行重新计算 <body> <div id="data"> <input type="text" v-model="width"> <my-conponent :width="width"></my-conponent> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var app = new Vue({ el:'#data', data:{ width:'' }, components:{ 'my-conponent':{ props:['width'], template:'<div :style="style"></div>', computed:{ style:function(){ return{ width:this.width+'px', background:'red', height:'30px' } } } } } }) </script> </body> 7.6 数据验证 @ vue组件中camelCased (驼峰式) 命名与 kebab­case(短横线命名) @ 在html中, myMessage 和 mymessage 是一致的,,因此在组件中的html中使用必须使用kebab-­case(短横线)命名方式。在html中不允许使用驼峰!!!!!!@ 在组件中, 父组件给子组件传递数据必须用短横线。在template中,必须使用驼峰命名方式,若为短横线的命名方式。则会直接保错。@ 在组件的data中,用this.XXX引用时,只能是驼峰命名方式。若为短横线的命名方式,则会报错。 验证的 type 类型可以是: String Number Boolean Object Array Function Vue.component ( ’ my-compopent ’, { props : { //必须是数字类型 propA : Number , //必须是字符串或数字类型 propB : [String , Number] , //布尔值,如果没有定义,默认值就是 true propC: { type : Boolean , default : true }, //数字,而且是必传 propD: { type: Number , required : true }, //如果是数组或对象,默认值必须是一个函数来返回 propE: { type : Array , default : function () { return [] ; } }, //自定义一个验证函数 propF: { validator : function (value) { return value > 10; } } } }); 7.7 组件通信 组件关系可分为父子组件通信、兄弟组件通信、跨级组件通信 7.7.1 自定义事件—子组件给父组件传递数据 使用v-­on 除了监昕 DOM 事件外,还可以用于组件之间的自定义事件。JavaScript 的设计模式 一一观察者模式, dispatchEvent 和 addEventListener这两个方法。 Vue 组件也有与之类似的一套模式,子组件用$emit()来 触发事件 ,父组件用$on()来 监听子组件的事件。直接来代码 第一步:自定义事件 第二步: 在子组件中用$emit触发事件,第一个参数是事件名,后边的参数是要传递的数据 第三步:在自定义事件中用一个参数来接受 <body> <div id="app"> <p>您好,您现在的银行余额是{{total}}元</p> <btn-compnent @change="handleTotal"></btn-compnent> <!-- <button-component @change="money"></button-component> --> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: { total: 0 }, components: { 'btn-compnent': { template: '<div>\ <button @click="handleincrease">+10000</button> \ <button @click="handlereduce">-10000</button>\ </div>', data: function () { return { count: 0 } }, methods: { handleincrease: function () { this.count = this.count + 10000; this.$emit('change', this.count); }, handlereduce: function () { this.count = this.count - 10000; this.$emit('change', this.count); } } } }, methods: { handleTotal: function (total) { this.total = total; } } }) </script> </body> 7.7.2 在组件中使用v-­model $emit的代码,这行代码实际上会触发一个 input事件, ‘input’后的参数就是传递给v-­model绑定的属性的值 v-­model 其实是一个语法糖,这背后其实做了两个操作: v­-bind 绑定一个 value 属性 v­-on 指令给当前元素绑定 input 事件 要使用v-­model,要做到: 接收一个 value 属性。 在有新的 value 时触发 input 事件 <body> <div id="app"> <p>您好,您现在的银行余额是{{total}}元</p> <btn-compnent v-model="total"></btn-compnent> </div> <script src="http://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> //关于 var app = new Vue({ el: '#app', data: { total: 0 }, components: { 'btn-compnent': { template: '<div>\ <button @click="handleincrease">+1</button> \ <button @click="handlereduce">-1</button>\ </div>', data: function () { return { count: 0 } }, methods: { handleincrease: function () { this.count++; ----------------------注意观察.这一行,emit的是input事件---------------- this.$emit('input', this.count); }, handlereduce: function () { this.count--; this.$emit('input', this.count); } } } }, methods: { /* handleTotal:function (total) { this.total = total; }*/ } }) </script> </body> 7.7.3 非父组件之间的通信 官网描述:

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册