详解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 相关文章推荐
避免回车键导致的页面无意义刷新的解决方法
Apr 12 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
老生常谈原生JS执行环境与作用域
Nov 22 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
js获取form表单中name属性的值
Feb 27 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
vue 数据双向绑定的实现方法
Mar 04 Vue.js
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中文本操作的类
2007/03/17 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
对python中的for循环和range内置函数详解
2018/04/17 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
《秋思》教学反思
2016/02/23 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers