首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
104
篇与
的结果
2021-11-16
JS 常用方法集合
除数取整:1.只保留整数部分:parseInt(5/2) 2.向上取整,有小数就整数部分加1:Math.ceil(5/2) 3.四舍五入:Math.round(9/2) 4.向下取整:Math.floor(5/2)大小写:1.使字符串全部变为小写:toLowerCase() \ toLocaleLowerCase() 2.使全部字符变为大写:toUpperCase() \ toLocaleUpperCase()字符串相关1.返回指定索引的字符:charAt() 2.字符串拼接:concat() 3.取从第几位到指定长度的字符串:substr() var stringValue = "hello world"; console.log(stringValue.substr(3)); //"lo world" console.log(stringValue.substr(3,7)); //"lo worl" 4.取介于两个指定下标之间的字符串:substring() var stringValue = "hello world"; console.log(stringValue.substring(3)); //"lo world" console.log(stringValue.substring(3,7)); //"lo w" 5.返回一个新的数组,介于两个指定下标之间的字符串:slice() var stringValue = "hello world"; console.log(stringValue.slice(3)); //"lo world" console.log(stringValue.slice(3,7)); //"lo w" 6.返回子字符串的位置(没有找到返回-1):首次的位置:IndexOf、最后的位置:lastIndexOf var stringValue = "hello world"; console.log(stringValue.indexOf("o")); //4 console.log(stringValue.lastIndexOf("o")); //7 7. 删除头尾的空格:trim() 8.检索指定的值:match() var str1 = "lixiaoqi"; console.log(str1.match('iao')); //检索字符串,返回的是字符 console.log(str1.match('lll')); //没有指定的字符,返回的是null 9.返回指定的第一个匹配项的索引(未检测到返回-1):search() 10.替换现有字符串:.replace() 11.把字符串分割成字符串数组:split(分隔符)数组相关1. 返回从原数组中指定开始下标到结束下标之间的项组成的新数组(原数组不变):slice() var arr = [1,2,3,4,5,6,7,8]; console.log(arr.slice(4)); //从4开始到结束 [5, 6, 7, 8] console.log(arr.slice(2,6));//数组下表从0开始,从2开始,到6的前一个位置结束 [3, 4, 5, 6] 2.splice() 删除(2个参数,起始位置,删除的项数) 插入(3个参数,起始位置,删除的项数,插入的项) 替换(任意参数,起始位置,删除的项数,插入任意数量的项数) var arr = [1,2,3,4,5]; console.log(arr.slice(2,3)); // 实际得到的新数组的项数是end-strat [3] console.log(arr.slice(1,5)); // [2, 3, 4, 5] 3.将参数添加到数组的最后,返回新数组的长度:push() var arr = [1,2,3,4,5]; console.log(arr.push(6,7,8)); // 返回的是新数组的长度 8 4.删除数组的最后一个元素,返回被删除的值(减少数组的长度):pop() var arr = ['a', 'b', 'c', 'd', 'e']; console.log(arr.pop()); // e console.log(arr.length); // 4 5.向数组的开头添加一个或多个的元素,并返回新的长度:unshift() var arr = [1,2,3,4,5]; console.log(arr.unshift(2,4,5,{name:'liqi'})); //返回的是新数组的长度 9 6.删除数组的第一个参数,数组的长度减1:shift() var arr = ['a', 'b', 'c', 'd', 'e']; console.log(arr.shift()); // 返回的是删除的数组的值 a 7.按指定的参数对数组进行排序,返回的值是经过排序后的数组: sort() var arr = [1,'q',3,6,2,'a',9]; console.log(arr.sort()); // 返回的是排序后的数组 [1, 2, 3, 6, 9, "a", "q"] 8.将数组中的元素进行反转,倒序显示:reverse() var arr = [1,2,3,4,5] console.log(arr.reverse()); // [5, 4, 3, 2, 1] 9.把两个字符串连接起来,返回的值是一个副本:concat(a, b) var arr1 = [1,'q',3,6,2,'a',9]; console.log(arr1.concat('-', arr1)); //新创建一个数组,原数组不变 [1, "q", 3, 6, 2, "a", 9, "-", 1, "q", 3, 6, 2, "a", 9] console.log(arr1); //原数组不变 [1,'q',3,6,2,'a',9] 10.用分隔符将数组的元素组成一个字符串:join() var arr1 = [1,'q',3,6,2,'a',9]; console.log(arr1.join(',')); //以逗号分隔 1,q,3,6,2,a,9 console.log(arr1.join(' ')); //以空格分隔 1 q 3 6 2 a 9 11.从数组的开头向后查找,(接受两个参数,要查找的项和查找起点的位置索引):indexOf() var arr = [1,2,3,4,5,6,78]; console.log(arr.indexOf(78, 2)); // 查找78所在的位置,返回的项的索引 6 console.log(arr.indexOf(3, 1)); // 2 console.log(arr.indexOf(2)); // 1 12.从数组末尾开始获取:lastIndexof() 13.遍历数组:for var arr = [1, 4, 9, 16]; for (var i = 0; i < arr.length; i++){ console.log(arr[i]); } 14.对数组的每个元素执行一次提供的函数:foeEach() var arr = ['a', 'b', 'c']; arr.forEach(function(item) { console.log(item); // a // b // c }); 15.对数组的每一项运行给定的函数,返回没戏函数调用的结果组成的数组:map() var arr = [1, 4, 9, 16]; console.log(arr.map(x => x * 2)); //对数组的每项*2 [2, 8, 18, 32] 16.通过检查指定数组中符合条件的所有元素(不会改变原始数组):filter() var arr = [1,12,7,8,5] function fn(i) { return i > 5; } console.log(arr.filter(fn)); // [12, 7, 8] 17.把数组转换成字符串,每一项用,分割:toString() var arr = [1,2,3,4,5] console.log(arr.toString()); // 1,2,3,4,5 18.every和some every 是所有函数的每个回调都返回 true 的时候才会返回 true,当遇到 false 的时候终止执行,返回 false。 some 函数是存在有一个函数返回 true 的时候终止执行并返回 true,否则返回 false。 // every var arr = [1,6,8,-2,-5,7,-4] var isPositive = arr.every(function(value){ return value > 0; }) console.log(isPositive) // false //some var arr = [1,6,8,-2,-5,7,-4] var isPositive = arr.some(function(value){ return value > 0; }) console.log(isPositive) // true 19.reduce(function(v1,v2),value) 和 reduceRight(functio(v1,v2),value) 遍历数组,调用回调函数,将数组元素组合成一个值,reduce 从索引最小值开始,reduceRight 反向,方法有两个参数(回调函数,把两个值合成一个,返回结果;value,一个初始值,可选) var arr = [1,2,3,4,5,6] console.log(arr.reduce(function(v1,v2){ return v1 + v2; })) // 21 //开始是1+2 = 3,之后3+3 =6,之后6+4 =10,之后 //10+5 =15,最后15+6 =21 console.log(arr.reduce(function(v1,v2){ return v1 - v2; },100)) // 79 //开始的时候100-1=99,之后99-2=97,之后97-3=94,之后 //94-4=90,之后90-5=85,最后85-6=79 20.判断一个对象是否为数组:isArray() var arr = [3,4,5] console.log(Array.isArray(arr)); // trueMathMath本身就是一个对象, 不需要在通过构造函数去创建, 该对象中集合了很多关于数学运算的方法 Math.abs() 获取一个对象的绝对值 Math.round() 四舍五入 Math.PI π Math.max() 求几个数的最大数 Math.min() 求几个数的最小数 Math.ceil() 向上取整 Math.floor() 向下取整 Math.random() 随机数 (随机生成0 ~1之间的数)JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1、通过ID选取元素 document.getElementById('myid'); 2、通过CLASS选取元素 document.getElementsByClassName('myclass')[0]; 3、通过标签选取元素 document.getElementsByTagName('mydiv')[0]; 4、通过NAME属性选取元素(常用于表单) document.getElementsByName('myname')[0]; JS修改CSS样式 document.getElementById('myid').style.display = 'none'; JS修改CLASS属性 document.getElementById('myid').className = 'active'; 如果有多个CLASS属性,即用空格隔开 document.getElementById('myid').className = 'active div-1'; 移除该元素上的所有CLASS document.getElementById('myid').className = ''; 注意:使用classList会优于使用className 复制代码 document.getElementById('myid').classList.item(0); //item为类名的索引 document.getElementById('myid').classList.length; //只读属性 document.getElementById('myid').classList.add('newClass'); //添加class document.getElementById('myid').classList.remove('newClass'); //移除class document.getElementById('myid').classList.toggle('newClass'); //切换,有则移除,没有则添加 document.getElementById('myid').classList.contains('newClass'); //判断是否存在该class补充:add和remove方法不允许链式操作,因为返回的都是undefined,其次,也不允许同时添加或删除多个class,可以自行扩展一下JS修改文本document.getElementById('myid').innerHTML = '123'; JS创建元素并向其中追加文本 var newdiv = document.createElement('div'); var newtext = document.createTextNode('123'); newdiv.appendChild(newtext); document.body.appendChild(newdiv); 同理:removeChild()移除节点,并返回节点 cloneNode() 复制节点 insertBefore() 插入节点(父节点内容的最前面)注意:insertBefore() 有两个参数,第一个是插入的节点,第二个是插入的位置追加元素的几种方法:1.在父级最前面追加一个子元素:prepend() $('#page ul').prepend('<li id="prevPage">上一页</li>'); 2.在父级最后面追加一个子元素:append() $('#page ul').append('<li id="nextPage">下一页</li>'); 3.将子元素追加到父级的最前面:prependTo() $("<li id="prevPage">上一页</li>").prependTo($("#page ul")); 4.将子元素追加到父级的最后:appendTo() $("<li id="nextPage">下一页</li>").appendTo($("#page ul")); 5.在当前元素之前追加(是同级关系):before() $("#wrap").before("<p class='siblings'>我是同级元素before</p>"); 6.在当前元素之后追加(是同级关系):after() $("#wrap").after("<p class='siblings'>我是同级元素after</p>"); 7.将元素追加到指定对象的前面(是同级关系):insertBefore() $("<p class='three'>我是同级元素insertBefore</p>").insertBefore($("#wrap")); 8.将元素追加到指定对象的后面(是同级关系):insertAfter() $("<p class='three'>我是同级元素insertAfter</p>").insertAfter($("#wrap")); 9.在节点的最后追加子元素:appendChild() // 创建script标签 var script = document.createElement('script'); // 设置src属性 script.src = 'http://localhost:3001/better?callback=fn2'; // 将script标签追加到页面中 document.body.appendChild(script); // 或者 // 创建p节点 var para = document.createElement("p"); // 创建文本节点 var node = document.createTextNode("我是子集appendChild新段落。"); // 把文本节点添加到p节点里 para.appendChild(node); // 查找div var element = document.getElementById("wrap"); // 把p节点添加到div1里 element.appendChild(para); JS返回所有子节点对象 childNodes firstChild 返回第一个子节点 lastChild 返回最后一个子节点 parentNode 返回父节点对象 nextSibling 返回下一个兄弟节点对象 previousSibling 返回前一个兄弟节点对象 nodeName 返回节点的HTML标记名称 var mylist = document.getElementById('myid'); for(var i=0,i<mylist.childNodes.length;i++){ console.log(mylist.childNodes[i]); }常用的封装好的方法:1、n-m之间的随机数 function numRandom(n, m) { if (n > m) { return parseInt(m + Math.random() * (n - m + 1)); } else { return parseInt(n + Math.random() * (m - n + 1)); } } 2、时间过滤器 yyyy-mm-dd hh:mm:ss filters = (data) =>{ var time = new Date(data); var timeStr = time.getFullYear()+"-"+ (time.getMonth()+1).toString().padStart(2,"0")+"-"+ time.getDate().toString().padStart(2,"0")+ " "+ time.getHours().toString().padStart(2,"0")+":"+ time.getMinutes().toString().padStart(2,"0")+":"+ time.getSeconds().toString().padStart(2,"0"); return timeStr; } function formatDate(date) { var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); var hour = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); // return year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second; return year + '-' + (String(month).length > 1 ? month : '0' + month) + '-' + (String(day).length > 1 ? day : '0' + day) + ' ' + (String(hour).length > 1 ? hour : '0' + hour) + ':' + (String(minute).length > 1 ? minute : '0' + minute) + ':' + (String(second).length > 1 ? second : '0' + second) } //如果记得时间戳是毫秒级的就需要*1000 不然就错了记得转换成整型 var d = new Date(); //Tue Mar 26 2019 05:00:00 GMT+0800 (中国标准时间) console.log(formatDate(d)) //2019-03-26 05:00:00 3、返回顶部通用方法 function backTop(btnId) { var btn = document.getElementById(btnId); var d = document.documentElement; var b = document.body; window.onscroll = set; btn.style.display = "none"; btn.onclick = function () { btn.style.display = "none"; window.onscroll = null; this.timer = setInterval(function () { d.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1); b.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1); if (d.scrollTop + b.scrollTop == 0) clearInterval(btn.timer, (window.onscroll = set)); }, 10); }; function set() { btn.style.display = d.scrollTop + b.scrollTop > 100 ? "block" : "none"; } } backTop("goTop");对象Object构造方法Object.assign()将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。 Object.create()用指定的原型对象和属性创建一个新对象。 Object.defineProperty()将给定描述符描述的命名属性添加到对象。 Object.defineProperties()将给定描述符描述的命名属性添加到对象。 Object.entries()返回一个包含[key, value]给定对象自己的可枚举字符串属性的所有对的数组。 Object.freeze()冻结对象。其他代码无法删除或更改其属性。 Object.fromEntries()从可迭代的[key, value]对中返回一个新对象。(这是的反向 Object.entries)。 Object.getOwnPropertyDescriptor()返回对象的命名属性的属性描述符。 Object.getOwnPropertyDescriptors()返回一个包含对象自身所有属性描述符的对象。 Object.getOwnPropertyNames()返回一个数组,其中包含给定对象自己的所有可枚举和不可枚举属性的名称。 Object.getOwnPropertySymbols()返回直接在给定对象上找到的所有符号属性的数组。 Object.getPrototypeOf()返回prototype指定对象的。 Object.is()比较两个值是否相同。求所有NaN值(不同于“抽象相等比较”和“严格相等比较”)。 Object.isExtensible()确定是否允许扩展对象。 Object.isFrozen()确定对象是否冻结。 Object.isSealed()确定对象是否密封。 Object.keys()返回一个数组,其中包含给定对象自己的所有可枚举字符串属性的名称。 Object.preventExtensions()防止对象的任何扩展。 Object.seal()防止其他代码删除对象的属性。 Object.setPrototypeOf()设置对象的原型(其内部[[Prototype]]属性)。 Object.values()返回一个数组,该数组包含与给定对象自己的所有可枚举字符串属性相对应的值。更改数组对象中属性的参数名: let data1 = [ { appName: "应用1", capacity: 233456 }, { title: "应用2", key: 124535 } ]; let data2 = []; data1.forEach(item => { data2.push({ name: item.appName || item.title, value: item.capacity || item.key }); }); console.log(data2)
2021年11月16日
7 阅读
2 评论
0 点赞
2021-11-11
Vue基础(1)
Vue 是什么?Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合使用Vue将helloworld 渲染到页面上指令本质就是自定义属性Vue中指定都是以 v- 开头v-cloak防止页面加载时出现闪烁问题 <style type="text/css"> /* 1、通过属性选择器 选择到 带有属性 v-cloak的标签 让他隐藏 */ [v-cloak]{ /* 元素隐藏 */ display: none; } </style> <body> <div id="app"> <!-- 2、 让带有插值 语法的 添加 v-cloak 属性 在 数据渲染完场之后,v-cloak 属性会被自动去除, v-cloak一旦移除也就是没有这个属性了 属性选择器就选择不到该标签 也就是对应的标签会变为可见 --> <div v-cloak >{{msg}}</div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ // el 指定元素 id 是 app 的元素 el: '#app', // data 里面存储的是数据 data: { msg: 'Hello Vue' } }); </script> </body> </html>v-textv-text指令用于将数据填充到标签中,作用于插值表达式类似,但是没有闪动问题如果数据中有HTML标签会将html标签一并输出注意:此处为单向绑定,数据对象上的值改变,插值会发生变化;但是当插值发生变化并不会影响数据对象的值<div id="app"> <!-- 注意:在指令中不要写插值语法 直接写对应的变量名称 在 v-text 中 赋值的时候不要在写 插值语法 一般属性中不加 {{}} 直接写 对应 的数据名 --> <p v-text="msg"></p> <p> <!-- Vue 中只有在标签的 内容中 才用插值语法 --> {{msg}} </p> </div> <script> new Vue({ el: '#app', data: { msg: 'Hello Vue.js' } }); </script>v-html用法和v-text 相似 但是他可以将HTML片段填充到标签中可能有安全问题, 一般只在可信任内容上使用 v-html,永不用在用户提交的内容上它与v-text区别在于v-text输出的是纯文本,浏览器不会对其再进行html解析,但v-html会将其当html标签解析后输出。<div id="app"> <p v-html="html"></p> <!-- 输出:html标签在渲染的时候被解析 --> <p>{{message}}</p> <!-- 输出:<span>通过双括号绑定</span> --> <p v-text="text"></p> <!-- 输出:<span>html标签在渲染的时候被源码输出</span> --> </div> <script> let app = new Vue({ el: "#app", data: { message: "<span>通过双括号绑定</span>", html: "<span>html标签在渲染的时候被解析</span>", text: "<span>html标签在渲染的时候被源码输出</span>", } }); </script>v-pre显示原始信息跳过编译过程跳过这个元素和它的子元素的编译过程。一些静态的内容不需要编译加这个指令可以加快渲染 <span v-pre>{{ this will not be compiled }}</span> <!-- 显示的是{{ this will not be compiled }} --> <span v-pre>{{msg}}</span> <!-- 即使data里面定义了msg这里仍然是显示的{{msg}} --> <script> new Vue({ el: '#app', data: { msg: 'Hello Vue.js' } }); </script>v-once执行一次性的插值【当数据改变时,插值处的内容不会继续更新】 <!-- 即使data里面定义了msg 后期我们修改了 仍然显示的是第一次data里面存储的数据即 Hello Vue.js --> <span v-once>{{ msg}}</span> <script> new Vue({ el: '#app', data: { msg: 'Hello Vue.js' } }); </script>双向数据绑定当数据发生变化的时候,视图也就发生变化当视图发生变化的时候,数据也会跟着同步变化v-modelv-model是一个指令,限制在 <input>、<select>、<textarea>、components中使用 <div id="app"> <div>{{msg}}</div> <div> 当输入框中内容改变的时候, 页面上的msg 会自动更新 <input type="text" v-model='msg'> </div> </div>mvvmMVC 是后端的分层开发概念; MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModelm model数据层 Vue 中 数据层 都放在 data 里面v view 视图Vue 中 view 即 我们的HTML页面vm (view-model) 控制器 将数据和视图层建立联系vm 即 Vue 的实例 就是 vmv-on用来绑定事件的形式如:v-on:click 缩写为 @click;v-on事件函数中传入参数 <body> <div id="app"> <div>{{num}}</div> <div> <!-- 如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数 --> <button v-on:click='handle1'>点击1</button> <!-- 2、如果事件绑定函数调用,那么事件对象必须作为最后一个参数显示传递, 并且事件对象的名称必须是$event --> <button v-on:click='handle2(123, 456, $event)'>点击2</button> </div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { num: 0 }, methods: { handle1: function(event) { console.log(event.target.innerHTML) }, handle2: function(p, p1, event) { console.log(p, p1) console.log(event.target.innerHTML) this.num++; } } }); </script>事件修饰符在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。Vue 不推荐我们操作DOM 为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符修饰符是由点开头的指令后缀来表示的<!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 即阻止冒泡也阻止默认事件 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div> 使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。按键修饰符在做项目中有时会用到键盘事件,在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on 在监听键盘事件时添加按键修饰符<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` --> <input v-on:keyup.13="submit"> <!-- -当点击enter 时调用 `vm.submit()` --> <input v-on:keyup.enter="submit"> <!--当点击enter或者space时 时调用 `vm.alertMe()` --> <input type="text" v-on:keyup.enter.space="alertMe" > 常用的按键修饰符 .enter => enter键 .tab => tab键 .delete (捕获“删除”和“退格”按键) => 删除键 .esc => 取消键 .space => 空格键 .up => 上 .down => 下 .left => 左 .right => 右 <script> var vm = new Vue({ el:"#app", methods: { submit:function(){}, alertMe:function(){}, } }) </script>自定义按键修饰符别名在Vue中可以通过config.keyCodes自定义按键修饰符别名<div id="app"> 预先定义了keycode 116(即F5)的别名为f5,因此在文字输入框中按下F5,会触发prompt方法 <input type="text" v-on:keydown.f5="prompt()"> </div> <script> Vue.config.keyCodes.f5 = 116; let app = new Vue({ el: '#app', methods: { prompt: function() { alert('我是 F5!'); } } }); </script>v-bindv-bind 指令被用来响应地更新 HTML 属性v-bind:href 可以缩写为 :href;<!-- 绑定一个属性 --> <img v-bind:src="imageSrc"> <!-- 缩写 --> <img :src="imageSrc">绑定对象我们可以给v-bind:class 一个对象,以动态地切换class。注意:v-bind:class指令可以与普通的class特性共存1、 v-bind 中支持绑定一个对象 如果绑定的是一个对象 则 键为 对应的类名 值 为对应data中的数据 <!-- HTML最终渲染为 <ul class="box textColor textSize"></ul> 注意: textColor,textSize 对应的渲染到页面上的CSS类名 isColor,isSize 对应vue data中的数据 如果为true 则对应的类名 渲染到页面上 当 isColor 和 isSize 变化时,class列表将相应的更新, 例如,将isSize改成false, class列表将变为 <ul class="box textColor"></ul> --> <ul class="box" v-bind:class="{textColor:isColor, textSize:isSize}"> <li>学习Vue</li> <li>学习Node</li> <li>学习React</li> </ul> <div v-bind:style="{color:activeColor,fontSize:activeSize}">对象语法</div> <sript> var vm= new Vue({ el:'.box', data:{ isColor:true, isSize:true, activeColor:"red", activeSize:"25px", } }) </sript> <style> .box{ border:1px dashed #f0f; } .textColor{ color:#f00; background-color:#eef; } .textSize{ font-size:30px; font-weight:bold; } </style>绑定class2、 v-bind 中支持绑定一个数组 数组中classA和 classB 对应为data中的数据 这里的classA 对用data 中的 classA 这里的classB 对用data 中的 classB <ul class="box" :class="[classA, classB]"> <li>学习Vue</li> <li>学习Node</li> <li>学习React</li> </ul> <script> var vm= new Vue({ el:'.box', data:{ classA:‘textColor‘, classB:‘textSize‘ } }) </script> <style> .box{ border:1px dashed #f0f; } .textColor{ color:#f00; background-color:#eef; } .textSize{ font-size:30px; font-weight:bold; } </style>绑定对象和绑定数组 的区别绑定对象的时候 对象的属性 即要渲染的类名 对象的属性值对应的是 data 中的数据绑定数组的时候数组里面存的是data 中的数据绑定style <div v-bind:style="styleObject">绑定样式对象</div>' <!-- CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用单引号括起来) --> <div v-bind:style="{ color: activeColor, fontSize: fontSize,background:'red' }">内联样式</div> <!--组语法可以将多个样式对象应用到同一个元素 --> <div v-bind:style="[styleObj1, styleObj2]"></div> <script> new Vue({ el: '#app', data: { styleObject: { color: 'green', fontSize: '30px', background:'red' }, activeColor: 'green', fontSize: "30px" }, styleObj1: { color: 'red' }, styleObj2: { fontSize: '30px' } </script>分支结构v-if 使用场景1- 多个元素 通过条件判断展示或者隐藏某个元素。或者多个元素2- 进行两个视图之间的切换<div id="app"> <!-- 判断是否加载,如果为真,就加载,否则不加载--> <span v-if="flag"> 如果flag为true则显示,false不显示! </span> </div> <script> var vm = new Vue({ el:"#app", data:{ flag:true } }) </script> ---------------------------------------------------------- <div v-if="type === 'A'"> A </div> <!-- v-else-if紧跟在v-if或v-else-if之后 表示v-if条件不成立时执行--> <div v-else-if="type === 'B'"> B </div> <div v-else-if="type === 'C'"> C </div> <!-- v-else紧跟在v-if或v-else-if之后--> <div v-else> Not A/B/C </div> <script> new Vue({ el: '#app', data: { type: 'C' } }) </script>v-show 和 v-if的区别v-show本质就是标签display设置为none,控制隐藏v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,故v-show性能更好一点。v-if是动态的向DOM树内添加或者删除DOM元素v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件循环结构v-for用于循环的数组里面的值可以是对象,也可以是普通元素<ul id="example-1"> <!-- 循环结构-遍历数组 item 是我们自己定义的一个名字 代表数组里面的每一项 items对应的是 data中的数组--> <li v-for="item in items"> {{ item.message }} </li> </ul> <script> new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ], } }) </script>不推荐同时使用 v-if 和 v-for当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。 <!-- 循环结构-遍历对象 v 代表 对象的value k 代表对象的 键 i 代表索引 ---> <div v-if='v==13' v-for='(v,k,i) in obj'>{{v + '---' + k + '---' + i}}</div> <script> new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ], obj: { uname: 'zhangsan', age: 13, gender: 'female' } } }) </script>key 的作用key来给每个节点做一个唯一标识key的作用主要是为了高效的更新虚拟DOM<ul> <li v-for="item in items" :key="item.id">...</li> </ul> 案例选项卡1、 HTML 结构` <div id="app"> <div class="tab"> <!-- tab栏 --> <ul> <li class="active">apple</li> <li class="">orange</li> <li class="">lemon</li> </ul> <!-- 对应显示的图片 --> <div class="current"><img src="img/apple.png"></div> <div class=""><img src="img/orange.png"></div> <div class=""><img src="img/lemon.png"></div> </div> </div> `2、 提供的数据 list: [{ id: 1, title: 'apple', path: 'img/apple.png' }, { id: 2, title: 'orange', path: 'img/orange.png' }, { id: 3, title: 'lemon', path: 'img/lemon.png' }]3、 把数据渲染到页面把tab栏 中的数替换到页面上把 data 中 title 利用 v-for 循环渲染到页面上把 data 中 path利用 v-for 循环渲染到页面上 <div id="app"> <div class="tab"> <ul> <!-- 1、绑定key的作用 提高Vue的性能 2、 key 需要是唯一的标识 所以需要使用id, 也可以使用index , index 也是唯一的 3、 item 是 数组中对应的每一项 4、 index 是 每一项的 索引 --> <li :key='item.id' v-for='(item,index) in list'>{{item.title}}</li> </ul> <div :key='item.id' v-for='(item, index) in list'> <!-- : 是 v-bind 的简写 绑定属性使用 v-bind --> <img :src="item.path"> </div> </div> </div> <script> new Vue({ // 指定 操作元素 是 id 为app 的 el: '#app', data: { list: [{ id: 1, title: 'apple', path: 'img/apple.png' }, { id: 2, title: 'orange', path: 'img/orange.png' }, { id: 3, title: 'lemon', path: 'img/lemon.png' }] } }) </script>4、 给每一个tab栏添加事件,并让选中的高亮4.1 、让默认的第一项tab栏高亮tab栏高亮 通过添加类名active 来实现 (CSS active 的样式已经提前写好)在data 中定义一个 默认的 索引 currentIndex 为 0给第一个li 添加 active 的类名通过动态绑定class 来实现 第一个li 的索引为 0 和 currentIndex 的值刚好相等currentIndex === index 如果相等 则添加类名 active 否则 添加 空类名4.2 、让默认的第一项tab栏对应的div 显示实现思路 和 第一个 tab 实现思路一样 只不过 这里控制第一个div 显示的类名是 current <ul> <!-- 动态绑定class 有 active 类名高亮 无 active 不高亮--> <li :class='currentIndex==index?"active":""' :key='item.id' v-for='(item,index) in list' >{{item.title}}</li> </ul> <!-- 动态绑定class 有 current 类名显示 无 current 隐藏--> <div :class='currentIndex==index?"current":""' :key='item.id' v-for='(item, index) in list'> <!-- : 是 v-bind 的简写 绑定属性使用 v-bind --> <img :src="item.path"> </div> <script> new Vue({ el: '#app', data: { currentIndex: 0, // 选项卡当前的索引 默认为 0 list: [{ id: 1, title: 'apple', path: 'img/apple.png' }, { id: 2, title: 'orange', path: 'img/orange.png' }, { id: 3, title: 'lemon', path: 'img/lemon.png' }] } }) </script>4.3 、点击每一个tab栏 当前的高亮 其他的取消高亮给每一个li添加点击事件让当前的索引 index 和 当前 currentIndex 的 值 进项比较如果相等 则当前li 添加active 类名 当前的 li 高亮 当前对应索引的 div 添加 current 当前div 显示 其他隐藏 <div id="app"> <div class="tab"> <ul> <!-- 通过v-on 添加点击事件 需要把当前li 的索引传过去 --> <li v-on:click='change(index)' :class='currentIndex==index?"active":""' :key='item.id' v-for='(item,index) in list'>{{item.title}}</li> </ul> <div :class='currentIndex==index?"current":""' :key='item.id' v-for='(item, index) in list'> <img :src="item.path"> </div> </div> </div> <script> new Vue({ el: '#app', data: { currentIndex: 0, // 选项卡当前的索引 默认为 0 list: [{ id: 1, title: 'apple', path: 'img/apple.png' }, { id: 2, title: 'orange', path: 'img/orange.png' }, { id: 3, title: 'lemon', path: 'img/lemon.png' }] }, methods: { change: function(index) { // 通过传入过来的索引来让当前的 currentIndex 和点击的index 值 相等 // 从而实现 控制类名 this.currentIndex = index; } } }) </script>
2021年11月11日
5 阅读
0 评论
0 点赞
2021-10-11
模板引擎
1. 模板引擎文档:http://aui.github.io/art-template/zh-cn/Github: https://github.com/aui/art-template1.1 Ajax 项目中存在的问题数据和HTML字符串拼接导致代码混乱,拼接容易出错,增加修改难度。业务逻辑和用户界面混合,代码不易维护。for (var i = 0; i < result.length; i++) { html += '<!DOCTYPE html>\ <html lang="en">\ <head>\ <meta charset="UTF-8">\ <title>'+ title +'</title>\ </head>\ <body>\ <h1 onclick="sayHi('+name+')">你好,'+name+' 我今年 '+age+'岁</h1>\ <ul>\ <li title="'+hobbies[0]+'">'+hobbies[0]+'</li>\ </ul>\ </body>\ </html>'; }1.2 模板引擎的作用使用模板引擎提供的模板语法可以使数据和HTML字符串拼接的更加美观,代码易于维护。模板引擎能够使用户界面的数据拼接和JavaScript业务逻辑分离,增加程序的可扩展性。使用模板引擎可以提高开发效率。<h1>你好, {{name}}, 我今年{{age}}岁</h1> <ul> {{each}} <li>{{$value.hobbies}}</li> {{/each}} </ul>1.3 模板渲染<script src="./js/template-web.js"></script> <script type="text/html" id="tpl"> <div> <span>{{name}}</span> <span>{{age}}</span> </div> </script> // 将特定模板与特定数据进行拼接 const html = template('tpl',{ name: '张三', age: 20 }); 2. 模板语法模板语法的作用是告诉模板引擎数据和模板要如何进行拼接。2.1 输出将数据显示在模板中。 <h2>{{value}}</h2> <h2>{{a ? b : c}}</h2> <h2>{{a + b}}</h2>2.2 原文输出如果数据中携带HTML标签,默认情况下,模板引擎不会解析标签,会将其转义后原文输出。<h2>{{@ value }}</h2>2.3 条件判断 {{if 条件}} ... {{/if}} {{if v1}} ... {{else if v2}} ... {{/if}}{{if 条件}} <div>条件成立 显示我</div> {{else}} <div>条件不成立 显示我</div> {{/if}}2.4 循环 {{each target}} {{$index}} {{$value}} {{/each}}2.5 导入模板变量<div>$imports.dataFormat(time)</div>template.defaults.imports.变量名 = 变量值; $imports.变量名称function dateFormat(未格式化的原始时间){ return '已经格式化好的当前时间' } template.defaults.imports.dateFormat = dateFormat;总结<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1. 将模板引擎的库文件引入到当前页面 --> <script src="/js/template-web.js"></script> </head> <body> <div id="container"></div> <!-- 2.准备art-template模板 --> <script type="text/html" id="tpl"> <h1>{{username}} {{age}}</h1> </script> <script type="text/javascript"> // 3.告诉模板引擎将那个数据和哪个模板进行拼接 // 1) 模板id 2)数据 对象类型 // 方法的返回值就是拼接好的html字符串 var html = template('tpl', {username: 'zhangsan', age: 30}); document.getElementById('container').innerHTML = html; </script> </body> </html>
2021年10月11日
5 阅读
0 评论
0 点赞
1
...
20
21
22
...
35