详解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 相关文章推荐
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
jQuery中:checked选择器用法实例
Jan 04 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
JavaScript核心语法总结(推荐)
Jun 02 Javascript
AngularGauge 属性解析详解
Sep 06 Javascript
vue2的todolist入门小项目的详细解析
May 11 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
Django使用多数据库的方法
Sep 06 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
JS实现简单九宫格抽奖
Jun 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中的Base62类(适用于数值转字符串)
2013/08/12 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
Angular5.1新功能分享
2017/12/21 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
jquery分页插件pagination使用教程
2018/10/23 jQuery
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
本科毕业生的求职信范文
2013/11/20 职场文书
市场策划求职信
2014/08/07 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
python中urllib包的网络请求教程
2022/04/19 Python
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS