• Vue实战指南之依赖注入(provide / inject)


    案例

    UI美眉说咱家的选项菜单太丑了,小哥哥能不能美化一下呀,洒家自然是说小意思啦~
    自定义一个select组件,so easy~

    简单粗暴型:

    <el-select v-model="favourite" :option="[]"></el-select>
    

    option作为数据进来就ok啦。

    然后发现下列问题:

    • key-value,不是所有的接口都是id-name
    • optiondisabled 怎么办?
    • 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的实现:

    • provideObject | () => Object
    • injectArray<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 是解决组件之间的通信问题的利器,不受层级结构的限制。
    但也不是随便去滥用,通信代表着耦合:

    provideinject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。
    官方文档:
    https://cn.vuejs.org/v2/api/#provide-inject
    https://cn.vuejs.org/v2/guide/components-edge-cases.html#依赖注入

  • 相关阅读:
    centOS7 完整克隆后网络配置
    索引角度理解innodb/myisam原理
    JUC 7大并发容器原理详解、及使用场景
    MySQL索引列没有走索引?
    Java 各种并发锁 从 synchronized 到 CAS 和 AQS
    JDK1.8 HashMap两种扩容的情况和转红黑树
    开发自己的网上支付案例代码(易宝支付php)
    redis学习基础(二)
    redis使用基础(一)
    直角三角形打印
  • 原文地址:https://www.cnblogs.com/baozhan/p/9950148.html
Copyright © 2020-2023  润新知