详解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 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
在IE下获取object(ActiveX)的Param的代码
Sep 15 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
AngularJS 执行流程详细介绍
Aug 18 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 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 一元分词算法
2009/11/30 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
python3正则模块re的使用方法详解
2020/02/11 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
Android面试题及答案
2015/09/04 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
土建施工员岗位职责
2015/04/11 职场文书
入党介绍人考察意见
2015/06/01 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL