详解Vue实战指南之依赖注入(provide/inject)


Posted in Javascript onNovember 13, 2018

案例

UI美眉说咱家的选项菜单太丑了,小哥哥能不能美化一下呀,洒家自然是说小意思啦~

自定义一个select组件,so easy~

简单粗暴型:

<el-select v-model="favourite" :option="[]"></el-select>

option作为数据进来就ok啦。

然后发现下列问题:

  • key-value,不是所有的接口都是id-name
  • option要disabled 怎么办?
  • option存在几种情况怎么办?
  • ...

回头看看原生的写法是这样:

<select v-model="favourite">
 <option value="1">Vue</option>
 <option value="2">React</option>
 <option value="3">Angular</option>
</select>

还要加个el-option组件,灵活自由型:

<el-select v-model="favourite">
 <el-option value="1">Vue</el-option>
 <el-option value="2">React</el-option>
 <el-option value="3">Angular</el-option>
</el-select>

好啦,这样设计就能完美解决之前的几个问题。

接着要解决选择了某一个el-option,怎么告诉el-select,$parent是一种选择,那么el-select当前的值又怎么告诉el-option你被选中了呢~ 笔者没有继续去深究,因为看到了APIprovide/inject

官方说明:

允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深(这也是使用$parent不好实现的地方),并在起上下游关系成立的时间里始终生效。
不论组件层次有多深,这个简直太爽了,不用再关心dom层级,只要在祖先组件内部就可以一直使用祖先组件提供的provide

用法

下面贴出一部分select的实现:

  • provide:Object | () => Object
  • inject:Array<string> | { [key: string]: string | Symbol | Object }

el-select

export default {
 name: "el-select",
 provide() {
 return {
 select: this
 };
 }
}

el-option

export default {
 name:'el-option',
 inject:['select'],
 created(){
 if(this.select.value===this.value){
 this.select.label=this.label;
 }
 }
}

总结

provide/inject 是解决组件之间的通信问题的利器,不受层级结构的限制。

但也不是随便去滥用,通信代表着耦合:

provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。

官方文档:

https://cn.vuejs.org/v2/api/#provide-inject
https://cn.vuejs.org/v2/guide/components-edge-cases.html#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS的数组的扩展实例代码
Jul 09 Javascript
用js做一个小游戏平台 (一)
Dec 29 Javascript
JS中动态添加事件(绑定事件)的代码
Jan 09 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
Aug 01 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
微信小程序实现评论功能
Nov 28 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 #Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 #Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 #Javascript
Vue实现一个无限加载列表功能
Nov 13 #Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 #Javascript
vue中slot(插槽)的介绍与使用
Nov 12 #Javascript
vuex的module模块用法示例
Nov 12 #Javascript
You might like
php正则校验用户名介绍
2008/07/19 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP会话处理的10个函数
2015/08/11 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
将python图片转为二进制文本的实例
2019/01/24 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
个人求职简历的自我评价范文
2013/10/09 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
MySQL transaction事务安全示例讲解
2022/06/21 MySQL