详解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学习笔记之jQuery的事件
Dec 22 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
Dec 18 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
Nov 24 Javascript
js实现的页面矩阵图形变换特效
Jan 26 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
May 16 Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 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
2021年最新CPU天梯图
2021/03/04 数码科技
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
在Python中使用next()方法操作文件的教程
2015/05/24 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Numpy之文件存取的示例代码
2018/08/03 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
python中threading开启关闭线程操作
2020/05/02 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
仓库管理专业个人自我评价范文
2013/11/11 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
认识深刻的检讨书
2014/02/16 职场文书
家长对孩子的寄语
2015/02/26 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