博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7个有用的Vue开发技巧
阅读量:4117 次
发布时间:2019-05-25

本文共 2812 字,大约阅读时间需要 9 分钟。

来源 | https://juejin.im/post/5ce3b519f265da1bb31c0d5f

1、 状态共享

随着组件的细化,就会遇到多组件状态共享的情况,
Vuex 当然可以解决这类问题,不过就像
Vuex 官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是vue.js 2.6新增加的 Observable API ,通过使用这个api我们可以应对一些简单的跨组件数据状态共享的情况。
如下这个例子,我们将在组件外创建一个
store ,然后在
App.vue 组件里面使用store.js提供的
store
mutation 方法,同理其它组件也可以这样使用,从而实现多个组件共享数据状态。
首先创建一个store.js,包含一个
store 和一个
mutations ,分别用来指向数据和处理方法。
 
 
 

然后在App.vue里面引入这个store.js,在组件里面使用引入的数据和方法

 

2 、长列表性能优化

我们应该都知道vue会通过object.defineProperty对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们就不需要vue来劫持我们的数据,在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止vue劫持我们的数据呢?可以通过object.freeze方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了。

 
 
 

另外需要说明的是,这里只是冻结了users的值,引用不会被冻结,当我们需要reactive数据的时候,我们可以重新给users赋值。

 
export default {	data: () => ({	users: []	  }),	async created() {	const users = await axios.get("/api/users");	this.users = Object.freeze(users);	  },	methods:{	// 改变值不会触发视图响应	this.users[0] = newValue	// 改变引用依然会触发视图响应	this.users = newArray	  }	};

3 、去除多余的样式

随着项目越来越大,书写的不注意,不自然的就会产生一些多余的css,小项目还好,一旦项目大了以后,多余的css会越来越多,导致包越来越大,从而影响项目运行性能,所以有必要在正式环境去除掉这些多余的css,这里推荐一个库purgecss,支持CLI、JavascriptApi、Webpack等多种方式使用,通过这个库,我们可以很容易的去除掉多余的css。

我做了一个测试,在线DEMO(https://link.juejin.im/?target=https%3A%2F%2Fcodesandbox.io%2Fs%2Fzkq258ly4)

 
 
 
body {	font-family: sans-serif;	}	a {	color: red;	}	ul {	li {	list-style: none;	}	}
 
 
 

最终产生的purgecssResult结果如下,可以看到多余的aul标签的样式都没了

640?wx_fmt=other

4 、作用域插槽

利用好作用域插槽可以做一些很有意思的事情,比如定义一个基础布局组件A,只负责布局,不管数据逻辑,然后另外定义一个组件B负责数据处理,布局组件A需要数据的时候就去B里面去取。
假设,某一天我们的布局变了,我们只需要去修改组件A就行,而不用去修改组件B,从而就能充分复用组件B的数据处理逻辑,关于这块我之前写过一篇实际案例,可以点击这里查看。
这里涉及到的一个最重要的点就是父组件要去获取子组件里面的数据,之前是利用
slot-scope ,自vue 2.6.0起,提供了更好的支持
slot
slot-scope 特性的 API 替代方案。
比如,我们定一个名为
current-user 的组件:
 
 

父组件引用current-user的组件,但想用名替代姓(老外名字第一个单词是名,后一个单词是姓):

{
{ user.firstName }}

这种方式不会生效,因为user对象是子组件的数据,在父组件里面我们获取不到,这个时候我们就可以通过v-slot来实现。

首先在子组件里面,将user作为一个<slot>元素的特性绑定上去:

 
	
{
{ user.lastName }}

之后,我们就可以在父组件引用的时候,给v-slot带一个值来定义我们提供的插槽 prop 的名字:

 
 
 

这种方式还有缩写语法,可以查看独占默认插槽的缩写语法,最终我们引用的方式如下:

 
 

相比之前slot-scope代码更清晰,更好理解。

5、 属性事件传递

写过高阶组件的童鞋可能都会碰到过将加工过的属性向下传递的情况,如果碰到属性较多时,需要一个个去传递,非常不友好并且费时,有没有一次性传递的呢(比如react里面的
{...this.props} )? 答案就是
v-bind
v-on
举个例子,假如有一个基础组件
BaseList ,只有基础的列表展示功能,现在我们想在这基础上增加排序功能,这个时候我们就可以创建一个高阶组件。
SortList。

可以看到传递属性和事件的方便性,而不用一个个去传递

6 、函数式组件

函数式组件,即无状态,无法实例化,内部没有任何生命周期处理方法,非常轻量,因而渲染性能高,特别适合用来只依赖外部数据传递而变化的组件。

写法如下:

  1. template标签里面标明functional

  2. 只接受props

  3. 不需要script标签

 
 

7 、监听组件的生命周期

比如有父组件Parent和子组件Child,如果父组件监听到子组件挂载mounted就做一些逻辑处理,常规的写法可能如下:

 
 
 

这里提供一种特别简单的方式,子组件不需要任何处理,只需要在父组件引用的时候通过@hook来监听即可,代码重写如下:

 
 

当然这里不仅仅是可以监听mounted,其它的生命周期事件,例如:createdupdated等都可以,是不是特别方便~

640?wx_fmt=jpeg

转载地址:http://ikfpi.baihongyu.com/

你可能感兴趣的文章
MySQL主从复制不一致的原因以及解决方法
查看>>
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>
OKhttp之Call接口
查看>>
application/x-www-form-urlencoded、multipart/form-data、text/plain
查看>>
关于Content-Length
查看>>
WebRequest post读取源码
查看>>
使用TcpClient可避免HttpWebRequest的常见错误
查看>>
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>
Container With Most Water --装最多水的容器(重)
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>