详解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 相关文章推荐
非主流的textarea自增长实现js代码
Dec 20 Javascript
javascript针对DOM的应用分析(二)
Apr 15 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 Javascript
JS实现的简单表单验证功能完整实例
Oct 14 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
JavaScript变量提升和严格模式实例分析
Jan 27 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
Vue修改项目启动端口号方法
Nov 07 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
Jun 19 Javascript
解决echarts数据二次渲染不成功的问题
Jul 20 Javascript
微信小程序实现拍照和相册选取图片
May 09 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输出Excel文件类
2010/02/08 PHP
php中文验证码实现方法
2015/06/18 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
nodejs基础知识
2017/02/03 NodeJs
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
办公室文员自荐书
2014/02/03 职场文书
股份合作协议书
2014/04/12 职场文书
社团活动总结范文
2014/04/26 职场文书
水利水电专业自荐信
2014/07/08 职场文书
留学推荐信中文范文
2015/03/26 职场文书
校车安全管理责任书
2015/05/11 职场文书
初中政治教学工作总结
2015/08/13 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
JS实现简单九宫格抽奖
2022/06/28 Javascript