• 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#依赖注入

  • 相关阅读:
    学习笔记之05-printf和scanf函数
    学习笔记之04-函数
    学习笔记之03-第一个C程序代码分析
    学习笔记之02-第一个C程序
    学习笔记之01-C语言概述
    Internal Server Error with LAMP
    Git学习总结
    Git-多人协作
    素数之和
    数列之和
  • 原文地址:https://www.cnblogs.com/baozhan/p/9950148.html
Copyright © 2020-2023  润新知