文章推荐

JS中的遮蔽效应
一:遮蔽效应是什么 在多层的嵌套作用域中可以定义同名的标识符,作用域查找会向上查找,找到第一个匹配的标识符时停止 抛开遮蔽效应,作用域的查找始终是从运行的最内部作用域开始,逐级向外或者说向上进行,直到遇见第一个匹配标识符为止 说白一点,就是内部的标识符遮蔽住了外部的标识符 例子一 var val='global' function bar(){ console.log(val) //undefined var val='inner txt' console.log(val) // inner txt } bar() console.log(val) // global 例子二 var val='global' function bar(){ console.log(val) // global } function foo(){ var val='inner txt2' bar() console.log(val) //inner txt2 } foo() console.log(val) // global<br/> 例子一val值为undefined? 这里会涉及到变量提升,在块级作用域中,变量会提升到顶部,声明而未赋值 例子二val为啥为全局值? 作用域的查找是,不管函数在哪个作用域中执行,而查找看的是定义时的作用域,虽然在foo内部执行,但是作用域跟foo是平行块的关系,说白了就是看函数定义时所在位置,而不是调用时
adminJavascript2022-07-24

如何实现页面刷新后不定位到之前的滚动位置
一、浏览器默认行为 无论是哪个浏览器,都有这样一个体验细节。 那就是,如果浏览器不是强制刷新(Ctrl + F5),而是普通刷新(点击刷新按钮,或者按下 F5 刷新),则页面重新载入完毕后大概率会调到之前访问的位置。 大多数时候,这种体验对用户是友好的。 但是,实际开发中,我们总会存在不希望用户刷新记住之前滚动位置的情况。 这个时候该怎么办呢? 曾几何时,我是在页面 load 完毕之后,在足够安全的时间之后设置页面的 scrollTop 为 0。 二、history.scrollRestoration 使用很简单,在页面的任意位置执行下面几行 JS 代码就可以了 if (history.scrollRestoration) { history.scrollRestoration = 'manual'; } 三、语法和兼容性 history.scrollRestoration 支持下面两个属性值: auto 默认值,表示滚动位置会被存储。 manual单词的意思就是手动。表示,滚动的位置不会被存储。 兼容性 兼容性很不错,现代浏览器很早就支持了,移动端放心使用(IE不支持)
adminJavascript2022-07-23

vue中filters过滤器中不能使用this的解决方案
vue中的过滤器更偏向于对文本数据的转化,而不能依赖this上下文,如果需要使用到上下文this我们应该使用computed计算属性的或者一个method方法 <template> <div id="app"> {{ a | dealSum}} </div> </template> <script> export default { name: 'App', data() { return { a: 10, b: 20 } }, filters:{ dealSum(val){ console.log(val) //10 console.log(this) //undefined } } } </script> 解决方案一:我们可以在data中定义that=this,通过过滤器传入进去 ,就可以获取到this对象以及参数了 <div id="app"> {{ a | dealSum(that)}} </div> data() { return { that:this, a: 10, b: 20 } }, filters:{ dealSum(val,that){ console.log(val) //10 console.log(that.a) //10 return val+that.b } } } 解决方案二:采用computed计算属性 <div id="app"> {{ dealSum}} </div> computed:{ dealSum(){ return this.a+this.b } } 解决方案三:采用method函数方式实现 <div id="app"> {{ dealSum()}} </div> methods:{ dealSum(){ return this.a+this.b } }
adminVue2022-07-21

css 文本超出2行就隐藏并且显示省略号
在实际开发过程中,总是会遇到显示省略号的需求 主要是采用overflow、text-overflow、white-space 主要用到来实现超过1行实现省略号,并且单行兼容ie overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出不换行 多行的话css3则采用弹性伸缩,内核原因,不支持ie display:-webkit-box; //将对象作为弹性伸缩盒子模型显示。 -webkit-box-orient:vertical; //从上到下垂直排列子元素(设置伸缩盒子的子元素排列方式) -webkit-line-clamp:2; //这个属性不是css的规范属性,需要组合上面两个属性,表示显示的行数。 -webkit-line-clamp 超过两行就出现省略号 -webkit-line-clamp 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中 display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; 最后,集成代码为 overflow:hidden;  text-overflow:ellipsis; display:-webkit-box;  -webkit-box-orient:vertical; -webkit-line-clamp:2;  说明: 如果项目中使用了less -webkit-line-clamp: 2 //无效
adminCSS2022-08-08

CSS 去除两个span之间的默认间距
在实际开发中,会遇到两个span标签横向排列时,会有几个px间隔,如图所示 a <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> span{ display: inline-block; width: 100px; height: 30px; line-height: 30px; text-align: center; } span:first-child{ background: lightblue; } span:last-child{ background: salmon; } </style> </head> <body> <div> <span>1</span> <span>2</span> </div> </body> </html> 但是我们代码块没有编写间距。每个span元素间都会存在默认的空格,大楷4像素样子 第一种解决方案,将父元素font-size为0px,子元素重新设置字体可以解决 <style> div{ font-size: 0; } span{ font-size: 14px; display: inline-block; width: 100px; height: 30px; line-height: 30px; text-align: center; } span:first-child{ background: lightblue; } span:last-child{ background: salmon; } </style> a 第二种方案 采取移除掉掉text 空格方案 document.querySelector("div").childNodes.forEach(item=>{ if(item.nodeName=='#text'){item.remove()} })
hpCSS2022-08-08

js中常见判断空对象的几种方法
在实际开发中,常用到对象,难免会判断空对象的情况,今天,整理一下常用的方式 第一种方式:JSON.stringify方式,判断字符串 let obj={a:1} let obj1={} console.log(JSON.stringify(obj)=='{}') console.log(JSON.stringify(obj1)=='{}') a 第二种方式:jquery中的封装方法$.isEmptyObject let obj={a:1} let obj1={} console.log($.isEmptyObject(obj)) console.log($.isEmptyObject(obj1)) a 第三种方式:Object.getOwnPropertyNames方式,转化成数组对象key,根据长度判断 let obj={a:1} let obj1={} console.log(Object.getOwnPropertyNames(obj)) console.log(Object.getOwnPropertyNames(obj1).length==0) a 第四种方式:采用ES6中Object.keys ,转化成数组对象key,根据长度判断 let obj={a:1} let obj1={} console.log(Object.keys(obj)) console.log(Object.keys(obj1).length==0) a 第五种方式:采用for in方式 根据循环内是否进入判断 let obj={a:1} let obj1={} let num=0 for(let val in obj){ num=1 } if(num!=1){ console.log('是空对象') }else{ console.log('不是空对象') }
hpJavascript2022-08-09

vue中的混入mixin
在实际开发中,部分数据,方法会被重复性使用,那么,我们就需要进行混入,官方提供两种方式,全局混入和局部混入, mixins它就是一个对象,这个对象里面可以包含Vue组件中的一些常见配置,如data、methods、created等等 今天,我们整理下vue2中混入和vue3中的混入方式 一:vue2版本 局部方式,通过mixins属性实现 export const mixins = { data() { return { msg: "我是小白", }; }, computed: {}, methods: { clickMe() { console.log("我是mixin中的点击事件"); }, }, }; import { mixins } from "./mixin/index"; mixins: [mixins], 全局方式,直接挂载在原型上,(会影响每个单独创建的 Vue 实例 (包括第三方组件)) import { mixins } from "./mixin/index"; Vue.mixin(mixins); 二:vue3版本,采用函数式编程,用js方式写 export default function getHomeMixin(source: string) { let name = ref<string>('小白'); const componentName = source const handleChangeName = (transmitName: string) => { name.value = transmitName } return { name, componentName, handleChangeName } } <script setup lang="ts"> import getHomeMixin from './homeMixin' const Mixin = getHomeMixin('我是A组件传的值'); </script> 三:优缺点 1:优点 A:提高代码复用性 B:无需传递状态 C:维护方便 2:缺点 A:命名冲突 B:滥用会导致维护困难 C:追溯源、排查问题麻烦 D:不能轻易重复代码 四:注意点 1:mixins 中的data数据与组件中的data数据冲突时,组件中的data数据会覆盖mixin中数据 2:默认合并策略下,先执行mixin中生命周期函数中的代码,再执行组件内部的代码(钩子函数不会覆盖,但是methods会覆盖)
hpVue2022-08-10

vue中的$attrs和$listeners
在使用vue框架中,经常会用到父子孙等多层次组件传参,如果采用props一层一层接收,就过于繁琐,官方提供$attrs和 $listeners来进行跨组件传参和方法处理 vue2版本 $attrs 主要是将父组件传过来的数据进行收集 ,如果props里面做了接收,那么$attrs则只收集没有接收的参数 inheritAttrs: false/ture,这个主要是是否将传递的参数显示在dom节点属性上 ,只会显示props没有接收的参数,如果props接收过的,则不在显示到节点 true:默认的显示 inheritAttrs: true, a false :则不显示 inheritAttrs: false, a <template> <div id="app"> <div>vue2</div> <father :info=info :info2=info2 v-on:eventOne="methodOne" ></father> <button @click="modityInfo()">修改info值</button> <button @click="modityInfo2()">修改info2值</button> </div> </template> <script> import father from './components/father.vue' export default { name: 'App', data(){ return{ info:{ name:'张三', id:1             }, info2:{ name:'李四', id:2             }         }     }, components:{ father     }, 我们从祖组件传递两个props对象 info 和info2 <template> <div> <p>Father组件</p> <son v-bind="$attrs" v-on="$listeners" ></son> <button @click="sendFather()">发送给父组件数据</button> </div> </template> <script> import son from './son.vue' export default { name:'FatherOne', inheritAttrs: false, // props:['info'], mounted() { console.log(this.$attrs) // console.log(this.$listeners)         }, 组件不适用props接收,则$attrs接收到全部参数 a 如果使用props接收全部或者某个,则$attrs就会排除接收的后参数, export default { name:'FatherOne', inheritAttrs: false, props:['info'], mounted() { console.log(this.$attrs) // console.log(this.$listeners)         }, a 如果要继续进行孙组件等等,则需要继续传递$attrs, <son v-bind="$attrs" v-on="$listeners" ></son> 接收原理一样 <template> <div> <p>Son组件组件</p> <button @click="sendAnce()">发送给祖组件数据</button> </div> </template> <script> export default{ name:'SonTwo', data(){ return{             }         }, props:{ info:{ default:()=>({})             }, info2:{ default:()=>({})             }         }, watch:{ info:{ handler(val){ console.log("监听info的值") console.log(val)                 }, deep:true, immediate:true             }, info2:{ handler(val){ console.log("监听info2的值") console.log(val)                 }, deep:true, immediate:true             }         }, 孙组件可采用props接收或者赋值使用 $listeners 官方的描述是事件监听器,主要采用v-on="$listeners",传入内部组件, 个人的理解,类似于中间件,把父级的方法传递给子孙组件使用,由他们进行一个触发,把参数通过函数调用或者$emit方式调用把数据传回给父组件 <father :info=info :info2=info2 v-on:eventOne="methodOne" @senddata="getSenddata" ></father> 最外层组件传递两个方法,on:eventOne和senddata mounted() { // console.log(this.$attrs) console.log(this.$listeners)         }, a 父组件接收到传递过来的方法 <template> <div> <p>Father组件</p> <son v-bind="$attrs" v-on="$listeners" ></son> <button @click="sendFather()">发送给父组件数据</button> </div> </template> <script> import son from './son.vue' export default { name:'FatherOne', inheritAttrs: true, mounted() { // console.log(this.$attrs) console.log(this.$listeners)         }, components:{ son         }, methods:{ sendFather(){ this.$listeners.eventOne('123') this.$emit('eventOne',123) this.$emit("senddata",456)             },         },     } </script> <style> </style> 可以通过两种种方式实现给外层组件传参 第一种直接调用方法 第二种通过$emit方式 如果还需要继续深层次传递外层的方法 则需要继续传递v-on="$listeners",如果当前组件继续添加事件,则会合并外层一起传递给子组件, 这里个人觉得不是笼统传递不便于区分,建议以对象方式区分外层,父组件方法,就看官方后期了 <son v-bind="$attrs" v-on="$listeners" v-on:eventThree="methodThree" ></son> 那么孙组件也可以相同方式给外层组件传参或者方法调用 a 就会收到合并后的一个事件监听器,则可采取同样模式进行传递给父,祖数据 总的来说 v-on="$listeners"将所有方法又绑定到组件相应标签 ,是绑定方法(.native除外) v-bind="$attrs" 将所有非props属性绑定到相应标签 ,是绑定属性(.class和style除外) vue3版本 移除了$listeners,合并到$attrs中,那么,属性和方法统一合并到$attrs
hpVue2022-08-10

JS中常见对象合并方式
在实际来发中,经常会处理到对象类型,今天我们就整理一下,常见的几种对象合并方式 第一种采用Object.assgin()方法 <script> /*JS中对象的合并方式*/ let obj={ name:'张三' } let obj1={ age:1 } let obj3=Object.assign(obj,obj1) console.log(obj3) </script> a 第二种方式采用es6的拓展运算符(...) let obj3={...obj,...obj1} a 第三种方式采用原始的递归赋值方法,就是循环 let obj3=obj for(let key in obj1){ if(obj1.hasOwnProperty(key)){ obj[key]=obj1[key] } } console.log(obj3) 第四种方式我们借用jquery库里面封装好的方法extend $(function(){ let obj3=$.extend(obj,obj1) let obj4=$.extend(true,obj,obj1) console.log(obj3)//浅拷贝 console.log(obj4)//深拷贝 }) 注意所有合并的新对象都是浅拷贝,如果修改了某个属性值,都会同步到其他属性上!!!
hpJavascript2022-08-14

JS中数组的合并方式
在实际来发中,经常会对数组进行操作,今天,整理一下数组合并的几种方式 第一种es6的扩展运算符(...) <script> /* JS中数组的合并方式 */ let arr=[1,2,3] let arr2=[4,5,6] let arr3=[...arr,...arr2] console.log(arr3) </script> 第二种方式采用concat进行数组的连接 let arr3=arr.concat(arr2) 第三种方式 采用for循环push for(let i of arr2){ arr.push(i) } console.log(arr) 第四种方式apply ()方法,有两个参数,第一个参数是上下文环境的对象,第二个参数是函数列表,支持数组形式传递,然后再把参数一个个push进行 arr.push.apply(arr,arr2)
hpJavascript2022-08-14

加载更多

常用网站推荐 查看更多→

每日一句

时钟倒计时

今日已过去0%

本周已过去0%

本月已过去0%

今年已过去0%

推荐合集 查看更多→

最近更新

站长推荐

热门标签