一个好的前端开发人员必须掌握的前端代码整洁与开发技巧5

简介: 一个好的前端开发人员必须掌握的前端代码整洁与开发技巧

2.3 css开发技巧

2.3.1 巧妙使用伪类生成表单必填标识

::befor {
  content:  "*";
  color: red;
  margin-right: 4px;
}

示例:(element ui里面的表单项必填标识)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGYZMG1q-1682384948779)(前端代码整洁与开发技巧.assets/1673255318557.png)]

2.3.2 增强用户体验,使用伪元素实现增大点击热区

在移动端,按钮通常都很小,但是有时由于设计稿限制,我们不能直接去改变按钮元素的高宽。那么这个时候有什么办法在不改变按钮原本大小的情况下去增加他的点击热区呢?

这里,伪元素也是可以代表其宿主元素来响应的鼠标交互事件的。借助伪元素可以轻松帮我们实现,如:

.btn::befoer{  
  content: "";  
  position: absolute;  
  top: -10px;  
  right: -10px;  
  bottom: -10px;  
  left: -10px;
} 

2.3.3 利用伪类实现鼠标移入时下划线向两边展开的效果

<html lang="en"> 
<head>
    <meta charset="UTF-8">
    <title>鼠标移入下划线展开</title>
    <style type="text/css">
        #underline{
            width: 200px;
            height: 50px;
            background: #ddd;
            margin: 20px;
            position: relative;
        }
        #underline:after{
            content: "";
            width: 0;
            height: 5px;
            background: blue;
            position: absolute;
            top: 100%;
            left: 50%;
            transition: all .8s;
        }
        #underline:hover:after{
            left: 0%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="underline"></div>
</body>
</html> 

效果展示:

1、在浏览器上随便找个网页打开f12;

2、点击元素栏选中html跟标签右键以html格式修改;

3、复制上述代码覆盖掉网页上的html代码完成修改;

4、鼠标移入显示元素即可看到效果。

三、其它技巧

3.1.1 适时使用provide和inject

provide 和 inject 主要为高阶插件/组件库提供用例,并不推荐直接用于应用程序代码中;并且这对选项需要一起使用以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,在上下游关系成立的时间里始终生效。

  • provide:Object | () => Object
  • inject:Array | { [key: string]: string | Symbol | Object }
//父组件:
provide: { // provide 提供一个属性和方法
  foo: '这是 foo',
  fooMethod: () => {
    console.log('父组件 fooMethod 被调用')
  }
},
// 子或者孙子组件
inject: ['foo', 'fooMethod'], //数组或者对象,注入到子组件
mounted() {
  this.fooMethod()
  console.log(this.foo)
}
//在父组件下面所有的子组件都可以利用inject

provide 和 inject 绑定并不是可响应的。这是官方刻意为之的。

然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的,因为对象是引用类型

//父组件:
provide: { 
  foo: '这是 foo'
},
mounted(){
  this.foo = '这是新的 foo'
}
// 子或者孙子组件
inject: ['foo'], 
mounted() {
  console.log(this.foo) //子组件打印的还是'这是 foo'
}
//父组件:
provide() { 
    return {
    foo: this.foo,
        nameList: this.nameList,
        personalInfo: this.personalInfo
    }
},
data() {
    return {
        foo: '这是foo',
        nameList: ['张三', '李四'],
        personalInfo: { age: 18 }
    }
},
mounted(){
    this.foo = '这是新的 foo'
    this.nameList.push('王五') // 改变堆内存中的值
    // this.nameList = ['王五', '赵六'] // 放开后子组件仍打印 ['张三', '李四', '王五'],
    this.personalInfo.age = 16 // 改变堆内存中的值
    this.personalInfo = {age: 12} // 将当前对象的指针指向新的堆内存地址
}
// 子或者孙子组件
<template>
  <div>{{foo}}</div>
  <div>{{nameList}}</div>
    <div>{{personalInfo && personalInfo.age}}</div>
</template>
<script>
    export default{
        inject: ['foo', 'nameList', 'personalInfo'], 
        mounted() {
            setTimeout(() => {
                console.log(this.foo) // 这是foo -视图不会更新
                console.log(this.nameList) // ['张三', '李四', '王五'] -视图会更新
                console.log(this.personalInfo.age) // 16 foo -视图会更新
            }, 1000)
        }
    }
</script>

3.1.2 利用key值解决vue就地复用策略的问题

已知:throttle是封装过的节流指令,在规定时间仅第一次执行,后续点击不再执行,目前设置的时间是2秒,即每2秒内的重复点击只执行第一次。

// 节流指令
Vue.directive('throttle', {
    inserted: (el, binding) => {
        const throttleTime = binding.value || 2000 // 节流时间
        el.addEventListener('click', event => {
            if (el.nodeName === 'BUTTON' || el.type === 'button') {
                if (!el.disabled) {
                    el.disabled = true
                    setTimeout(() => {
                        el.disabled = false
                    }, throttleTime)
                }
            } else {
                // 合理使用样式穿透使元素本身及其子元素鼠标事件失效       
                el.style.pointerEvents = 'none'
                el.style.color = 'red'
                el.setAttribute('data-flag', '0') // 只是为了打印
                setTimeout(() => {
                    if (el && el.style) {
                        el.style.pointerEvents = 'auto'
                        el.style.color = '#000'
                        el.setAttribute('data-flag', '1')  // 只是为了打印
                    }
                }, throttleTime)
            }
        }, false)
    }
})

通过以下代码可以发现点击完接受工作票按钮后不到2秒的时间内由于vue的就地复用策略导致工作许可按钮复用了原来的元素,继承了之前的样式和自定义属性,从而导致工作许可按钮在上述2s内的点击不会生效,且颜色也发生了短暂的改变。(利用项目加浏览器调试来演示说明)

