如何查看 el-form-item 的prop属性_Vue开发技巧:状态共享,列表优化,插槽,多属性传递,hook监听...

状态共享

随着组件的细化,就会遇到多组件状态共享的情况, Vuex可以解决这类问题,不过如果应用不够大,最好不要使用它,今天介绍的是 vue.js 2.6 新增加的 Observable,应对一些简单的跨组件数据状态共享的情况。

如,我们将在组件外创建一个 store,然后在 App.vue 组件里面引入 store.js 提供的 store 和 mutation方法,同理其它组件也可以这样使用,从而实现多个组件共享数据状态。

首先创建一个 store.js,包含一个 store和一个 mutations,分别用来指向数据和处理方法。

67a4c91368a10e466342b5d250d42d46.png

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

df1683560733e47ca3344dbbc43d65f9.png

长列表性能优化

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

3e0185a746c305c3e3273eb25e1dc071.png

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

1eba7bd3db008a314dbb9ed8fb81c473.png

作用域插槽

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

比如,我们定一个名为 current-user的组件:

9753e9cd5fc250c4fb39b071547cfb75.png

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

dafe9816c056863d4666bc100b2e908a.png

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

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

0022b4d1b3f26f284466da4197ccc4f1.png

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

1e54ada1fa20bc4769e37f50f5703f11.png

这种方式还有缩写语法,可以查看独占默认插槽的缩写语法,简写如下:

999426006d3a1f4d7206f94cab761a99.png

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

属性事件传递

写过高阶组件的童鞋可能都会碰到过将加工过的属性向下传递的情况,如果碰到属性较多时,需要一个个去传递,非常不友好并且费时,有没有一次性传递的呢?答案就是 v-bind和 v-on。

举个例子,假如有一个基础组件 BaseList,只有基础的列表展示功能,现在我们想在这基础上增加排序功能,这个时候我们就可以创建一个高阶组件 SortList。

490539cd88106af8d84c2746c6c3b9e5.png

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

监听组件的生命周期

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

ad770a20134dfd53bbf6d63ca6b7b392.png

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

74098c3a89883e619a0a6e462aa591b9.png

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

参考:https://mp.weixin.qq.com/s/xEUNXwf05Rt3Eg7aWxxNqA


版权声明:本文为weixin_27869497原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。