作为深度代码洁癖,我们都希望能写出简单高效的代码,让我们的代码看起来更加优雅,让我们抛弃繁杂的代码,一起开启简单的旅程~~

slots 新语法向 3.0 看齐

❝使用带有“#”的新命名插槽缩写语法,在Vue 2.6.0+中可用

举个例子:

构建插槽时,最好规划一下布局。这就是我的文章布局。

构建插槽与构建组件没有什么不同。本质上,插槽是具有超强功能的组件,让我们细分一下上面的布局,组件的外观如下:

<!-- TidbitPage.vue -->
<template><article-layout><template #articleHeader><h1>I am the header</h1></template><template #articleContent><p>I am the content</p></template><template #articleFooter><footer>I am the footer</footer></template><template #side><aside>I am the side stuff</aside></template><template #banner><div>I am the banner</div></template></article-layout>
<template>

动态指令参数

❝指令参数现在可以接受动态JavaScript表达式 动态参数值应该是字符串,但允许 null作为一个明确指示应该删除绑定的特殊值,那将会很方便。任何其他非字符串值都可能出错,并会触发警告。(仅适用于 v-bind和v-on

<div v-bind:[attr]="attributeName"></div>
//简写
<div :[attr]="attributeName"></div>

这里的 attributeName 会被作为一个JavaScript表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 href,那么这个绑定将等价于 v-bind:href

同样地,你可以使用动态参数为一个动态的事件名绑定处理函数:

<button v-on:[eventName]="handler"></button>
//简写
<button @[eventName]="handler"></button>

eventName 的值为 focus 时,v-on:[eventName] 将等价于 v-on:focus

同样可以适用于插槽绑定:

<my-component>
<template v-slot:[slotName]>
Dynamic slot name
</template>
</my-component>
//简写
<foo>
<template #[name]>
Default slot
</template>
</foo>

动态参数预期会求出一个字符串,异常情况下值为 null。这个特殊的 null 值可以被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。

<!-- 这会触发一个编译警告 且 无效 -->
<a v-bind:['foo' + bar]="value"> ... </a>

变通的办法是使用没有空格或引号的表达式,或用计算属性替代这种复杂表达式。

@ hook那些事

处理组件内定时器的步骤。通常我们一般是这样操作的:

<script>export default {mounted() {this.timer = setInterval(() => { ... }, 1000);},beforeDestroy() {clearInterval(this.timer);}};
</script>

但是其实更好的做法是:

<script>export default {mounted() {const timer = setInterval(() => { ... }, 1000);this.$once('hook:beforeDestroy', () => clearInterval(timer);)}};
</script>

设想一个场景 如果我们需要在数据渲染到页面的之前让页面loadingmounted之后停止loadingbeforeUpdata时开始loadingupdatad之后停止loading

最简单的方法就是改写组件的生命周期函数,使其在mounted/beforeUpdata /updatad时通知父组件显示或者隐藏 loading。

这样做显示不好,因为侵入了自组件的逻辑,增加的逻辑也和组件本身的功能好不关联。最好的办法就是使用v-on="hook:xxx"的方式:

<v-chart@hook:mounted="loading = false"@hook:beforeUpdated="loading = true"@hook:updated="loading = false":data="data"
/>

这样,就实现了对子组件生命周期的监听。对任意的组件都有效果,包括引入的第三方组件。】

vue中的$props$attrs$listeners(可用来二次封装组件)

$props:当前组件接收到的 props 对象。Vue 实例代理了对其 props 对象属性的访问。

假如有个input输入框。我们有很多的原生属性,比如:name、placeholder、disabled等等。我们如果都定义在props显示接收,未免太过繁琐。所以官网出现了:v-bind="$props"这样的操作。 如果父组件传递很多的原生属性,那么我们在子组件中直接可以:

//good
<input v-bind="$props">//bad
//而不是下面这样,如果很多的属性就特别繁琐
<input :name="name" :placeholder="placeholder" :disabled="disabled">

我们可以利用以下方式 $attrs 将原生属性直接传递给子组件,这是Vue在2.4.0新增的属性,包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。

<inputv-bind="$attrs":value="value"@focus=$emit('focus', $event)"@input="$emit('input', $event.target.value)"
>

$listeners:包含了父作用域中的 (不含 .native修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

如果子组件不在父组件的根目录下,则可以将所有事件侦听器从父组件传递到子组件,如下所示:

<template>
<div>...
<childComponent v-on="$listeners" />...
</div>
</template>

响应式数据(2.6.0新增)

我们习惯于用Vuex去解决状态的共享问题,但是在小项目中使用就会有增大代码体积和将代码复杂化的烦恼,所以在后来的版本中Vue新增

Vue.observable( object )让一个对象可响应,Vue 内部会用它来处理 data 函数返回的对象。

返回的对象可以直接用于渲染函数和 计算属性 内,并且会在发生改变时触发相应的更新。也可以作为最小化的跨组件状态存储器,用于简单的场景:

官方示例:

const state = Vue.observable({ count: 0 })const Demo = {render(h) {return h('button', {on: { click: () => { state.count++ }}}, `count is: ${state.count}`)}
}

jsx模板组件

以下面的一组状态判断按钮为例,我们很容易就下意识地在模板内写下这种代码

<button v-if="status === 1" class="btn1" :class="status === 1" @click="">未开始</button>
<button v-if="status === 2" class="btn2" :class="status === 2" @click="">进行中</button>
<button v-if="status === 3" class="btn3" :class="status === 3" @click="">可领取</button>
<button v-if="status === 4" class="btn4" :class="status === 4" @click="">已领取</button>

但是如果我们利用渲染函数可以将上面的代码抽取成优雅的使用组件

<!DOCTYPE html>
<html lang="en"><body><div id="app"><child :status="status"></child></div><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script>Vue.component('child', {props: {status: {type: Number,required: true}},render(createElement) {const innerHTML = ['未开始', '进行中', '可领取', '已领取'][this.status]return createElement('button', {class: {active: this.status},attrs: {id: 'btn'},domProps: {innerHTML},on: {click: () => console.log(this.status)}})}})var app = new Vue({el: '#app',data: {status: 0}})</script>
</body></html>

我们将所有的逻辑封装进渲染函数内,外部只需要传递一个状态参数即可改变

<child :status="status"></child>

动态组件

❝通过 Vue 的 元素加一个特殊的 is attribute 可以实现动态组件的效果

如图,这是一个v-for渲染的列表(只是目前这个版块才刚开始做,目前只有一个),圆圈内的就是一个组件,也就是要v-for动态组件

实际使用

一开始就是基本的组件引入了

import ColorIn from '@/components/Magic/ColorIn.vue'
import LineIn from "@/components/Magic/LineIn.vue";
import Header from "@/components/Magic/Header.vue";
import Footer from "@/components/Magic/Footer.vue";export default{components:{ColorIn,LineIn,Header,Footer}
}

接下来就是动态v-for动态组件的使用,componentList:['ColorIn','LineIn','Header','Footer']使用下面的代码即可将代码依次循环

<component v-for="(item,index) in componentList" :key="index" :is="item"></component>

编译以后的效果就是

<ColorIn></ColorIn>
<LineIn></LineIn>
<Header></Header>
<Footer></Footer>

Vue.filter

❝ 简单介绍一下过滤器,顾名思义,过滤就是一个数据经过了这个过滤之后出来另一样东西,可以是从中取得你想要的,或者给那个数据添加点什么装饰,那么过滤器则是过滤的工具。例如,从['abc','abd','ade']数组中取得包含‘ab’的值,那么可通过过滤器筛选出来‘abc’和‘abd’;把‘Hello’变成‘Hello World’,那么可用过滤器给值‘Hello’后面添加上‘ World’;或者把时间节点改为时间戳等等都可以使用过滤器。

场景:时间戳转化成年月日这是一个公共方法,所以可以抽离成过滤器使用

// 使用
// 在双花括号中
{{ message | capitalize }}// 在 `v-bind` 中
<div v-bind:id="rawId | formatId"></div>// 全局注册
Vue.filter('stampToYYMMDD', (value) =>{// 处理逻辑
})// 局部注册
filters: {stampToYYMMDD: (value)=> {// 处理逻辑}
}// 多个过滤器全局注册
// /src/common/filters.js
let dateServer = value => value.replace(/(d{4})(d{2})(d{2})/g, '$1-$2-$3')
export { dateServer }
// /src/main.js
import * as custom from './common/filters/custom'
Object.keys(custom).forEach(key => Vue.filter(key, custom[key]))

.sync 语法糖

❝sync 就是为了实现prop 进行“双向绑定”仅此而已(父对子,子对父,来回传)

当你有需要在子组件修改父组件值的时候这个方法很好用,它的实现机制和v-model是一样的。

利用 object.freeze 提升性能

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。 freeze() 返回和传入的参数相同的对象。

比方我们需要渲染一个非常大的数组对象,例如用户列表,对象列表,文章列表等等。

export default {data: () => ({users: {}}),async created() {const users = await axios.get("/api/users");this.users = users;}
};

vue 会将 data 对象中的所有的属性加入到 vue 的响应式系统中,当这些属性的值发生改变时,视图将会产生 响应,若对象的体积比较大,会消耗很多浏览器解析时间。

所以我们可以通过减少数据的响应式转换来提供前端的性能。

export default {data: () => ({users: {}}),async created() {const users = await axios.get("/api/users");this.users = Object.freeze(users);}
};

web的前端:一篇总结得超全的前端进阶文章!入门、技巧、方法、书籍、网站...​zhuanlan.zhihu.com

作者:johnYu
链接: https:// juejin.im/post/68545732 15969181703
来源:掘金

js倒计时代码最简单的_10个简单的技巧让你的 vue.js 代码更优雅相关推荐

  1. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...

    原标题:涨姿势!这些小技巧让小白也可以写出更优雅的Python代码! 一.前言 我前两天回答了两个Python相关的问题,收到了很多赞,从答案被收藏的情况来看,确实对不少人都很有帮助,所以我也很开心. ...

  2. 3 个简单的技巧让你的 vue.js 代码更优雅!

    关注 逆锋起笔,回复"加群" 加入我们一起学习,天天进步 作者:红尘炼心 https://juejin.cn/post/7005751368937897991 前言 近来入坑了一个 ...

  3. vue.js 全局应用js_如何在不到7分钟的时间内测试您的Vue.js应用

    vue.js 全局应用js by Mukul Khanna 由Mukul Khanna 如何在不到7分钟的时间内测试您的Vue.js应用 (How you can test your Vue.js a ...

  4. vue.js java php_听说Java程序员喜欢AngularJS,PHP程序员喜欢Vue.js

    编程语言与框架或者库之间有联系是很正常的事情,如果合肥达内告诉你,使用某一种编程语言或技术的开发人员可能更喜欢某个框架,你会作何反应呢?Stack Overflow根据网站内最常访问的标签将开发人员分 ...

  5. 基于Vue.js的企业级前端代码架构设计设想

    在前端架构设计这块也已经工作了一段时间,也翻遍了很多书籍,但是就目前来说笔者还是没有看过真正把前端架构讲好的书,加上现在前端技术的发展诞生了许多新的框架,如:vue.react.angular,这也越 ...

  6. 手机锁屏js倒计时停止问题解决办法探索

    手机锁屏js倒计时停止问题解决办法探索 参考文章: (1)手机锁屏js倒计时停止问题解决办法探索 (2)https://www.cnblogs.com/wuyuchao/p/10086982.html ...

  7. Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节

    霍春阳(Hcy),Vue.js 官方团队成员.专注于 Web 研发领域,是 Vue.js 3 的核心贡献者之一,Vue.js 文档生成工具 Vuese 的作者,技术社区活跃者,曾撰写大量颇受好评的技术 ...

  8. Vue.js组件化开发实践

    Vue.js组件化开发实践 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一 ...

  9. mpvue 微信小程序_使用Vue.js开发微信小程序:开源框架mpvue解析

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 成全 责编 | 阿秃 转自 | 美团技术团队企业博客 前言 mpvue是一款使用Vue.js开发微信小程序的前端框架.使用此框架,开 ...

最新文章

  1. VIM 命令使用大全
  2. httpclient解析https网页
  3. 【转】刨根究底字符编码之七——ANSI编码与代码页
  4. DMA(2) S3C2410 DMA详解(其它的其实类似)
  5. python---(3)Python安装
  6. vac服务器未响应,win7玩csgo官方匹配提示vac无法验证您的游戏会话怎么办
  7. 微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)...
  8. java 001 002_java笔记0x002:操作符
  9. wso2 esb 配置mysql_WSO2企业服务总线(WSO2 ESB)介绍
  10. 索尼笔记本笔记本计算机在哪里设置,索尼vaio笔记本怎么进bios设置|索尼笔记本进bios按什么键...
  11. 王者荣耀英雄分析--孙悟空
  12. 数据库课程设计-宿舍管理系统
  13. 3GPP TS 23501-g51 中英文对照 | 5.2.5 Access control and barring
  14. Android HttpURLConnection下载网络图片,设置系统壁纸
  15. 东周科目三考场5号线_深圳东周科目三考场路线及注意事项
  16. xp 恢复 简体中文 美式键盘
  17. 字典 dictionary
  18. 华为认证常见技术问答整理:什么是Datacom认证?
  19. C++语言程序设计(第四版)清华大学 郑莉 实验6实习报告
  20. 《Web前端工程师修炼之道(原书第4版)》——Web设计师是做什么的

热门文章

  1. 性价比高的学生用台灯哪款好?推荐最适合学生用的台灯
  2. Python爬虫教程-总纲
  3. 网易就“患病职工离职”事件致歉:相关人员简单粗暴不近人情
  4. 详解iptables防火墙
  5. Excel Sheet Column Title -- leetcode
  6. Dubbo源码解析 —— Zookeeper 订阅
  7. Linux - 第16节 - 网络基础(应用层二)
  8. PHP识别二维码技术(php-zbarcode)
  9. 《工程伦理》网课第十一章课后习题答案
  10. 第25节 IPsec虚拟专网工作原理与配置详解