<template>
    <view>
      <!-- 待接收 -->
      <button v-if="stateNo == '10'" class="btn-test" @click="ticketReceive"  
            v-throttle>接收工作票</button>
      <!-- 待许可 -->
      <button v-if="stateNo == '12'"  class="btn-test"  @click="permitTicket"  
            v-throttle>工作许可</button>      
    </view>
</template>
<script>
export default{
    data() {
        return {
           stateNo: '10'
        }
    },
  methods: {
        // 接收工作票
        ticketReceive($event) {
    console.log('$event', $event)
    this.stateNo = '12'
    this.$nextTick(() => {
    console.log('视图已完成更新', '工作许可按钮已显示')
    setTimeout(() => {
                    let dom = document.querySelector('.btn-test')
      console.log('data-flag', dom.getAttribute('data-flag')) // 0
    }, 1000)
    setTimeout(() => {
      let dom = document.querySelector('.btn-test')
      console.log('data-flag', dom.getAttribute('data-flag')) // 1
    }, 2600)
    })
  },
  permitTicket() {
    console.log('点击了工作许可')
  },
    }  
}
</script>

解决办法:给两个使用v-if的标签添加不同的key值,如:

<template>
    <view>
      <!-- 待接受 -->
      <button v-if="stateNo == '10'" class="btn-test" @click="ticketReceive"  
            v-throttle key="1">接受工作票</button>
      <!-- 待许可 -->
      <button v-if="stateNo == '12'"  class="btn-test"  @click="permitTicket"  
            v-throttle  key="2">工作许可</button>      
    </view>
</template>
‘0’) // 只是为了打印
setTimeout(() => {
if (el && el.style) {
el.style.pointerEvents = ‘auto’
el.style.color = ‘#000’
el.setAttribute(‘data-flag’, ‘1’) // 只是为了打印
}
}, throttleTime)
}
}, false)
}
})

通过以下代码可以发现点击完接受工作票按钮后不到2秒的时间内由于vue的就地复用策略导致工作许可按钮复用了原来的元素,继承了之前的样式和自定义属性,从而导致工作许可按钮在上述2s内的点击不会生效,且颜色也发生了短暂的改变。(利用项目加浏览器调试来演示说明)

```jsx
<template>
    <view>
      <!-- 待接收 -->
      <button v-if="stateNo == '10'" class="btn-test" @click="ticketReceive"  
            v-throttle>接收工作票</button>
      <!-- 待许可 -->
      <button v-if="stateNo == '12'"  class="btn-test"  @click="permitTicket"  
            v-throttle>工作许可</button>      
    </view>
</template>
<script>
export default{
    data() {
        return {
           stateNo: '10'
        }
    },
  methods: {
        // 接收工作票
        ticketReceive($event) {
    console.log('$event', $event)
    this.stateNo = '12'
    this.$nextTick(() => {
    console.log('视图已完成更新', '工作许可按钮已显示')
    setTimeout(() => {
                    let dom = document.querySelector('.btn-test')
      console.log('data-flag', dom.getAttribute('data-flag')) // 0
    }, 1000)
    setTimeout(() => {
      let dom = document.querySelector('.btn-test')
      console.log('data-flag', dom.getAttribute('data-flag')) // 1
    }, 2600)
    })
  },
  permitTicket() {
    console.log('点击了工作许可')
  },
    }  
}
</script>

解决办法:给两个使用v-if的标签添加不同的key值,如:

<template>
    <view>
      <!-- 待接受 -->
      <button v-if="stateNo == '10'" class="btn-test" @click="ticketReceive"  
            v-throttle key="1">接受工作票</button>
      <!-- 待许可 -->
      <button v-if="stateNo == '12'"  class="btn-test"  @click="permitTicket"  
            v-throttle  key="2">工作许可</button>      
    </view>
</template>
目录
相关文章
|
8月前
|
JSON 监控 前端开发
AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
AMIS(前端低代码框架)是百度开源的低代码前端框架,基于纯 JSON 配置即可生成完整后台页面,包括表单、表格、图表、CRUD 列表,支持可视化拖拽编辑。,星标数已达 18.4k,百度内部已沉淀超过 5 万个页面,广泛应用于审核系统、数据管理后台、模型监控等落地场景
1427 0
|
7月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
895 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
人工智能 自然语言处理 前端开发
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
DeepSite是基于DeepSeek-V3模型的在线开发工具,无需配置环境即可通过自然语言描述快速生成游戏、网页和应用代码,并支持实时预览效果,显著降低开发门槛。
1861 93
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
676 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
11月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
579 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
12月前
|
前端开发 JavaScript 安全
|
11月前
|
自然语言处理 前端开发 IDE
用通义灵码全新智能体+MCP实现从设计稿到前端代码,个人免费用
通义灵码全新升级,发布国内首个支持“自主决策+工具链闭环”的编程智能体,面向个人免费!新增功能包括智能体模式、混合推理模型Qwen3支持、全面集成MCP中文社区(涵盖2400+服务)及长期记忆能力。用户可通过IDE插件使用,兼容主流开发环境如JetBrains、VS Code和Visual Studio。教程展示如何将MasterGo设计稿转化为前端代码,简化开发流程。探索链接:[通义灵码官网](https://lingma.aliyun.com/)。
|
JSON 前端开发 数据可视化
前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学。Layui 是一款开源前端 UI 组件库,具有极简设计、强大功能和卓越性能,支持布局、表单、表格、弹层等六大模块,组件高度可定制。它无需复杂构建工具,直接面向浏览器开发,极大提升开发效率与界面美观度。适合新手和老手,快来试试吧!
729 0
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1434 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
725 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    995
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    424
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    333
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    317
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    430
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    609
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    811
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    222
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    663
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    388